From 8b8067b2248dcac8715cb827f61b215c48d68025 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 4 May 2023 18:08:48 +0100 Subject: [PATCH] Flush mapped non-coherent memory. Closes #2931 --- .../vulkan/wrappers/vk_resource_funcs.cpp | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 5427c7f22..1448b3681 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -1163,10 +1163,13 @@ bool WrappedVulkan::Serialise_vkFlushMappedMemoryRanges(SerialiserType &ser, VkD { if(IsLoading(m_State)) { - AddDebugMessage(MessageCategory::Performance, MessageSeverity::Medium, - MessageSource::GeneralPerformance, - "Unmapped memory overlaps tiled-only memory region. " - "Taking slow path to mask tiled memory writes"); + AddDebugMessage( + MessageCategory::Performance, MessageSeverity::Medium, + MessageSource::GeneralPerformance, + StringFormat::Fmt( + "Unmapped memory %s overlaps tiled-only memory region. " + "Taking slow path to mask tiled memory writes", + ToStr(GetResourceManager()->GetOriginalID(GetResID(MemRange.memory))).c_str())); } directStream = false; m_MaskedMapData.resize((size_t)memRangeSize); @@ -1224,7 +1227,23 @@ bool WrappedVulkan::Serialise_vkFlushMappedMemoryRanges(SerialiserType &ser, VkD } if(IsReplayingAndReading() && MappedData && MemRange.memory != VK_NULL_HANDLE && MemRange.size > 0) + { + const VulkanCreationInfo::Memory &memInfo = m_CreationInfo.m_Memory[GetResID(MemRange.memory)]; + if((m_PhysicalDeviceData.memProps.memoryTypes[memInfo.memoryTypeIndex].propertyFlags & + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0) + { + VkMappedMemoryRange range = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, + NULL, + Unwrap(MemRange.memory), + MemRange.offset, + MemRange.size, + }; + + ObjDisp(device)->FlushMappedMemoryRanges(Unwrap(device), 1, &range); + } ObjDisp(device)->UnmapMemory(Unwrap(device), Unwrap(MemRange.memory)); + } SERIALISE_CHECK_READ_ERRORS();