From 8b8027ff89aa6a1e9d76e8a145bf3863e8fc7ae7 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Tue, 28 Jun 2022 20:34:17 +0100 Subject: [PATCH] Update MetalCmdBufferRecordingInfo data Switch to caching the CA::MetalLayer & WrappedMTLTexture from the MTL::Drawable. This is to avoid validation asserts about accessing the texture of a MTL::Drawable after calling MTLCommandBuffer::presentDrawable. Switch "bool present" to "uint32_t flags" to future proof being able to store multiple flags on the command buffer recoring info --- renderdoc/driver/metal/metal_command_buffer.cpp | 13 +++++++++---- renderdoc/driver/metal/metal_resources.h | 14 ++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/renderdoc/driver/metal/metal_command_buffer.cpp b/renderdoc/driver/metal/metal_command_buffer.cpp index 52e5fbdb7..2caaf2a42 100644 --- a/renderdoc/driver/metal/metal_command_buffer.cpp +++ b/renderdoc/driver/metal/metal_command_buffer.cpp @@ -25,6 +25,7 @@ #include "metal_command_buffer.h" #include "metal_blit_command_encoder.h" #include "metal_device.h" +#include "metal_helpers_bridge.h" #include "metal_render_command_encoder.h" #include "metal_resources.h" #include "metal_texture.h" @@ -163,6 +164,9 @@ bool WrappedMTLCommandBuffer::Serialise_presentDrawable(SerialiserType &ser, MTL void WrappedMTLCommandBuffer::presentDrawable(MTL::Drawable *drawable) { + // To avoid metal assert about accessing drawable texture after calling present + MTL::Texture *mtlBackBuffer = ObjC::Get_Texture(drawable); + SERIALISE_TIME_CALL(Unwrap(this)->presentDrawable(drawable)); if(IsCaptureMode(m_State)) { @@ -173,10 +177,11 @@ void WrappedMTLCommandBuffer::presentDrawable(MTL::Drawable *drawable) Serialise_presentDrawable(ser, drawable); chunk = scope.Get(); } - MetalResourceRecord *record = GetRecord(this); - record->AddChunk(chunk); - record->cmdInfo->present = true; - record->cmdInfo->drawable = drawable; + MetalResourceRecord *bufferRecord = GetRecord(this); + bufferRecord->AddChunk(chunk); + bufferRecord->cmdInfo->flags |= MetalCmdBufferStatus::Presented; + bufferRecord->cmdInfo->outputLayer = ObjC::Get_Layer(drawable); + bufferRecord->cmdInfo->backBuffer = GetWrapped(mtlBackBuffer); } else { diff --git a/renderdoc/driver/metal/metal_resources.h b/renderdoc/driver/metal/metal_resources.h index 08040e2f5..d2bb92bd1 100644 --- a/renderdoc/driver/metal/metal_resources.h +++ b/renderdoc/driver/metal/metal_resources.h @@ -137,10 +137,7 @@ BITMASK_OPERATORS(MetalCmdBufferStatus); struct MetalCmdBufferRecordingInfo { - MetalCmdBufferRecordingInfo(WrappedMTLCommandQueue *parentQueue) - : queue(parentQueue), present(false), drawable(NULL) - { - } + MetalCmdBufferRecordingInfo(WrappedMTLCommandQueue *parentQueue) : queue(parentQueue) {} MetalCmdBufferRecordingInfo() = delete; MetalCmdBufferRecordingInfo(const MetalCmdBufferRecordingInfo &) = delete; MetalCmdBufferRecordingInfo(MetalCmdBufferRecordingInfo &&) = delete; @@ -148,10 +145,11 @@ struct MetalCmdBufferRecordingInfo ~MetalCmdBufferRecordingInfo() {} WrappedMTLCommandQueue *queue; - // The drawable that present was called on - MTL::Drawable *drawable; - // AdvanceFrame/Present should be called after this buffer is committed. - bool present; + // The MetalLayer to present + CA::MetalLayer *outputLayer = NULL; + // The texture to present + WrappedMTLTexture *backBuffer = NULL; + MetalCmdBufferStatus flags = MetalCmdBufferStatus::NoFlags; }; struct MetalResourceRecord : public ResourceRecord