diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index 75770a5c7..adcf44d7a 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -803,7 +803,9 @@ public: void RemoveQueue(WrappedID3D12CommandQueue *queue); // only valid on replay - std::map &GetResourceList() { return *m_ResourceList; } + const std::map &GetResourceList() { return *m_ResourceList; } + void AddReplayResource(ResourceId id, WrappedID3D12Resource *res) { (*m_ResourceList)[id] = res; } + void RemoveReplayResource(ResourceId id) { (*m_ResourceList).erase(id); } rdcarray &GetPipelineList() { return *m_PipelineList; } //////////////////////////////////////////////////////////////// // non wrapping interface diff --git a/renderdoc/driver/d3d12/d3d12_overlay.cpp b/renderdoc/driver/d3d12/d3d12_overlay.cpp index 938ba0fe3..fa84ae9ca 100644 --- a/renderdoc/driver/d3d12/d3d12_overlay.cpp +++ b/renderdoc/driver/d3d12/d3d12_overlay.cpp @@ -965,7 +965,13 @@ RenderOutputSubresource D3D12Replay::GetRenderOutputSubresource(ResourceId id) ResourceId D3D12Replay::RenderOverlay(ResourceId texid, FloatVector clearCol, DebugOverlay overlay, uint32_t eventId, const rdcarray &passEvents) { - ID3D12Resource *resource = m_pDevice->GetResourceList()[texid]; + ID3D12Resource *resource = NULL; + + { + auto it = m_pDevice->GetResourceList().find(texid); + if(it != m_pDevice->GetResourceList().end()) + resource = it->second; + } if(resource == NULL) return ResourceId(); diff --git a/renderdoc/driver/d3d12/d3d12_rendertexture.cpp b/renderdoc/driver/d3d12/d3d12_rendertexture.cpp index 2bd875de7..cac2f14e3 100644 --- a/renderdoc/driver/d3d12/d3d12_rendertexture.cpp +++ b/renderdoc/driver/d3d12/d3d12_rendertexture.cpp @@ -341,7 +341,13 @@ bool D3D12Replay::RenderTextureInternal(D3D12_CPU_DESCRIPTOR_HANDLE rtv, Texture { const bool blendAlpha = (flags & eTexDisplay_BlendAlpha) != 0; - ID3D12Resource *resource = m_pDevice->GetResourceList()[cfg.resourceId]; + ID3D12Resource *resource = NULL; + + { + auto it = m_pDevice->GetResourceList().find(cfg.resourceId); + if(it != m_pDevice->GetResourceList().end()) + resource = it->second; + } if(resource == NULL) return false; diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index eb580a323..92a42c7b1 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -360,7 +360,7 @@ BufferDescription D3D12Replay::GetBuffer(ResourceId id) auto it = m_pDevice->GetResourceList().find(id); - if(it == m_pDevice->GetResourceList().end()) + if(it == m_pDevice->GetResourceList().end() || it->second == NULL) return ret; D3D12_RESOURCE_DESC desc = it->second->GetDesc(); @@ -401,7 +401,7 @@ TextureDescription D3D12Replay::GetTexture(ResourceId id) auto it = m_pDevice->GetResourceList().find(id); - if(it == m_pDevice->GetResourceList().end()) + if(it == m_pDevice->GetResourceList().end() || it->second == NULL) return ret; D3D12_RESOURCE_DESC desc = it->second->GetDesc(); @@ -2647,7 +2647,13 @@ void D3D12Replay::PickPixel(ResourceId texture, uint32_t x, uint32_t y, const Su texDisplay.typeCast = typeCast; texDisplay.rawOutput = true; - ID3D12Resource *resource = m_pDevice->GetResourceList()[texture]; + ID3D12Resource *resource = NULL; + + { + auto it = m_pDevice->GetResourceList().find(texture); + if(it != m_pDevice->GetResourceList().end()) + resource = it->second; + } if(resource) { @@ -2735,7 +2741,13 @@ void D3D12Replay::PickPixel(ResourceId texture, uint32_t x, uint32_t y, const Su bool D3D12Replay::GetMinMax(ResourceId texid, const Subresource &sub, CompType typeCast, float *minval, float *maxval) { - ID3D12Resource *resource = m_pDevice->GetResourceList()[texid]; + ID3D12Resource *resource = NULL; + + { + auto it = m_pDevice->GetResourceList().find(texid); + if(it != m_pDevice->GetResourceList().end()) + resource = it->second; + } if(resource == NULL) return false; @@ -2920,7 +2932,13 @@ bool D3D12Replay::GetHistogram(ResourceId texid, const Subresource &sub, CompTyp if(minval >= maxval) return false; - ID3D12Resource *resource = m_pDevice->GetResourceList()[texid]; + ID3D12Resource *resource = NULL; + + { + auto it = m_pDevice->GetResourceList().find(texid); + if(it != m_pDevice->GetResourceList().end()) + resource = it->second; + } if(resource == NULL) return false; @@ -3155,7 +3173,7 @@ void D3D12Replay::GetBufferData(ResourceId buff, uint64_t offset, uint64_t lengt { auto it = m_pDevice->GetResourceList().find(buff); - if(it == m_pDevice->GetResourceList().end()) + if(it == m_pDevice->GetResourceList().end() || it->second == NULL) { RDCERR("Getting buffer data for unknown buffer %s!", ToStr(m_pDevice->GetResourceManager()->GetLiveID(buff)).c_str()); @@ -3497,7 +3515,13 @@ void D3D12Replay::GetTextureData(ResourceId tex, const Subresource &sub, bool wasms = false; bool resolve = params.resolve; - ID3D12Resource *resource = m_pDevice->GetResourceList()[tex]; + ID3D12Resource *resource = NULL; + + { + auto it = m_pDevice->GetResourceList().find(tex); + if(it != m_pDevice->GetResourceList().end()) + resource = it->second; + } if(resource == NULL) { @@ -4149,7 +4173,13 @@ void D3D12Replay::BuildCustomShader(ShaderEncoding sourceEncoding, const bytebuf ResourceId D3D12Replay::ApplyCustomShader(TextureDisplay &display) { - ID3D12Resource *resource = m_pDevice->GetResourceList()[display.resourceId]; + ID3D12Resource *resource = NULL; + + { + auto it = m_pDevice->GetResourceList().find(display.resourceId); + if(it != m_pDevice->GetResourceList().end()) + resource = it->second; + } if(resource == NULL) return ResourceId(); diff --git a/renderdoc/driver/d3d12/d3d12_resources.cpp b/renderdoc/driver/d3d12/d3d12_resources.cpp index a8c5d7f82..0711062aa 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.cpp +++ b/renderdoc/driver/d3d12/d3d12_resources.cpp @@ -159,7 +159,7 @@ WrappedID3D12Resource::~WrappedID3D12Resource() } if(IsReplayMode(m_pDevice->GetState())) - m_pDevice->GetResourceList().erase(GetResourceID()); + m_pDevice->RemoveReplayResource(GetResourceID()); // assuming only valid for buffers if(m_pReal->GetDesc().Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) diff --git a/renderdoc/driver/d3d12/d3d12_resources.h b/renderdoc/driver/d3d12/d3d12_resources.h index d48eb17e6..32e410751 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.h +++ b/renderdoc/driver/d3d12/d3d12_resources.h @@ -980,7 +980,7 @@ public: : WrappedDeviceChild12(real, device) { if(IsReplayMode(device->GetState())) - device->GetResourceList()[GetResourceID()] = this; + device->AddReplayResource(GetResourceID(), this); // assuming only valid for buffers if(m_pReal->GetDesc().Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) diff --git a/util/test/tests/D3D11/D3D11_Simple_Triangle.py b/util/test/tests/D3D11/D3D11_Simple_Triangle.py index cab3fa061..bd7ae203c 100644 --- a/util/test/tests/D3D11/D3D11_Simple_Triangle.py +++ b/util/test/tests/D3D11/D3D11_Simple_Triangle.py @@ -46,11 +46,18 @@ class D3D11_Simple_Triangle(rdtest.TestCase): self.check_mesh_data(postvs_ref, postvs_data) + save_data = rd.TextureSave() + save_data.destType = rd.FileType.DDS + path = rdtest.get_tmp_path('temp.dds') + # Check that nothing breaks if we call typical enumeration functions on resources for res in self.controller.GetResources(): res: rd.ResourceDescription + save_data.resourceId = res.resourceId + self.controller.GetShaderEntryPoints(res.resourceId) self.controller.GetUsage(res.resourceId) self.controller.GetBufferData(res.resourceId, 0, 0) self.controller.GetTextureData(res.resourceId, rd.Subresource()) + self.controller.SaveTexture(save_data, path) diff --git a/util/test/tests/D3D12/D3D12_Simple_Triangle.py b/util/test/tests/D3D12/D3D12_Simple_Triangle.py index 8858b30ad..cf903956d 100644 --- a/util/test/tests/D3D12/D3D12_Simple_Triangle.py +++ b/util/test/tests/D3D12/D3D12_Simple_Triangle.py @@ -55,12 +55,19 @@ class D3D12_Simple_Triangle(rdtest.TestCase): tex = self.get_resource_by_name("dsvMStex").resourceId self.check_pixel_value(tex, 1, 1, [0.2, (0x55)/255.0, 0.0, 1.0]) + save_data = rd.TextureSave() + save_data.destType = rd.FileType.DDS + path = rdtest.get_tmp_path('temp.dds') + # Check that nothing breaks if we call typical enumeration functions on resources for res in self.controller.GetResources(): res: rd.ResourceDescription + save_data.resourceId = res.resourceId + self.controller.GetShaderEntryPoints(res.resourceId) self.controller.GetUsage(res.resourceId) self.controller.GetBufferData(res.resourceId, 0, 0) self.controller.GetTextureData(res.resourceId, rd.Subresource()) + self.controller.SaveTexture(save_data, path) diff --git a/util/test/tests/GL/GL_Simple_Triangle.py b/util/test/tests/GL/GL_Simple_Triangle.py index be3b5ff4a..d7c519438 100644 --- a/util/test/tests/GL/GL_Simple_Triangle.py +++ b/util/test/tests/GL/GL_Simple_Triangle.py @@ -49,11 +49,18 @@ class GL_Simple_Triangle(rdtest.TestCase): self.check_mesh_data(postvs_ref, postvs_data) + save_data = rd.TextureSave() + save_data.destType = rd.FileType.DDS + path = rdtest.get_tmp_path('temp.dds') + # Check that nothing breaks if we call typical enumeration functions on resources for res in self.controller.GetResources(): res: rd.ResourceDescription + save_data.resourceId = res.resourceId + self.controller.GetShaderEntryPoints(res.resourceId) self.controller.GetUsage(res.resourceId) self.controller.GetBufferData(res.resourceId, 0, 0) self.controller.GetTextureData(res.resourceId, rd.Subresource()) + self.controller.SaveTexture(save_data, path) diff --git a/util/test/tests/Vulkan/VK_Simple_Triangle.py b/util/test/tests/Vulkan/VK_Simple_Triangle.py index a3941d3b1..604d59a0d 100644 --- a/util/test/tests/Vulkan/VK_Simple_Triangle.py +++ b/util/test/tests/Vulkan/VK_Simple_Triangle.py @@ -49,11 +49,18 @@ class VK_Simple_Triangle(rdtest.TestCase): self.check_mesh_data(postvs_ref, postvs_data) + save_data = rd.TextureSave() + save_data.destType = rd.FileType.DDS + path = rdtest.get_tmp_path('temp.dds') + # Check that nothing breaks if we call typical enumeration functions on resources for res in self.controller.GetResources(): res: rd.ResourceDescription + save_data.resourceId = res.resourceId + self.controller.GetShaderEntryPoints(res.resourceId) self.controller.GetUsage(res.resourceId) self.controller.GetBufferData(res.resourceId, 0, 0) self.controller.GetTextureData(res.resourceId, rd.Subresource()) + self.controller.SaveTexture(save_data, path)