From e36062b989be9f9fa2ca464e8f0376cc5eb4f22e Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Tue, 11 Apr 2023 16:36:51 +0100 Subject: [PATCH] Apple added drawableID to MetalDrawableInfo If MTL:Drawable is not found by pointer, fallback and search for it by drawableID (which should be unique and monotonically increasing). This fixes a problem preventing frame capture when launching RenderDoc UI from Xcode with "GPU Frame Capture" enabled. --- renderdoc/driver/metal/metal_core.cpp | 12 ++++++++++++ renderdoc/driver/metal/metal_device.h | 1 + 2 files changed, 13 insertions(+) diff --git a/renderdoc/driver/metal/metal_core.cpp b/renderdoc/driver/metal/metal_core.cpp index aad53097f..1b69bdefe 100644 --- a/renderdoc/driver/metal/metal_core.cpp +++ b/renderdoc/driver/metal/metal_core.cpp @@ -1034,6 +1034,7 @@ void WrappedMTLDevice::RegisterDrawableInfo(CA::MetalDrawable *caMtlDrawable) MetalDrawableInfo drawableInfo; drawableInfo.mtlLayer = caMtlDrawable->layer(); drawableInfo.texture = GetWrapped(caMtlDrawable->texture()); + drawableInfo.drawableID = caMtlDrawable->drawableID(); SCOPED_LOCK(m_CaptureDrawablesLock); RDCASSERTEQUAL(m_CaptureDrawableInfos.find(caMtlDrawable), m_CaptureDrawableInfos.end()); m_CaptureDrawableInfos[caMtlDrawable] = drawableInfo; @@ -1052,6 +1053,17 @@ MetalDrawableInfo WrappedMTLDevice::UnregisterDrawableInfo(MTL::Drawable *mtlDra return drawableInfo; } } + // Not found by pointer fall back and check by drawableID + NS::UInteger drawableID = mtlDrawable->drawableID(); + for(auto it = m_CaptureDrawableInfos.begin(); it != m_CaptureDrawableInfos.end(); ++it) + { + drawableInfo = it->second; + if(drawableInfo.drawableID == drawableID) + { + m_CaptureDrawableInfos.erase(it); + return drawableInfo; + } + } drawableInfo.mtlLayer = NULL; drawableInfo.texture = NULL; return drawableInfo; diff --git a/renderdoc/driver/metal/metal_device.h b/renderdoc/driver/metal/metal_device.h index 5d3b3fe30..65393411b 100644 --- a/renderdoc/driver/metal/metal_device.h +++ b/renderdoc/driver/metal/metal_device.h @@ -35,6 +35,7 @@ struct MetalDrawableInfo { CA::MetalLayer *mtlLayer; WrappedMTLTexture *texture; + NS::UInteger drawableID; }; class MetalCapturer : public IFrameCapturer