From bf17650acef2d8970447bd2844370600ebd071a0 Mon Sep 17 00:00:00 2001 From: Julian Meder Date: Thu, 28 Feb 2019 13:39:18 +0100 Subject: [PATCH] Keep DX12 descriptor heaps alive until deferred copy/write flush. --- renderdoc/driver/d3d12/d3d12_device.cpp | 7 +++++++ renderdoc/driver/d3d12/d3d12_device_wrap.cpp | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 59b978f35..3f0fde0ef 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -2136,10 +2136,17 @@ void WrappedID3D12Device::FlushPendingDescriptorWrites() } for(size_t i = 0; i < writes.size(); i++) + { writes[i].dest->CopyFrom(writes[i].desc); + writes[i].dest->GetHeap()->Release(); + } for(size_t i = 0; i < copies.size(); i++) + { copies[i].dst->CopyFrom(*copies[i].src); + copies[i].src->GetHeap()->Release(); + copies[i].dst->GetHeap()->Release(); + } } template diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp index 74d7e4c33..e524f0293 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp @@ -944,6 +944,7 @@ void WrappedID3D12Device::CreateConstantBufferView(const D3D12_CONSTANT_BUFFER_V { SCOPED_LOCK(m_DynDescLock); m_DynamicDescriptorWrites.push_back(write); + write.dest->GetHeap()->AddRef(); m_DynamicDescriptorRefs.push_back(write.desc); } @@ -986,6 +987,7 @@ void WrappedID3D12Device::CreateShaderResourceView(ID3D12Resource *pResource, { SCOPED_LOCK(m_DynDescLock); m_DynamicDescriptorWrites.push_back(write); + write.dest->GetHeap()->AddRef(); if(pResource && pResource->GetDesc().Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) m_DynamicDescriptorRefs.push_back(write.desc); } @@ -1036,6 +1038,7 @@ void WrappedID3D12Device::CreateUnorderedAccessView(ID3D12Resource *pResource, { SCOPED_LOCK(m_DynDescLock); m_DynamicDescriptorWrites.push_back(write); + write.dest->GetHeap()->AddRef(); if(pResource && pResource->GetDesc().Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) m_DynamicDescriptorRefs.push_back(write.desc); } @@ -1081,6 +1084,7 @@ void WrappedID3D12Device::CreateRenderTargetView(ID3D12Resource *pResource, { SCOPED_LOCK(m_DynDescLock); m_DynamicDescriptorWrites.push_back(write); + write.dest->GetHeap()->AddRef(); if(pResource && pResource->GetDesc().Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) m_DynamicDescriptorRefs.push_back(write.desc); } @@ -1123,6 +1127,7 @@ void WrappedID3D12Device::CreateDepthStencilView(ID3D12Resource *pResource, { SCOPED_LOCK(m_DynDescLock); m_DynamicDescriptorWrites.push_back(write); + write.dest->GetHeap()->AddRef(); } { @@ -1161,6 +1166,7 @@ void WrappedID3D12Device::CreateSampler(const D3D12_SAMPLER_DESC *pDesc, { SCOPED_LOCK(m_DynDescLock); m_DynamicDescriptorWrites.push_back(write); + write.dest->GetHeap()->AddRef(); } { @@ -2072,7 +2078,11 @@ void WrappedID3D12Device::CopyDescriptors( SCOPED_LOCK(m_DynDescLock); m_DynamicDescriptorCopies.insert(m_DynamicDescriptorCopies.end(), copies.begin(), copies.end()); for(size_t i = 0; i < copies.size(); i++) + { + copies[i].src->GetHeap()->AddRef(); + copies[i].dst->GetHeap()->AddRef(); m_DynamicDescriptorRefs.push_back(*copies[i].src); + } } { @@ -2142,7 +2152,11 @@ void WrappedID3D12Device::CopyDescriptorsSimple(UINT NumDescriptors, SCOPED_LOCK(m_DynDescLock); m_DynamicDescriptorCopies.insert(m_DynamicDescriptorCopies.end(), copies.begin(), copies.end()); for(size_t i = 0; i < copies.size(); i++) + { + copies[i].src->GetHeap()->AddRef(); + copies[i].dst->GetHeap()->AddRef(); m_DynamicDescriptorRefs.push_back(*copies[i].src); + } } {