From 7541b49c95c04f00f48d6fd02e8a7aa46feb6262 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 1 Oct 2020 15:33:15 +0100 Subject: [PATCH] Fix readback window being always allocated. Closes #2060 * This should only be allocated when the config flag isn't disabled and when it's needed, but we were always allocating it during capture. * We also only allocate as much as is needed, since it seems on AMD linux the CPU memory can actually be quite arbitrarily constrained. --- renderdoc/driver/vulkan/vk_debug.cpp | 22 +++++++++---------- renderdoc/driver/vulkan/vk_debug.h | 2 +- .../driver/vulkan/wrappers/vk_queue_funcs.cpp | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 8920dcd80..4ba199737 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -754,14 +754,6 @@ VulkanDebugManager::VulkanDebugManager(WrappedVulkan *driver) { m_ReadbackWindow.Create(driver, dev, STAGE_BUFFER_BYTE_SIZE, 1, GPUBuffer::eGPUBufferReadback); } - else - { - m_ReadbackWindow.Create(driver, dev, 256 * 1024 * 1024ULL, 1, GPUBuffer::eGPUBufferReadback); - - vkr = ObjDisp(dev)->MapMemory(Unwrap(dev), Unwrap(m_ReadbackWindow.mem), 0, VK_WHOLE_SIZE, 0, - (void **)&m_ReadbackPtr); - RDCASSERTEQUAL(vkr, VK_SUCCESS); - } } VulkanDebugManager::~VulkanDebugManager() @@ -2167,12 +2159,20 @@ void VulkanDebugManager::FillWithDiscardPattern(VkCommandBuffer cmd, DiscardType DoPipelineBarrier(cmd, 1, &dstimBarrier); } -void VulkanDebugManager::InitReadbackBuffer() +void VulkanDebugManager::InitReadbackBuffer(VkDeviceSize sz) { - if(m_ReadbackWindow.buf == VK_NULL_HANDLE) + if(m_ReadbackWindow.buf == VK_NULL_HANDLE || m_ReadbackWindow.sz < sz) { + if(m_ReadbackWindow.buf != VK_NULL_HANDLE) + { + m_ReadbackWindow.Destroy(); + } + VkDevice dev = m_pDriver->GetDev(); - m_ReadbackWindow.Create(m_pDriver, dev, 256 * 1024 * 1024ULL, 1, GPUBuffer::eGPUBufferReadback); + m_ReadbackWindow.Create(m_pDriver, dev, AlignUp(sz, (VkDeviceSize)4096), 1, + GPUBuffer::eGPUBufferReadback); + + RDCLOG("Allocating readback window of %llu bytes", m_ReadbackWindow.sz); VkResult vkr = ObjDisp(dev)->MapMemory(Unwrap(dev), Unwrap(m_ReadbackWindow.mem), 0, VK_WHOLE_SIZE, 0, (void **)&m_ReadbackPtr); diff --git a/renderdoc/driver/vulkan/vk_debug.h b/renderdoc/driver/vulkan/vk_debug.h index 339512525..fcf0d8230 100644 --- a/renderdoc/driver/vulkan/vk_debug.h +++ b/renderdoc/driver/vulkan/vk_debug.h @@ -72,7 +72,7 @@ public: VkImageLayout curLayout, VkImageSubresourceRange discardRange, VkRect2D discardRect); - void InitReadbackBuffer(); + void InitReadbackBuffer(VkDeviceSize sz); 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 8f0b9d51d..a2c22cfe6 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -1055,7 +1055,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, RDCDEBUG("Reading back %s with GPU for comparison", ToStr(record->GetResourceID()).c_str()); - GetDebugManager()->InitReadbackBuffer(); + GetDebugManager()->InitReadbackBuffer(state.mapOffset + state.mapSize); // 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