diff --git a/src/bgfx.cpp b/src/bgfx.cpp index a569236c0..ec0601051 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -2410,7 +2410,7 @@ namespace bgfx id pool; }; -#endif // BX_PLATFORM_OSX +#endif // BX_PLATFORM_OSX || BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS RenderFrame::Enum Context::renderFrame(int32_t _msecs) { @@ -2418,7 +2418,7 @@ namespace bgfx #if BX_PLATFORM_OSX || BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS NSAutoreleasePoolScope pool; -#endif // BX_PLATFORM_OSX +#endif // BX_PLATFORM_OSX || BX_PLATFORM_IOS || BX_PLATFORM_VISIONOS if (!m_flipAfterRender) { diff --git a/src/renderer_mtl.h b/src/renderer_mtl.h index 09171e3f9..4ead4ef61 100644 --- a/src/renderer_mtl.h +++ b/src/renderer_mtl.h @@ -1093,6 +1093,20 @@ namespace bgfx { namespace mtl typedef MTLRenderPipelineReflection* RenderPipelineReflection; + typedef MTLCaptureManager* CaptureManager; + + MTLCaptureManager* getSharedCaptureManager() + { + return [MTLCaptureManager sharedCaptureManager]; + } + + typedef MTLCaptureDescriptor* CaptureDescriptor; + + inline MTLCaptureDescriptor* newCaptureDescriptor() + { + return [MTLCaptureDescriptor new]; + } + //helper functions inline void release(NSObject* _obj) { diff --git a/src/renderer_mtl.mm b/src/renderer_mtl.mm index 7f262fea3..a17d1df04 100644 --- a/src/renderer_mtl.mm +++ b/src/renderer_mtl.mm @@ -4124,6 +4124,22 @@ BX_PRAGMA_DIAGNOSTIC_POP(); m_commandBuffer = m_cmd.alloc(); } + if (_render->m_capture) + { + CaptureManager captureMgr = getSharedCaptureManager(); + CaptureDescriptor captureDesc = newCaptureDescriptor(); + captureDesc.captureObject = m_device; + captureDesc.destination = MTLCaptureDestinationDeveloperTools; + + NSError* err = NULL; + [captureMgr startCaptureWithDescriptor: captureDesc error: &err]; + + if (NULL != err) + { + BX_TRACE("Failed to start capture. Error %d: %s", err.code, err.localizedDescription.UTF8String); + } + } + BGFX_MTL_PROFILER_BEGIN_LITERAL("rendererSubmit", kColorFrame); int64_t timeBegin = bx::getHPCounter(); @@ -5336,6 +5352,15 @@ BX_PRAGMA_DIAGNOSTIC_POP(); m_renderCommandEncoderFrameBufferHandle = BGFX_INVALID_HANDLE; + if (_render->m_capture) + { + CaptureManager captureMgr = getSharedCaptureManager(); + if ([captureMgr isCapturing]) + { + [captureMgr stopCapture]; + } + } + if (m_screenshotTarget) { RenderPassDescriptor renderPassDescriptor = newRenderPassDescriptor();