diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index 5d9008dfd..9bbeb1c3b 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -1328,6 +1328,8 @@ void D3D11Replay::InitPostVSBuffers(const vector &passEvents) ResourceId D3D11Replay::GetLiveID(ResourceId id) { + if(!m_pDevice->GetResourceManager()->HasLiveResource(id)) + return ResourceId(); return m_pDevice->GetResourceManager()->GetLiveID(id); } diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index 4a9562d10..9342a99c3 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -300,6 +300,8 @@ FrameRecord D3D12Replay::GetFrameRecord() ResourceId D3D12Replay::GetLiveID(ResourceId id) { + if(!m_pDevice->GetResourceManager()->HasLiveResource(id)) + return ResourceId(); return m_pDevice->GetResourceManager()->GetLiveID(id); } diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 8fe369672..0eed4bf84 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -130,6 +130,8 @@ FrameRecord GLReplay::GetFrameRecord() ResourceId GLReplay::GetLiveID(ResourceId id) { + if(!m_pDriver->GetResourceManager()->HasLiveResource(id)) + return ResourceId(); return m_pDriver->GetResourceManager()->GetLiveID(id); } diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 2510602a2..9777cf8d6 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -737,6 +737,8 @@ vector VulkanReplay::GetPassEvents(uint32_t eventID) ResourceId VulkanReplay::GetLiveID(ResourceId id) { + if(!m_pDriver->GetResourceManager()->HasLiveResource(id)) + return ResourceId(); return m_pDriver->GetResourceManager()->GetLiveID(id); } diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index 8c9185d18..d79861bcf 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -315,7 +315,10 @@ rdcarray ReplayController::GetDebugMessages() rdcarray ReplayController::GetUsage(ResourceId id) { - return m_pDevice->GetUsage(m_pDevice->GetLiveID(id)); + id = m_pDevice->GetLiveID(id); + if(id == ResourceId()) + return rdcarray(); + return m_pDevice->GetUsage(id); } MeshFormat ReplayController::GetPostVSData(uint32_t instID, MeshDataStage stage) @@ -373,6 +376,13 @@ bool ReplayController::SaveTexture(const TextureSave &saveData, const char *path { TextureSave sd = saveData; // mutable copy ResourceId liveid = m_pDevice->GetLiveID(sd.id); + + if(liveid == ResourceId()) + { + RDCERR("Couldn't get Live ID for %llu getting texture data", sd.id); + return false; + } + TextureDescription td = m_pDevice->GetTexture(liveid); bool success = false; @@ -1211,7 +1221,12 @@ rdcarray ReplayController::PixelHistory(ResourceId target, ui } } - auto usage = m_pDevice->GetUsage(m_pDevice->GetLiveID(target)); + ResourceId id = m_pDevice->GetLiveID(target); + + if(id == ResourceId()) + return ret; + + std::vector usage = m_pDevice->GetUsage(id); vector events; @@ -1276,8 +1291,12 @@ rdcarray ReplayController::PixelHistory(ResourceId target, ui return ret; } - ret = m_pDevice->PixelHistory(events, m_pDevice->GetLiveID(target), x, y, slice, mip, sampleIdx, - typeHint); + id = m_pDevice->GetLiveID(target); + + if(id == ResourceId()) + return ret; + + ret = m_pDevice->PixelHistory(events, id, x, y, slice, mip, sampleIdx, typeHint); SetFrameEvent(m_EventID, true); @@ -1329,11 +1348,18 @@ rdcarray ReplayController::GetCBufferVariableContents( { vector data; if(buffer != ResourceId()) - m_pDevice->GetBufferData(m_pDevice->GetLiveID(buffer), offs, 0, data); + { + buffer = m_pDevice->GetLiveID(buffer); + if(buffer != ResourceId()) + m_pDevice->GetBufferData(m_pDevice->GetLiveID(buffer), offs, 0, data); + } vector v; - m_pDevice->FillCBufferVariables(m_pDevice->GetLiveID(shader), entryPoint, cbufslot, v, data); + shader = m_pDevice->GetLiveID(shader); + + if(shader != ResourceId()) + m_pDevice->FillCBufferVariables(m_pDevice->GetLiveID(shader), entryPoint, cbufslot, v, data); return v; }