d6ffbda00d
- 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.
77 lines
2.2 KiB
Objective-C
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__
|