@@ -49,9 +49,36 @@ enum class MetalEncoderType
49
49
Blit,
50
50
};
51
51
52
+ class LatteQueryObjectMtl : public LatteQueryObject
53
+ {
54
+ public:
55
+ LatteQueryObjectMtl (class MetalRenderer * mtlRenderer) : m_mtlr{mtlRenderer} {}
56
+
57
+ bool getResult (uint64& numSamplesPassed) override
58
+ {
59
+ cemuLog_log (LogType::MetalLogging, " LatteQueryObjectMtl::getResult: occlusion queries are not yet supported on Metal" );
60
+ return false ;
61
+ }
62
+
63
+ void begin () override
64
+ {
65
+ cemuLog_log (LogType::MetalLogging, " LatteQueryObjectMtl::begin: occlusion queries are not yet supported on Metal" );
66
+ }
67
+
68
+ void end () override
69
+ {
70
+ cemuLog_log (LogType::MetalLogging, " LatteQueryObjectMtl::end: occlusion queries are not yet supported on Metal" );
71
+ }
72
+
73
+ private:
74
+ class MetalRenderer * m_mtlr;
75
+ };
76
+
52
77
class MetalRenderer : public Renderer
53
78
{
54
79
public:
80
+ static const inline int TEXTURE_READBACK_SIZE = 32 * 1024 * 1024 ; // 32 MB
81
+
55
82
MetalRenderer ();
56
83
~MetalRenderer () override ;
57
84
@@ -178,23 +205,43 @@ class MetalRenderer : public Renderer
178
205
179
206
// occlusion queries
180
207
LatteQueryObject* occlusionQuery_create () override {
181
- cemuLog_log (LogType::MetalLogging, " Occlusion queries are not yet supported on Metal" );
208
+ cemuLog_log (LogType::MetalLogging, " MetalRenderer::occlusionQuery_create: Occlusion queries are not yet supported on Metal" );
182
209
183
- return nullptr ;
210
+ return new LatteQueryObjectMtl ( this ) ;
184
211
}
185
212
186
213
void occlusionQuery_destroy (LatteQueryObject* queryObj) override {
187
- cemuLog_log (LogType::MetalLogging, " Occlusion queries are not yet supported on Metal" );
214
+ cemuLog_log (LogType::MetalLogging, " MetalRenderer::occlusionQuery_destroy: occlusion queries are not yet supported on Metal" );
188
215
}
189
216
190
217
void occlusionQuery_flush () override {
191
- cemuLog_log (LogType::MetalLogging, " Occlusion queries are not yet supported on Metal" );
218
+ cemuLog_log (LogType::MetalLogging, " MetalRenderer::occlusionQuery_flush: occlusion queries are not yet supported on Metal" );
192
219
}
193
220
194
221
void occlusionQuery_updateState () override {
195
- cemuLog_log (LogType::MetalLogging, " Occlusion queries are not yet supported on Metal" );
222
+ cemuLog_log (LogType::MetalLogging, " MetalRenderer::occlusionQuery_updateState: occlusion queries are not yet supported on Metal" );
196
223
}
197
224
225
+ // Helpers
226
+ void EnsureCommandBuffer ();
227
+ MTL::RenderCommandEncoder* GetRenderCommandEncoder (MTL::RenderPassDescriptor* renderPassDescriptor, MTL::Texture* colorRenderTargets[8 ], MTL::Texture* depthRenderTarget, bool forceRecreate = false , bool rebindStateIfNewEncoder = true );
228
+ MTL::ComputeCommandEncoder* GetComputeCommandEncoder ();
229
+ MTL::BlitCommandEncoder* GetBlitCommandEncoder ();
230
+ void EndEncoding ();
231
+ void CommitCommandBuffer ();
232
+
233
+ bool AcquireNextDrawable ();
234
+
235
+ void BindStageResources (MTL::RenderCommandEncoder* renderCommandEncoder, LatteDecompilerShader* shader);
236
+ void RebindRenderState (MTL::RenderCommandEncoder* renderCommandEncoder);
237
+
238
+ void ClearColorTextureInternal (MTL::Texture* mtlTexture, sint32 sliceIndex, sint32 mipIndex, float r, float g, float b, float a);
239
+
240
+ // Getters
241
+ MTL::Buffer* GetTextureReadbackBuffer ()
242
+ {
243
+ return m_readbackBuffer;
244
+ }
198
245
199
246
private:
200
247
CA::MetalLayer* m_metalLayer;
@@ -213,6 +260,10 @@ class MetalRenderer : public Renderer
213
260
// Basic
214
261
MTL::SamplerState* m_nearestSampler;
215
262
263
+ // Texture readback
264
+ MTL::Buffer* m_readbackBuffer;
265
+ uint32 m_readbackBufferWriteOffset = 0 ;
266
+
216
267
// Active objects
217
268
MTL::CommandBuffer* m_commandBuffer = nullptr ;
218
269
MetalEncoderType m_encoderType = MetalEncoderType::None;
@@ -221,19 +272,4 @@ class MetalRenderer : public Renderer
221
272
222
273
// State
223
274
MetalState m_state;
224
-
225
- // Helpers
226
- void EnsureCommandBuffer ();
227
- MTL::RenderCommandEncoder* GetRenderCommandEncoder (MTL::RenderPassDescriptor* renderPassDescriptor, MTL::Texture* colorRenderTargets[8 ], MTL::Texture* depthRenderTarget, bool forceRecreate = false , bool rebindStateIfNewEncoder = true );
228
- MTL::ComputeCommandEncoder* GetComputeCommandEncoder ();
229
- MTL::BlitCommandEncoder* GetBlitCommandEncoder ();
230
- void EndEncoding ();
231
- void CommitCommandBuffer ();
232
-
233
- bool AcquireNextDrawable ();
234
-
235
- void BindStageResources (MTL::RenderCommandEncoder* renderCommandEncoder, LatteDecompilerShader* shader);
236
- void RebindRenderState (MTL::RenderCommandEncoder* renderCommandEncoder);
237
-
238
- void ClearColorTextureInternal (MTL::Texture* mtlTexture, sint32 sliceIndex, sint32 mipIndex, float r, float g, float b, float a);
239
275
};
0 commit comments