#pragma once #include #include #include "gfx.hpp" class GFXMetal : public GFX { public: bool is_supported() override; GFXContext required_context() override { return GFXContext::Metal; } ShaderLanguage accepted_shader_language() override { return ShaderLanguage::MSL; } const char* get_name() override; bool supports_feature(GFXFeature feature) override; bool initialize(const GFXCreateInfo& createInfo) override; void initialize_view(void* native_handle, platform::window_ptr identifier, uint32_t width, uint32_t height) override; void remove_view(platform::window_ptr identifier) override; // buffer operations GFXBuffer* create_buffer(void* data, GFXSize size, bool dynamicData, GFXBufferUsage usage) override; void copy_buffer(GFXBuffer* buffer, void* data, GFXSize offset, GFXSize size) override; void* get_buffer_contents(GFXBuffer* buffer) override; // texture operations GFXTexture* create_texture(const GFXTextureCreateInfo& info) override; void copy_texture(GFXTexture* texture, void* data, GFXSize size) override; void copy_texture(GFXTexture* from, GFXTexture* to) override; void copy_texture(GFXTexture* from, GFXBuffer* to) override; // sampler opeations GFXSampler* create_sampler(const GFXSamplerCreateInfo& info) override; // framebuffer operations GFXFramebuffer* create_framebuffer(const GFXFramebufferCreateInfo& info) override; // render pass operations GFXRenderPass* create_render_pass(const GFXRenderPassCreateInfo& info) override; // pipeline operations GFXPipeline* create_graphics_pipeline(const GFXGraphicsPipelineCreateInfo& info) override; GFXPipeline* create_compute_pipeline(const GFXComputePipelineCreateInfo& info) override; GFXSize get_alignment(GFXSize size) override; GFXCommandBuffer* acquire_command_buffer(bool for_presentation_use) override; void submit(GFXCommandBuffer* command_buffer, platform::window_ptr window) override; private: struct NativeMTLView { platform::window_ptr identifier = nullptr; MTL::PixelFormat format; }; std::vector nativeViews; NativeMTLView* getNativeView(platform::window_ptr identifier) { for(auto& view : nativeViews) { if(view->identifier == identifier) return view; } return nullptr; } MTL::Device* device = nullptr; MTL::CommandQueue* command_queue = nullptr; };