From c5409b40cf3ab71a188a3ca568321baa138c7fb9 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 25 Jul 2019 10:28:28 +0100 Subject: [PATCH] Fix device-type resources not being referenced on D3D12/VK --- renderdoc/driver/d3d12/d3d12_device.cpp | 4 ++-- renderdoc/driver/vulkan/vk_core.cpp | 30 ++++++++++++------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 8107d189a..df8d02db3 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -1511,8 +1511,6 @@ void WrappedID3D12Device::StartFrameCapture(void *dev, void *wnd) GetResourceManager()->ClearReferencedResources(); - GetResourceManager()->MarkResourceFrameReferenced(m_ResourceID, eFrameRef_Read); - // need to do all this atomically so that no other commands // will check to see if they need to markdirty or markpendingdirty // and go into the frame record. @@ -1557,6 +1555,8 @@ void WrappedID3D12Device::StartFrameCapture(void *dev, void *wnd) m_State = CaptureState::ActiveCapturing; } + GetResourceManager()->MarkResourceFrameReferenced(m_ResourceID, eFrameRef_Read); + RDCLOG("Starting capture, frame %u", m_FrameCounter); } diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index d3a928615..9ada31eae 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1435,21 +1435,6 @@ void WrappedVulkan::StartFrameCapture(void *dev, void *wnd) GetResourceManager()->ClearReferencedResources(); GetResourceManager()->ClearReferencedMemory(); - GetResourceManager()->MarkResourceFrameReferenced(GetResID(m_Instance), eFrameRef_Read); - GetResourceManager()->MarkResourceFrameReferenced(GetResID(m_Device), eFrameRef_Read); - GetResourceManager()->MarkResourceFrameReferenced(GetResID(m_Queue), eFrameRef_Read); - - std::map forced = GetForcedReferences(); - - // Note we force read-before-write because this resource is implicitly untracked so we have no - // way of knowing how it's used - for(auto it = forced.begin(); it != forced.end(); ++it) - { - GetResourceManager()->MarkResourceFrameReferenced(it->first, eFrameRef_Read); - if(it->second != eFrameRef_Read) - GetResourceManager()->MarkResourceFrameReferenced(it->first, it->second); - } - // need to do all this atomically so that no other commands // will check to see if they need to markdirty or markpendingdirty // and go into the frame record. @@ -1507,6 +1492,21 @@ void WrappedVulkan::StartFrameCapture(void *dev, void *wnd) m_State = CaptureState::ActiveCapturing; } + GetResourceManager()->MarkResourceFrameReferenced(GetResID(m_Instance), eFrameRef_Read); + GetResourceManager()->MarkResourceFrameReferenced(GetResID(m_Device), eFrameRef_Read); + GetResourceManager()->MarkResourceFrameReferenced(GetResID(m_Queue), eFrameRef_Read); + + std::map forced = GetForcedReferences(); + + // Note we force read-before-write because this resource is implicitly untracked so we have no + // way of knowing how it's used + for(auto it = forced.begin(); it != forced.end(); ++it) + { + GetResourceManager()->MarkResourceFrameReferenced(it->first, eFrameRef_Read); + if(it->second != eFrameRef_Read) + GetResourceManager()->MarkResourceFrameReferenced(it->first, it->second); + } + RDCLOG("Starting capture, frame %u", m_FrameCounter); }