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