#pragma once #include "../shader_backend.h" #ifdef __APPLE__ #import #import namespace Rendering { /** * @brief Backend de shaders usando Metal para macOS * * Implementa el renderizado de shaders usando Metal API nativo de Apple: * - MTLDevice para acceso a GPU * - MTLRenderPipelineState para configuración del pipeline * - MTLCommandQueue para enviar comandos a GPU * - MSL (Metal Shading Language) para shaders */ class MetalShader : public ShaderBackend { public: MetalShader() = default; ~MetalShader() override; bool init(SDL_Window* window, SDL_Texture* texture, const std::string& vertex_source, const std::string& fragment_source) override; void render() override; void setTextureSize(float width, float height) override; void cleanup() override; bool isHardwareAccelerated() const override { return is_initialized_; } private: // Funciones auxiliares bool createMetalDevice(); bool compileShaders(const std::string& vertex_source, const std::string& fragment_source); bool createPipeline(); bool createBuffers(); id getMetalTexture(SDL_Texture* texture); // Estado SDL SDL_Window* window_ = nullptr; SDL_Renderer* renderer_ = nullptr; SDL_Texture* back_buffer_ = nullptr; // Estado Metal id device_ = nil; // GPU device id command_queue_ = nil; // Cola de comandos id pipeline_state_ = nil; // Estado del pipeline id vertex_buffer_ = nil; // Buffer de vértices id index_buffer_ = nil; // Buffer de índices id uniforms_buffer_ = nil; // Buffer de uniforms CAMetalLayer* metal_layer_ = nil; // Layer de Metal // Uniforms struct Uniforms { float textureSize[2]; // width, height } uniforms_; // Tamaños int window_width_ = 0; int window_height_ = 0; float texture_width_ = 0.0f; float texture_height_ = 0.0f; // Estado bool is_initialized_ = false; }; } // namespace Rendering #endif // __APPLE__