From a8f0fb1736173df11cad871a94dea5e9670a34a7 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 7 Aug 2022 18:56:11 +0100 Subject: [PATCH] Stop forcing references for resourced invalidated by freed bound memory --- renderdoc/core/resource_manager.h | 2 +- .../driver/vulkan/wrappers/vk_resource_funcs.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/renderdoc/core/resource_manager.h b/renderdoc/core/resource_manager.h index 28f868f61..5a3c65a03 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -349,7 +349,7 @@ struct ResourceRecord Parents.push_back(r); } } - + bool HasParent(ResourceRecord *r) const { return Parents.indexOf(r) >= 0; } void MarkParentsDirty(ResourceRecordHandler *mgr) { for(auto it = Parents.begin(); it != Parents.end(); ++it) diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 54304f5de..ad1fc5899 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -747,6 +747,18 @@ void WrappedVulkan::vkFreeMemory(VkDevice device, VkDeviceMemory memory, if(IsCaptureMode(m_State)) { + VkResourceRecord *memrecord = GetRecord(memory); + + // any forced references were already processed at the start of the frame if we're mid capture. + // If we're background capturing though, we need to make sure not to force in buffers + // referencing this now-dead memory, as a new memory allocation could be created and use the + // same BDA address + { + SCOPED_LOCK(m_ForcedReferencesLock); + m_ForcedReferences.removeIf( + [memrecord](const VkResourceRecord *record) { return record->HasParent(memrecord); }); + } + // artificially extend the lifespan of buffer device address memory or buffers, to ensure their // opaque capture address isn't re-used before the capture completes {