62 void draw(
const Primitive& primitive,
const std::shared_ptr<IndexBuffer>& indexBuffer =
nullptr,
63 int numInstances = 1,
int indirectSlot = -1,
bool first =
true,
bool last =
true)
override;
66 const Vector3& cameraPosition,
bool enableNormalMaps,
float exposure,
68 int toneMapping = 0)
override;
70 const Vector3& skyDomeCenter = Vector3(0,0,0),
bool isDome =
false,
71 Texture* skyboxCubeMap =
nullptr)
override;
74 [[nodiscard]] MTL::Device*
raw()
const {
return _device; }
75 [[nodiscard]] MTL::CommandQueue*
commandQueue()
const {
return _commandQueue; }
76 [[nodiscard]] CA::MetalDrawable*
frameDrawable()
const {
return _frameDrawable; }
79 const std::string& sourceCode =
"")
override;
83 std::shared_ptr<VertexBuffer>
createVertexBuffer(
const std::shared_ptr<VertexFormat>& format,
89 const std::shared_ptr<VertexFormat>& format,
90 int numVertices, MTL::Buffer* externalBuffer);
93 const std::shared_ptr<VertexFormat>& format,
94 int numVertices,
void* nativeBuffer)
override;
97 const std::vector<uint8_t>& data = {})
override;
98 std::shared_ptr<RenderTarget>
createRenderTarget(
const RenderTargetOptions& options)
override;
101 const Matrix4& viewProjectionPrevious,
const Matrix4& viewProjectionInverse,
102 const std::array<float, 4>& jitters,
const std::array<float, 4>& cameraParams,
103 bool highQuality,
bool historyValid)
override;
109 void computeDispatch(
const std::vector<Compute*>& computes,
const std::string& label =
"")
override;
111 std::pair<int, int>
size()
const override;
113 void setDepthBias(
float depthBias,
float slopeScale,
float clamp)
override;
120 void setViewport(
float x,
float y,
float w,
float h)
override;
121 void setScissor(
int x,
int y,
int w,
int h)
override;
134 const void* cellData,
size_t cellSize)
override;
137 const float* cellsCountByBoundsSize,
138 int cellsX,
int cellsY,
int cellsZ,
int maxLightsPerCell,
139 int numClusteredLights)
override;
145 int submitVertexBuffer(
const std::shared_ptr<VertexBuffer>& vertexBuffer,
int slot);
149 static inline const std::shared_ptr<VertexBuffer> _nullVertexBuffer{
nullptr};
153 MTL::Device* _device;
154 bool _ownsDevice =
false;
155 MTL::CommandQueue* _commandQueue;
157 CA::MetalLayer* _metalLayer;
166 CA::MetalDrawable* _currentDrawable =
nullptr;
167 MTL::CommandBuffer* _commandBuffer =
nullptr;
172 CA::MetalDrawable* _frameDrawable =
nullptr;
174 MTL::RenderPipelineState* _pipelineState =
nullptr;
175 MTL::Buffer* _indirectDrawBuffer =
nullptr;
180 size_t _pendingPaletteOffset = SIZE_MAX;
181 MTL::SamplerState* _defaultSampler =
nullptr;
182 MTL::DepthStencilState* _defaultDepthStencilState =
nullptr;
183 MTL::DepthStencilState* _noWriteDepthStencilState =
nullptr;
184 MTL::Texture* _backBufferDepthTexture =
nullptr;
185 int _backBufferDepthWidth = 0;
186 int _backBufferDepthHeight = 0;
188 std::unique_ptr<MetalRenderPipeline> _renderPipeline;
189 std::unique_ptr<MetalComputePipeline> _computePipeline;
191 std::vector<std::shared_ptr<MetalBindGroupFormat>> _bindGroupFormats;
192 std::unique_ptr<MetalCoCPass> _cocPass;
193 std::unique_ptr<MetalComposePass> _composePass;
194 std::unique_ptr<MetalDofBlurPass> _dofBlurPass;
195 std::unique_ptr<MetalSsaoPass> _ssaoPass;
196 std::unique_ptr<MetalDepthAwareBlurPass> _blurPassH;
197 std::unique_ptr<MetalDepthAwareBlurPass> _blurPassV;
198 std::unique_ptr<MetalTaaPass> _taaPass;
203 std::unique_ptr<MetalUniformRingBuffer> _transformRing;
204 std::unique_ptr<MetalUniformRingBuffer> _uniformRing;
205 std::unique_ptr<MetalPaletteRingBuffer> _paletteRing;
214 MTL::Buffer* _clusterLightBuffer =
nullptr;
215 MTL::Buffer* _clusterCellBuffer =
nullptr;
216 size_t _clusterLightBufferCapacity = 0;
217 size_t _clusterCellBufferCapacity = 0;
218 bool _clusterBuffersSet =
false;
224 NS::AutoreleasePool* _framePool =
nullptr;
GPU texture resource supporting 2D, cubemap, volume, and array formats with mipmap management.