2022-02-15 09:13:47 -05:00
|
|
|
#pragma once
|
|
|
|
|
2022-02-15 11:25:13 -05:00
|
|
|
#include <Metal/Metal.hpp>
|
|
|
|
#include <QuartzCore/QuartzCore.hpp>
|
2022-02-15 09:13:47 -05:00
|
|
|
|
|
|
|
#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;
|
|
|
|
|
2022-02-15 11:25:13 -05:00
|
|
|
bool supports_feature(GFXFeature feature) override;
|
2022-02-15 09:13:47 -05:00
|
|
|
|
|
|
|
bool initialize(const GFXCreateInfo& createInfo) override;
|
|
|
|
|
2022-02-15 11:25:13 -05:00
|
|
|
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;
|
2022-02-15 09:13:47 -05:00
|
|
|
|
|
|
|
// buffer operations
|
2022-04-04 07:58:16 -04:00
|
|
|
GFXBuffer* create_buffer(void* data, GFXSize size, bool is_dynamic, GFXBufferUsage usage) override;
|
2022-02-15 11:25:13 -05:00
|
|
|
void copy_buffer(GFXBuffer* buffer, void* data, GFXSize offset, GFXSize size) override;
|
2022-02-15 09:13:47 -05:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2022-02-18 14:36:38 -05:00
|
|
|
GFXSize get_alignment(GFXSize size) override;
|
|
|
|
|
2022-02-21 00:16:02 -05:00
|
|
|
GFXCommandBuffer* acquire_command_buffer(bool for_presentation_use) override;
|
2022-02-15 09:13:47 -05:00
|
|
|
|
2022-02-21 00:16:02 -05:00
|
|
|
void submit(GFXCommandBuffer* command_buffer, platform::window_ptr window) override;
|
2022-02-15 09:13:47 -05:00
|
|
|
|
|
|
|
private:
|
|
|
|
struct NativeMTLView {
|
2022-02-15 11:25:13 -05:00
|
|
|
platform::window_ptr identifier = nullptr;
|
2022-02-18 14:36:38 -05:00
|
|
|
MTL::PixelFormat format;
|
2022-02-15 09:13:47 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
std::vector<NativeMTLView*> nativeViews;
|
|
|
|
|
2022-02-15 11:25:13 -05:00
|
|
|
NativeMTLView* getNativeView(platform::window_ptr identifier) {
|
2022-02-15 09:13:47 -05:00
|
|
|
for(auto& view : nativeViews) {
|
|
|
|
if(view->identifier == identifier)
|
|
|
|
return view;
|
|
|
|
}
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
}
|
2022-02-15 11:25:13 -05:00
|
|
|
|
|
|
|
MTL::Device* device = nullptr;
|
|
|
|
MTL::CommandQueue* command_queue = nullptr;
|
2022-02-15 09:13:47 -05:00
|
|
|
};
|