From 76e42a1a2a7fa48b90bd8e3185359cbd0a67e643 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 28 Jan 2019 13:37:48 +0000 Subject: [PATCH] Make sure to correctly identify removed buffer in GPUAddress mapping * When multiple buffers are aliased over the same heap memory, they'll have the same GPU base address. Our mapping needs to ensure it removes the right entry when a resource is released. --- renderdoc/driver/d3d12/d3d12_manager.h | 26 +++++++++++++++++----- renderdoc/driver/d3d12/d3d12_resources.cpp | 9 +++++++- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_manager.h b/renderdoc/driver/d3d12/d3d12_manager.h index d3ed08c44..aa6fde381 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.h +++ b/renderdoc/driver/d3d12/d3d12_manager.h @@ -463,7 +463,7 @@ struct GPUAddressRangeTracker std::vector addresses; Threading::RWLock addressLock; - void AddTo(GPUAddressRange range) + void AddTo(const GPUAddressRange &range) { SCOPED_WRITELOCK(addressLock); auto it = std::lower_bound(addresses.begin(), addresses.end(), range.start); @@ -471,13 +471,27 @@ struct GPUAddressRangeTracker addresses.insert(it, range); } - void RemoveFrom(D3D12_GPU_VIRTUAL_ADDRESS baseAddr) + void RemoveFrom(const GPUAddressRange &range) { - SCOPED_WRITELOCK(addressLock); - auto it = std::lower_bound(addresses.begin(), addresses.end(), baseAddr); - RDCASSERT(it != addresses.end() && baseAddr >= it->start && baseAddr < it->end); + { + SCOPED_WRITELOCK(addressLock); + auto it = std::lower_bound(addresses.begin(), addresses.end(), range.start); - addresses.erase(it); + // there might be multiple buffers with the same range start, find the exact range for this + // buffer + while(it != addresses.end() && it->start == range.start) + { + if(it->id == range.id) + { + addresses.erase(it); + return; + } + + ++it; + } + } + + RDCERR("Couldn't find matching range to remove for %s", ToStr(range.id).c_str()); } void GetResIDFromAddr(D3D12_GPU_VIRTUAL_ADDRESS addr, ResourceId &id, UINT64 &offs) diff --git a/renderdoc/driver/d3d12/d3d12_resources.cpp b/renderdoc/driver/d3d12/d3d12_resources.cpp index 627bd05b0..accf3a5ed 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.cpp +++ b/renderdoc/driver/d3d12/d3d12_resources.cpp @@ -307,7 +307,14 @@ WrappedID3D12Resource::~WrappedID3D12Resource() // assuming only valid for buffers if(m_pReal->GetDesc().Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) - m_Addresses.RemoveFrom(m_pReal->GetGPUVirtualAddress()); + { + GPUAddressRange range; + range.start = m_pReal->GetGPUVirtualAddress(); + range.end = m_pReal->GetGPUVirtualAddress() + m_pReal->GetDesc().Width; + range.id = GetResourceID(); + + m_Addresses.RemoveFrom(range); + } Shutdown();