From 58ecabc7c454a53aba94943d4d3c301793446df0 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 27 Oct 2016 16:23:09 +0200 Subject: [PATCH] Make sure persistent map check includes resources in bound descriptors --- .../driver/d3d12/d3d12_command_queue_wrap.cpp | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp index 3ae07ec82..5e5c6ce65 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp @@ -448,6 +448,9 @@ void STDMETHODCALLTYPE WrappedID3D12CommandQueue::ExecuteCommandLists( { D3D12Descriptor &desc = **it; + ResourceId id, id2; + FrameRefType ref = eFrameRef_Read; + switch(desc.GetType()) { case D3D12Descriptor::TypeUndefined: @@ -455,29 +458,30 @@ void STDMETHODCALLTYPE WrappedID3D12CommandQueue::ExecuteCommandLists( // nothing to do - no resource here break; case D3D12Descriptor::TypeCBV: - GetResourceManager()->MarkResourceFrameReferenced( - WrappedID3D12Resource::GetResIDFromAddr(desc.nonsamp.cbv.BufferLocation), - eFrameRef_Read); - break; - case D3D12Descriptor::TypeSRV: - GetResourceManager()->MarkResourceFrameReferenced(GetResID(desc.nonsamp.resource), - eFrameRef_Read); + id = WrappedID3D12Resource::GetResIDFromAddr(desc.nonsamp.cbv.BufferLocation); break; + case D3D12Descriptor::TypeSRV: id = GetResID(desc.nonsamp.resource); break; case D3D12Descriptor::TypeUAV: - GetResourceManager()->MarkResourceFrameReferenced(GetResID(desc.nonsamp.resource), - eFrameRef_Write); - GetResourceManager()->MarkResourceFrameReferenced( - GetResID(desc.nonsamp.uav.counterResource), eFrameRef_Write); - break; + id2 = GetResID(desc.nonsamp.uav.counterResource); + // deliberate fall-through case D3D12Descriptor::TypeRTV: - GetResourceManager()->MarkResourceFrameReferenced(GetResID(desc.nonsamp.resource), - eFrameRef_Write); - break; case D3D12Descriptor::TypeDSV: - GetResourceManager()->MarkResourceFrameReferenced(GetResID(desc.nonsamp.resource), - eFrameRef_Write); + ref = eFrameRef_Write; + id = GetResID(desc.nonsamp.resource); break; } + + if(id != ResourceId()) + { + refdIDs.insert(id); + GetResourceManager()->MarkResourceFrameReferenced(id, ref); + } + + if(id2 != ResourceId()) + { + refdIDs.insert(id2); + GetResourceManager()->MarkResourceFrameReferenced(id2, ref); + } } // pull in frame refs from this baked command list