From 731f137e2f156e2db0129777f97c81021acb4ca7 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 8 May 2024 16:26:49 +0100 Subject: [PATCH] Destroy ASs when the ASB backing them is destroyed --- renderdoc/driver/d3d12/d3d12_resources.cpp | 98 ++++++++++++---------- 1 file changed, 52 insertions(+), 46 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_resources.cpp b/renderdoc/driver/d3d12/d3d12_resources.cpp index 8b5dac69f..b48e6795b 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.cpp +++ b/renderdoc/driver/d3d12/d3d12_resources.cpp @@ -137,6 +137,54 @@ ID3D12DeviceChild *Unwrap(ID3D12DeviceChild *ptr) return (ID3D12DeviceChild *)Unwrap((ID3D12Object *)ptr); } +WRAPPED_POOL_INST(D3D12AccelerationStructure); + +D3D12AccelerationStructure::D3D12AccelerationStructure(WrappedID3D12Device *wrappedDevice, + WrappedID3D12Resource *bufferRes, + D3D12BufferOffset bufferOffset, + UINT64 byteSize) + : WrappedDeviceChild12(NULL, wrappedDevice), + m_asbWrappedResource(bufferRes), + m_asbWrappedResourceBufferOffset(bufferOffset), + byteSize(byteSize) +{ +} + +D3D12AccelerationStructure::~D3D12AccelerationStructure() +{ + RDCLOG("AS %s destroyed", ToStr(GetResourceID()).c_str()); + + Shutdown(); +} + +bool WrappedID3D12Resource::CreateAccStruct(D3D12BufferOffset bufferOffset, UINT64 byteSize, + D3D12AccelerationStructure **accStruct) +{ + SCOPED_LOCK(m_accStructResourcesCS); + if(m_accelerationStructMap.find(bufferOffset) == m_accelerationStructMap.end()) + { + m_accelerationStructMap[bufferOffset] = + new D3D12AccelerationStructure(m_pDevice, this, bufferOffset, byteSize); + + if(accStruct) + { + *accStruct = m_accelerationStructMap[bufferOffset]; + + if(IsCaptureMode(m_pDevice->GetState())) + { + size_t deletedAccStructCount = DeleteOverlappingAccStructsInRangeAtOffset(bufferOffset); + RDCDEBUG("Acc structure created after deleting %u overlapping acc structure(s)", + deletedAccStructCount); + deletedAccStructCount; + } + } + + return true; + } + + return false; +} + WrappedID3D12Resource::~WrappedID3D12Resource() { SAFE_RELEASE(m_Heap); @@ -161,6 +209,10 @@ WrappedID3D12Resource::~WrappedID3D12Resource() } } + // release all ASs + for(auto it = m_accelerationStructMap.begin(); it != m_accelerationStructMap.end(); ++it) + SAFE_RELEASE(it->second); + if(IsReplayMode(m_pDevice->GetState())) m_pDevice->RemoveReplayResource(GetResourceID()); @@ -359,52 +411,6 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12Resource::WriteToSubresource(UINT DstSubr return ret; } -WRAPPED_POOL_INST(D3D12AccelerationStructure); - -D3D12AccelerationStructure::D3D12AccelerationStructure(WrappedID3D12Device *wrappedDevice, - WrappedID3D12Resource *bufferRes, - D3D12BufferOffset bufferOffset, - UINT64 byteSize) - : WrappedDeviceChild12(NULL, wrappedDevice), - m_asbWrappedResource(bufferRes), - m_asbWrappedResourceBufferOffset(bufferOffset), - byteSize(byteSize) -{ -} - -D3D12AccelerationStructure::~D3D12AccelerationStructure() -{ - Shutdown(); -} - -bool WrappedID3D12Resource::CreateAccStruct(D3D12BufferOffset bufferOffset, UINT64 byteSize, - D3D12AccelerationStructure **accStruct) -{ - SCOPED_LOCK(m_accStructResourcesCS); - if(m_accelerationStructMap.find(bufferOffset) == m_accelerationStructMap.end()) - { - m_accelerationStructMap[bufferOffset] = - new D3D12AccelerationStructure(m_pDevice, this, bufferOffset, byteSize); - - if(accStruct) - { - *accStruct = m_accelerationStructMap[bufferOffset]; - - if(IsCaptureMode(m_pDevice->GetState())) - { - size_t deletedAccStructCount = DeleteOverlappingAccStructsInRangeAtOffset(bufferOffset); - RDCDEBUG("Acc structure created after deleting %u overlapping acc structure(s)", - deletedAccStructCount); - deletedAccStructCount; - } - } - - return true; - } - - return false; -} - bool WrappedID3D12Resource::GetAccStructIfExist(D3D12BufferOffset bufferOffset, D3D12AccelerationStructure **accStruct) {