diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 7cd9c2d1b..6bee6c5c5 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -127,6 +127,7 @@ void GPUBuffer::Create(WrappedVulkan *driver, VkDevice dev, VkDeviceSize size, u { m_pDriver = driver; device = dev; + createFlags = flags; align = (VkDeviceSize)driver->GetDeviceProps().limits.minUniformBufferOffsetAlignment; @@ -216,6 +217,17 @@ void *GPUBuffer::Map(uint32_t *bindoffset, VkDeviceSize usedsize) void *ptr = NULL; VkResult vkr = m_pDriver->vkMapMemory(device, mem, offset, size, 0, (void **)&ptr); RDCASSERTEQUAL(vkr, VK_SUCCESS); + + if(createFlags & eGPUBufferReadback) + { + VkMappedMemoryRange range = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, mem, offset, size, + }; + + vkr = m_pDriver->vkInvalidateMappedMemoryRanges(device, 1, &range); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + } + return ptr; } @@ -232,6 +244,16 @@ void *GPUBuffer::Map(VkDeviceSize &bindoffset, VkDeviceSize usedsize) void GPUBuffer::Unmap() { + if(!(createFlags & eGPUBufferReadback) && !(createFlags & eGPUBufferGPULocal)) + { + VkMappedMemoryRange range = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, mem, 0, VK_WHOLE_SIZE, + }; + + VkResult vkr = m_pDriver->vkFlushMappedMemoryRanges(device, 1, &range); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + } + m_pDriver->vkUnmapMemory(device, mem); } diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 2dc3acddc..fd6c5b419 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -172,6 +172,7 @@ struct GPUBuffer WrappedVulkan *m_pDriver = NULL; VkDevice device = VK_NULL_HANDLE; + uint32_t createFlags = 0; }; // in vk_.cpp diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 94830947a..76a5c20a9 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1402,6 +1402,17 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) RDCASSERT(pData != NULL); + VkMappedMemoryRange range = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, + NULL, + Unwrap(readbackMem.mem), + readbackMem.offs, + readbackMem.size, + }; + + vkr = vt->InvalidateMappedMemoryRanges(Unwrap(device), 1, &range); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + // point sample info into raw buffer { ResourceFormat fmt = MakeResourceFormat(imInfo.format); diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 9a0f09377..772b9f6da 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -1355,6 +1355,13 @@ void VulkanDebugManager::GetBufferData(ResourceId buff, uint64_t offset, uint64_ (void **)&pData); RDCASSERTEQUAL(vkr, VK_SUCCESS); + VkMappedMemoryRange range = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, Unwrap(m_ReadbackWindow.mem), 0, VK_WHOLE_SIZE, + }; + + vkr = vt->InvalidateMappedMemoryRanges(Unwrap(dev), 1, &range); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + RDCASSERT(pData != NULL); memcpy(&ret[dstoffset], pData, (size_t)chunkSize); diff --git a/renderdoc/driver/vulkan/vk_postvs.cpp b/renderdoc/driver/vulkan/vk_postvs.cpp index bef623dc4..b4efc8e68 100644 --- a/renderdoc/driver/vulkan/vk_postvs.cpp +++ b/renderdoc/driver/vulkan/vk_postvs.cpp @@ -1351,6 +1351,13 @@ void VulkanReplay::InitPostVSBuffers(uint32_t eventId) memcpy(idxData, &indices[0], indices.size() * sizeof(uint32_t)); + VkMappedMemoryRange range = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, uniqIdxBufMem, 0, VK_WHOLE_SIZE, + }; + + vkr = m_pDriver->vkFlushMappedMemoryRanges(m_Device, 1, &range); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + m_pDriver->vkUnmapMemory(m_Device, uniqIdxBufMem); // rebase existing index buffer to point to the right elements in our stream-out'd @@ -1399,6 +1406,13 @@ void VulkanReplay::InitPostVSBuffers(uint32_t eventId) memcpy(idxData, idxdata.data(), idxdata.size()); + VkMappedMemoryRange rebasedRange = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, rebasedIdxBufMem, 0, VK_WHOLE_SIZE, + }; + + vkr = m_pDriver->vkFlushMappedMemoryRanges(m_Device, 1, &rebasedRange); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + m_pDriver->vkUnmapMemory(m_Device, rebasedIdxBufMem); } @@ -1685,6 +1699,13 @@ void VulkanReplay::InitPostVSBuffers(uint32_t eventId) } } + VkMappedMemoryRange range = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, vbuffers[attr].mem, 0, VK_WHOLE_SIZE, + }; + + vkr = m_pDriver->vkFlushMappedMemoryRanges(m_Device, 1, &range); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + m_pDriver->vkUnmapMemory(m_Device, vbuffers[attr].mem); } @@ -1968,6 +1989,13 @@ void VulkanReplay::InitPostVSBuffers(uint32_t eventId) byte *byteData = NULL; vkr = m_pDriver->vkMapMemory(m_Device, readbackMem, 0, VK_WHOLE_SIZE, 0, (void **)&byteData); + VkMappedMemoryRange range = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, readbackMem, 0, VK_WHOLE_SIZE, + }; + + vkr = m_pDriver->vkInvalidateMappedMemoryRanges(m_Device, 1, &range); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + // do near/far calculations float nearp = 0.1f; diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 6e57c4dd9..b2394aec8 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -527,6 +527,17 @@ void VulkanReplay::PickPixel(ResourceId texture, uint32_t x, uint32_t y, uint32_ vt->MapMemory(Unwrap(dev), Unwrap(m_PixelPick.ReadbackBuffer.mem), 0, VK_WHOLE_SIZE, 0, (void **)&pData); + VkMappedMemoryRange range = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, + NULL, + Unwrap(m_PixelPick.ReadbackBuffer.mem), + 0, + VK_WHOLE_SIZE, + }; + + vkr = vt->InvalidateMappedMemoryRanges(Unwrap(dev), 1, &range); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + RDCASSERT(pData != NULL); if(pData == NULL) @@ -2893,6 +2904,13 @@ void VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mi vkr = vt->MapMemory(Unwrap(dev), readbackMem, 0, VK_WHOLE_SIZE, 0, (void **)&pData); RDCASSERTEQUAL(vkr, VK_SUCCESS); + VkMappedMemoryRange range = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, readbackMem, 0, VK_WHOLE_SIZE, + }; + + vkr = vt->InvalidateMappedMemoryRanges(Unwrap(dev), 1, &range); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + RDCASSERT(pData != NULL); data.resize(dataSize);