1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- // Copyright 2022 Dolphin Emulator Project
- // SPDX-License-Identifier: GPL-2.0-or-later
- #pragma once
- #include <Metal/Metal.h>
- #include <QuartzCore/QuartzCore.h>
- #include "VideoCommon/AbstractGfx.h"
- #include "VideoBackends/Metal/MRCHelpers.h"
- namespace Metal
- {
- class Framebuffer;
- class Texture;
- class Gfx final : public ::AbstractGfx
- {
- public:
- Gfx(MRCOwned<CAMetalLayer*> layer);
- ~Gfx() override;
- bool IsHeadless() const override;
- std::unique_ptr<AbstractTexture> CreateTexture(const TextureConfig& config,
- std::string_view name) override;
- std::unique_ptr<AbstractStagingTexture>
- CreateStagingTexture(StagingTextureType type, const TextureConfig& config) override;
- std::unique_ptr<AbstractFramebuffer>
- CreateFramebuffer(AbstractTexture* color_attachment, AbstractTexture* depth_attachment,
- std::vector<AbstractTexture*> additional_color_attachments) override;
- std::unique_ptr<AbstractShader> CreateShaderFromSource(ShaderStage stage, std::string_view source,
- std::string_view name) override;
- std::unique_ptr<AbstractShader> CreateShaderFromBinary(ShaderStage stage, const void* data,
- size_t length,
- std::string_view name) override;
- std::unique_ptr<AbstractShader> CreateShaderFromMSL(ShaderStage stage, std::string msl,
- std::string_view glsl, std::string_view name);
- std::unique_ptr<NativeVertexFormat>
- CreateNativeVertexFormat(const PortableVertexDeclaration& vtx_decl) override;
- std::unique_ptr<AbstractPipeline> CreatePipeline(const AbstractPipelineConfig& config,
- const void* cache_data = nullptr,
- size_t cache_data_length = 0) override;
- void Flush() override;
- void WaitForGPUIdle() override;
- void OnConfigChanged(u32 bits) override;
- void ClearRegion(const MathUtil::Rectangle<int>& target_rc, bool color_enable, bool alpha_enable,
- bool z_enable, u32 color, u32 z) override;
- void SetPipeline(const AbstractPipeline* pipeline) override;
- void SetFramebuffer(AbstractFramebuffer* framebuffer) override;
- void SetAndDiscardFramebuffer(AbstractFramebuffer* framebuffer) override;
- void SetAndClearFramebuffer(AbstractFramebuffer* framebuffer, const ClearColor& color_value = {},
- float depth_value = 0.0f) override;
- void SetScissorRect(const MathUtil::Rectangle<int>& rc) override;
- void SetTexture(u32 index, const AbstractTexture* texture) override;
- void SetSamplerState(u32 index, const SamplerState& state) override;
- void SetComputeImageTexture(u32 index, AbstractTexture* texture, bool read, bool write) override;
- void UnbindTexture(const AbstractTexture* texture) override;
- void SetViewport(float x, float y, float width, float height, float near_depth,
- float far_depth) override;
- void Draw(u32 base_vertex, u32 num_vertices) override;
- void DrawIndexed(u32 base_index, u32 num_indices, u32 base_vertex) override;
- void DispatchComputeShader(const AbstractShader* shader, u32 groupsize_x, u32 groupsize_y,
- u32 groupsize_z, u32 groups_x, u32 groups_y, u32 groups_z) override;
- bool BindBackbuffer(const ClearColor& clear_color = {}) override;
- void PresentBackbuffer() override;
- SurfaceInfo GetSurfaceInfo() const override;
- private:
- MRCOwned<CAMetalLayer*> m_layer;
- MRCOwned<id<CAMetalDrawable>> m_drawable;
- std::unique_ptr<Texture> m_bb_texture;
- std::unique_ptr<Framebuffer> m_backbuffer;
- u32 m_texture_counter = 0;
- u32 m_staging_texture_counter = 0;
- std::array<u32, 4> m_shader_counter = {};
- void CheckForSurfaceChange();
- void CheckForSurfaceResize();
- void SetupSurface();
- };
- } // namespace Metal
|