diff --git a/renderdoc/driver/d3d12/d3d12_debug.cpp b/renderdoc/driver/d3d12/d3d12_debug.cpp index 2352699ce..f1c259089 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_debug.cpp @@ -1825,9 +1825,9 @@ void D3D12DebugManager::BuildShader(string source, string entry, const uint32_t void D3D12DebugManager::GetBufferData(ResourceId buff, uint64_t offset, uint64_t length, vector &retData) { - auto it = WrappedID3D12Resource::m_List.find(buff); + auto it = WrappedID3D12Resource::GetList().find(buff); - if(it == WrappedID3D12Resource::m_List.end()) + if(it == WrappedID3D12Resource::GetList().end()) { RDCERR("Getting buffer data for unknown buffer %llu!", buff); return; @@ -2241,7 +2241,7 @@ bool D3D12DebugManager::RenderTextureInternal(D3D12_CPU_DESCRIPTOR_HANDLE rtv, T pixelData.FlipY = cfg.FlipY ? 1 : 0; - ID3D12Resource *resource = WrappedID3D12Resource::m_List[cfg.texid]; + ID3D12Resource *resource = WrappedID3D12Resource::GetList()[cfg.texid]; D3D12_RESOURCE_DESC resourceDesc = resource->GetDesc(); pixelData.SampleIdx = (int)RDCCLAMP(cfg.sampleIdx, 0U, resourceDesc.SampleDesc.Count - 1); diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index e3904ae0f..959d6277a 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -176,6 +176,8 @@ WrappedID3D12Device::WrappedID3D12Device(ID3D12Device *realDevice, D3D12InitPara m_DescriptorIncrements[i] = realDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE(i)); + WrappedID3D12Resource::m_List = NULL; + // refcounters implicitly construct with one reference, but we don't start with any soft // references. m_SoftRefCounter.Release(); @@ -208,6 +210,8 @@ WrappedID3D12Device::WrappedID3D12Device(ID3D12Device *realDevice, D3D12InitPara m_State = READING; m_pSerialiser = NULL; + WrappedID3D12Resource::m_List = new std::map(); + m_FrameCaptureRecord = NULL; ResourceIDGen::SetReplayResourceIDs(); @@ -325,6 +329,8 @@ WrappedID3D12Device::~WrappedID3D12Device() { RenderDoc::Inst().RemoveDeviceFrameCapturer((ID3D12Device *)this); + SAFE_DELETE(WrappedID3D12Resource::m_List); + for(size_t i = 0; i < m_QueueFences.size(); i++) { GPUSync(m_Queues[i], m_QueueFences[i]); diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index cd5abcce4..944c1762a 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -78,7 +78,8 @@ vector D3D12Replay::GetBuffers() { vector ret; - for(auto it = WrappedID3D12Resource::m_List.begin(); it != WrappedID3D12Resource::m_List.end(); it++) + for(auto it = WrappedID3D12Resource::GetList().begin(); + it != WrappedID3D12Resource::GetList().end(); it++) if(it->second->GetDesc().Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) ret.push_back(it->first); @@ -89,7 +90,8 @@ vector D3D12Replay::GetTextures() { vector ret; - for(auto it = WrappedID3D12Resource::m_List.begin(); it != WrappedID3D12Resource::m_List.end(); it++) + for(auto it = WrappedID3D12Resource::GetList().begin(); + it != WrappedID3D12Resource::GetList().end(); it++) { if(it->second->GetDesc().Dimension != D3D12_RESOURCE_DIMENSION_BUFFER && m_pDevice->GetResourceManager()->GetOriginalID(it->first) != it->first) @@ -104,9 +106,9 @@ FetchBuffer D3D12Replay::GetBuffer(ResourceId id) FetchBuffer ret; ret.ID = m_pDevice->GetResourceManager()->GetOriginalID(id); - auto it = WrappedID3D12Resource::m_List.find(id); + auto it = WrappedID3D12Resource::GetList().find(id); - if(it == WrappedID3D12Resource::m_List.end()) + if(it == WrappedID3D12Resource::GetList().end()) return ret; D3D12_RESOURCE_DESC desc = it->second->GetDesc(); @@ -153,9 +155,9 @@ FetchTexture D3D12Replay::GetTexture(ResourceId id) FetchTexture ret; ret.ID = m_pDevice->GetResourceManager()->GetOriginalID(id); - auto it = WrappedID3D12Resource::m_List.find(id); + auto it = WrappedID3D12Resource::GetList().find(id); - if(it == WrappedID3D12Resource::m_List.end()) + if(it == WrappedID3D12Resource::GetList().end()) return ret; D3D12_RESOURCE_DESC desc = it->second->GetDesc(); diff --git a/renderdoc/driver/d3d12/d3d12_resources.cpp b/renderdoc/driver/d3d12/d3d12_resources.cpp index 7bfe1e672..705b9ae91 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.cpp +++ b/renderdoc/driver/d3d12/d3d12_resources.cpp @@ -28,7 +28,7 @@ #include "d3d12_command_queue.h" GPUAddressRangeTracker WrappedID3D12Resource::m_Addresses; -std::map WrappedID3D12Resource::m_List; +std::map *WrappedID3D12Resource::m_List = NULL; std::map WrappedID3D12PipelineState::m_Shaders; diff --git a/renderdoc/driver/d3d12/d3d12_resources.h b/renderdoc/driver/d3d12/d3d12_resources.h index 176401375..55202323f 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.h +++ b/renderdoc/driver/d3d12/d3d12_resources.h @@ -660,8 +660,9 @@ class WrappedID3D12Resource : public WrappedDeviceChild12 public: ALLOCATE_WITH_WRAPPED_POOL(WrappedID3D12Resource); - static std::map m_List; + static std::map *m_List; + static std::map &GetList() { return *m_List; } static void RefBuffers(D3D12ResourceManager *rm); static void GetResIDFromAddr(D3D12_GPU_VIRTUAL_ADDRESS addr, ResourceId &id, UINT64 &offs) @@ -688,7 +689,9 @@ public: WrappedID3D12Resource(ID3D12Resource *real, WrappedID3D12Device *device) : WrappedDeviceChild12(real, device) { - m_List[GetResourceID()] = this; + if(m_List) + (*m_List)[GetResourceID()] = this; + SetResident(true); // assuming only valid for buffers @@ -706,7 +709,8 @@ public: } virtual ~WrappedID3D12Resource() { - m_List.erase(GetResourceID()); + if(m_List) + (*m_List).erase(GetResourceID()); // assuming only valid for buffers if(m_pReal->GetDesc().Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)