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));