diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 7414d6d6c..a0c7c7ad3 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -658,12 +658,13 @@ struct VkResourceRecord : public ResourceRecord struct MemState { MemState() - : device(VK_NULL_HANDLE), mapOffset(0), mapSize(0), size(0), mapFlags(0), mappedPtr(NULL), mapFlushed(false), refData(NULL) + : device(VK_NULL_HANDLE), mapOffset(0), mapSize(0), size(0), mapFlags(0), mapFrame(0), mappedPtr(NULL), mapFlushed(false), refData(NULL) { } VkDevice device; VkDeviceSize mapOffset, mapSize; VkDeviceSize size; VkMemoryMapFlags mapFlags; + uint32_t mapFrame; bool mapFlushed; void *mappedPtr; byte *refData; diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 7690b4bb8..006a4cd8c 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -399,7 +399,11 @@ VkResult WrappedVulkan::vkQueueSubmit( for(auto it = m_MemoryInfo.begin(); it != m_MemoryInfo.end(); ++it) { // potential persistent map, force a full flush - if(it->second.mappedPtr) + // VKTODOHIGH need better detection than just 'has not been flushed and has + // been mapped for many frames'. Once we are duplicating coherent memory types + // to offer a non-coherent version, we'll have to treat all maps into coherent + // memory the same. + if(it->second.mappedPtr && !it->second.mapFlushed && it->second.mapFrame + 4 < m_FrameCounter) { size_t diffStart = 0, diffEnd = 0; bool found = true; @@ -414,7 +418,7 @@ VkResult WrappedVulkan::vkQueueSubmit( if(found) { { - RDCLOG("Persistent map flush forced for %llu (%llu -> %llu)", it->first, (uint64_t)diffStart, (uint64_t)diffEnd); + RDCLOG("Persistent map flush forced for %llu (%llu -> %llu) [mapped in %u, flushed %u]", it->first, (uint64_t)diffStart, (uint64_t)diffEnd, it->second.mapFrame, it->second.mapFlushed); VkMappedMemoryRange range = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, GetResourceManager()->GetCurrentHandle(it->first), it->second.mapOffset+diffStart, diffEnd-diffStart }; vkFlushMappedMemoryRanges(it->second.device, 1, &range); } diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index cb26032a1..10a0fff47 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -159,6 +159,7 @@ VkResult WrappedVulkan::vkMapMemory( it->second.mappedPtr = *ppData; it->second.mapOffset = offset; it->second.mapSize = size == 0 ? it->second.size : size; + it->second.mapFrame = m_FrameCounter; it->second.mapFlags = flags; it->second.mapFlushed = false; it->second.refData = NULL;