From 6bb177ec0243f2ac5940b6749ed5ee51f043445b Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 10 Aug 2020 16:09:32 +0100 Subject: [PATCH] Lazily create readback buffer * This means we don't allocate a large buffer even though we won't actually use it. Most important for memory constrained platforms like android. --- renderdoc/driver/vulkan/vk_debug.cpp | 13 +++++++++++++ renderdoc/driver/vulkan/vk_debug.h | 1 + renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp | 2 ++ 3 files changed, 16 insertions(+) diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 7d183a1de..d05c1d905 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -2204,6 +2204,19 @@ void VulkanDebugManager::FillWithDiscardPattern(VkCommandBuffer cmd, DiscardType DoPipelineBarrier(cmd, 1, &dstimBarrier); } +void VulkanDebugManager::InitReadbackBuffer() +{ + if(m_ReadbackWindow.buf == VK_NULL_HANDLE) + { + VkDevice dev = m_pDriver->GetDev(); + m_ReadbackWindow.Create(m_pDriver, dev, 256 * 1024 * 1024ULL, 1, GPUBuffer::eGPUBufferReadback); + + VkResult vkr = ObjDisp(dev)->MapMemory(Unwrap(dev), Unwrap(m_ReadbackWindow.mem), 0, + VK_WHOLE_SIZE, 0, (void **)&m_ReadbackPtr); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + } +} + void VulkanReplay::PatchReservedDescriptors(const VulkanStatePipeline &pipe, VkDescriptorPool &descpool, rdcarray &setLayouts, diff --git a/renderdoc/driver/vulkan/vk_debug.h b/renderdoc/driver/vulkan/vk_debug.h index 5fcea08d0..339512525 100644 --- a/renderdoc/driver/vulkan/vk_debug.h +++ b/renderdoc/driver/vulkan/vk_debug.h @@ -72,6 +72,7 @@ public: VkImageLayout curLayout, VkImageSubresourceRange discardRange, VkRect2D discardRect); + void InitReadbackBuffer(); byte *GetReadbackPtr() { return m_ReadbackPtr; } VkBuffer GetReadbackBuffer() { return m_ReadbackWindow.buf; } VkDeviceMemory GetReadbackMemory() { return m_ReadbackWindow.mem; } diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index de6b3b90a..3f7dfa327 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -1077,6 +1077,8 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, RDCDEBUG("Reading back %s with GPU for comparison", ToStr(record->GetResourceID()).c_str()); + GetDebugManager()->InitReadbackBuffer(); + // immediately issue a command buffer to copy back the data. We do that on this queue to // avoid complexity with synchronising with another queue, but the transfer queue if // available would be better for this purpose.