From 4b477e23072f446db3536c560278ffed5597332a Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 16 Nov 2016 15:51:21 +0100 Subject: [PATCH] Handle duplicated root signatures coming back during replay. * This could happen if e.g. a capture contained the precise root sig that we use internally (and so was created outside of the capture). Otherwise, it would already be de-duplicated. --- renderdoc/driver/d3d12/d3d12_device_wrap.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp index 84e4bf4b8..eda40497b 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp @@ -535,13 +535,23 @@ bool WrappedID3D12Device::Serialise_CreateRootSignature(Serialiser *localSeriali } else { - ret = new WrappedID3D12RootSignature(ret, this); + if(GetResourceManager()->HasWrapper(ret)) + { + ret = (ID3D12RootSignature *)GetResourceManager()->GetWrapper(ret); + ret->AddRef(); - WrappedID3D12RootSignature *wrapped = (WrappedID3D12RootSignature *)ret; + GetResourceManager()->AddLiveResource(Sig, ret); + } + else + { + ret = new WrappedID3D12RootSignature(ret, this); - wrapped->sig = D3D12DebugManager::GetRootSig(blobBytes, blobLen); + WrappedID3D12RootSignature *wrapped = (WrappedID3D12RootSignature *)ret; - GetResourceManager()->AddLiveResource(Sig, ret); + wrapped->sig = D3D12DebugManager::GetRootSig(blobBytes, blobLen); + + GetResourceManager()->AddLiveResource(Sig, ret); + } } } @@ -596,6 +606,8 @@ HRESULT WrappedID3D12Device::CreateRootSignature(UINT nodeMask, const void *pBlo } else { + wrapped->sig = D3D12DebugManager::GetRootSig(pBlobWithRootSignature, blobLengthInBytes); + GetResourceManager()->AddLiveResource(wrapped->GetResourceID(), wrapped); }