From 9278af463a8760d07a87e094f05931086908edc7 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 17 Apr 2017 11:53:08 +0100 Subject: [PATCH] Check for sparse buffer memory requirements when unbinding. Refs #580 * If a buffer is small, its memory requirements might be aligned up to a larger value for sparse binding. --- renderdoc/driver/vulkan/vk_initstate.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index 48c6c06dc..554c65d6f 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -740,10 +740,14 @@ bool WrappedVulkan::Apply_SparseInitialState(WrappedVkBuffer *buf, // unbind the entire buffer so that any new areas that are bound are unbound again - VkSparseMemoryBind unbind = {0, m_CreationInfo.m_Buffer[buf->id].size, VK_NULL_HANDLE, 0, 0}; - VkQueue q = GetQ(); + VkMemoryRequirements mrq = {}; + ObjDisp(q)->GetBufferMemoryRequirements(Unwrap(GetDev()), buf->real.As(), &mrq); + + VkSparseMemoryBind unbind = {0, RDCMAX(mrq.size, m_CreationInfo.m_Buffer[buf->id].size), + VK_NULL_HANDLE, 0, 0}; + VkSparseBufferMemoryBindInfo bufBind = {buf->real.As(), 1, &unbind}; // this semaphore separates the unbind and bind, as there isn't an ordering guarantee