From 640fc256dd9499f109fcb69b2a0329aaf076f03c Mon Sep 17 00:00:00 2001 From: Benson Joeris Date: Fri, 21 Feb 2020 17:16:08 -0500 Subject: [PATCH] Record MemRefs for every VkDeviceMemory This fixes an ambiguity between old captures (where missing MemRefs indicates a lack of information, and we need to act pessimistically), vs new captures where the memory contents were not accessed (e.g. only bound to images). Now the latter case will have an explicit MemRefs entry indicating that the memory was not referenced. Change-Id: Ib76d56ef6f2e250952412b4cdbe0b2432a4ca0ec --- renderdoc/driver/vulkan/vk_manager.cpp | 29 +++++++++++++++---- renderdoc/driver/vulkan/vk_manager.h | 3 ++ .../vulkan/wrappers/vk_resource_funcs.cpp | 4 +++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_manager.cpp b/renderdoc/driver/vulkan/vk_manager.cpp index dbd46eae3..c4e5faeeb 100644 --- a/renderdoc/driver/vulkan/vk_manager.cpp +++ b/renderdoc/driver/vulkan/vk_manager.cpp @@ -535,13 +535,18 @@ bool VulkanResourceManager::Serialise_ImageRefs(ReadSerialiser &ser, void VulkanResourceManager::InsertDeviceMemoryRefs(WriteSerialiser &ser) { rdcarray data; - - for(auto it = m_MemFrameRefs.begin(); it != m_MemFrameRefs.end(); it++) + MemRefs emptyMemRefs; + for(auto memIt = m_DeviceMemories.begin(); memIt != m_DeviceMemories.end(); memIt++) { - ResourceId mem = it->first; - Intervals &rangeRefs = it->second.rangeRefs; + MemRefs *memRefs = NULL; + auto it = m_MemFrameRefs.find(*memIt); + if(it == m_MemFrameRefs.end()) + memRefs = &emptyMemRefs; + else + memRefs = &it->second; + Intervals &rangeRefs = memRefs->rangeRefs; for(auto jt = rangeRefs.begin(); jt != rangeRefs.end(); jt++) - data.push_back({mem, jt->start(), jt->value()}); + data.push_back({*memIt, jt->start(), jt->value()}); } uint64_t sizeEstimate = data.size() * sizeof(MemRefInterval) + 32; @@ -851,6 +856,20 @@ void VulkanResourceManager::AddMemoryFrameRefs(ResourceId mem) m_MemFrameRefs.insert({mem, MemRefs()}); } +void VulkanResourceManager::AddDeviceMemory(ResourceId mem) +{ + SCOPED_LOCK(m_Lock); + + m_DeviceMemories.insert(mem); +} + +void VulkanResourceManager::RemoveDeviceMemory(ResourceId mem) +{ + SCOPED_LOCK(m_Lock); + + m_DeviceMemories.erase(mem); +} + void VulkanResourceManager::MergeReferencedMemory(std::map &memRefs) { SCOPED_LOCK(m_Lock); diff --git a/renderdoc/driver/vulkan/vk_manager.h b/renderdoc/driver/vulkan/vk_manager.h index fc93dcbd5..49e886d79 100644 --- a/renderdoc/driver/vulkan/vk_manager.h +++ b/renderdoc/driver/vulkan/vk_manager.h @@ -425,6 +425,8 @@ public: void MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSize start, VkDeviceSize end, FrameRefType refType); void AddMemoryFrameRefs(ResourceId mem); + void AddDeviceMemory(ResourceId mem); + void RemoveDeviceMemory(ResourceId mem); void MergeReferencedMemory(std::map &memRefs); void ClearReferencedMemory(); @@ -460,5 +462,6 @@ private: WrappedVulkan *m_Core; std::map m_MemFrameRefs; + std::set m_DeviceMemories; InitPolicy m_InitPolicy = eInitPolicy_CopyAll; }; diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index acbbf2145..d443ca4f3 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -471,6 +471,8 @@ VkResult WrappedVulkan::vkAllocateMemory(VkDevice device, const VkMemoryAllocate record->memMapState->mapCoherent = (memProps & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0; record->memMapState->refData = NULL; } + + GetResourceManager()->AddDeviceMemory(id); } else { @@ -539,6 +541,8 @@ void WrappedVulkan::vkFreeMemory(VkDevice device, VkDeviceMemory memory, SCOPED_LOCK(m_CoherentMapsLock); m_CoherentMaps.removeOne(wrapped->record); } + + GetResourceManager()->RemoveDeviceMemory(wrapped->id); } m_CreationInfo.erase(GetResID(memory));