Files
coffee-crisis-ae/source/rendering/metal/metal_shader.h
T
JailDesigner d6ffbda00d WIP: Metal shader backend para macOS
- Shaders MSL portados desde GLSL (vertex + fragment)
- Estructura básica de MetalShader class
- Device, command queue, pipeline y buffers creados
- CMakeLists.txt actualizado con Metal frameworks
- assets.txt incluye shaders .metal como opcionales

PENDIENTE:
- Implementar render() loop completo
- Obtener MTLTexture desde SDL_Texture
- Crear sampler state
- Testing en macOS real

Ver METAL_BACKEND_NOTES.md para detalles de implementación.
2025-10-02 21:05:28 +02:00

77 lines
2.2 KiB
Objective-C

#pragma once
#include "../shader_backend.h"
#ifdef __APPLE__
#import <Metal/Metal.h>
#import <QuartzCore/CAMetalLayer.h>
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<MTLTexture> getMetalTexture(SDL_Texture* texture);
// Estado SDL
SDL_Window* window_ = nullptr;
SDL_Renderer* renderer_ = nullptr;
SDL_Texture* back_buffer_ = nullptr;
// Estado Metal
id<MTLDevice> device_ = nil; // GPU device
id<MTLCommandQueue> command_queue_ = nil; // Cola de comandos
id<MTLRenderPipelineState> pipeline_state_ = nil; // Estado del pipeline
id<MTLBuffer> vertex_buffer_ = nil; // Buffer de vértices
id<MTLBuffer> index_buffer_ = nil; // Buffer de índices
id<MTLBuffer> 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__