From 8f91342f339a869ee031c67e7da2e81a470f1eb8 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 16 Oct 2015 13:22:21 +0200 Subject: [PATCH] Check memory requirements for buffers when preparing initial state --- renderdoc/driver/vulkan/vk_initstate.cpp | 45 +++++++++++++----------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index da174c0a3..ddbc1f3ae 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -67,27 +67,6 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) VkCmdBuffer cmd = GetCmd(); VkDeviceMemory mem = VK_NULL_HANDLE; - - // VKTODOMED should get mem requirements for buffer - copy might enforce - // some restrictions? - VkMemoryRequirements mrq = { meminfo.size, 16, ~0U }; - - VkMemoryAllocInfo allocInfo = { - VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO, NULL, - meminfo.size, GetReadbackMemoryIndex(mrq.memoryTypeBits), - }; - - vkr = ObjDisp(d)->AllocMemory(Unwrap(d), &allocInfo, &mem); - RDCASSERT(vkr == VK_SUCCESS); - - GetResourceManager()->WrapResource(Unwrap(d), mem); - - VkCmdBufferBeginInfo beginInfo = { VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO, NULL, VK_CMD_BUFFER_OPTIMIZE_SMALL_BATCH_BIT | VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT }; - - vkr = ObjDisp(d)->ResetCommandBuffer(Unwrap(cmd), 0); - RDCASSERT(vkr == VK_SUCCESS); - vkr = ObjDisp(d)->BeginCommandBuffer(Unwrap(cmd), &beginInfo); - RDCASSERT(vkr == VK_SUCCESS); VkBufferCreateInfo bufInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, NULL, @@ -102,12 +81,36 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) RDCASSERT(vkr == VK_SUCCESS); vkr = ObjDisp(d)->CreateBuffer(Unwrap(d), &bufInfo, &dstBuf); RDCASSERT(vkr == VK_SUCCESS); + + VkMemoryRequirements mrq = { 0 }; + vkr = ObjDisp(d)->GetBufferMemoryRequirements(Unwrap(d), srcBuf, &mrq); + RDCASSERT(vkr == VK_SUCCESS); + + VkMemoryAllocInfo allocInfo = { + VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO, NULL, + meminfo.size, GetReadbackMemoryIndex(mrq.memoryTypeBits), + }; + + allocInfo.allocationSize = AlignUp(allocInfo.allocationSize, mrq.alignment); + + vkr = ObjDisp(d)->AllocMemory(Unwrap(d), &allocInfo, &mem); + RDCASSERT(vkr == VK_SUCCESS); + + GetResourceManager()->WrapResource(Unwrap(d), mem); + vkr = ObjDisp(d)->BindBufferMemory(Unwrap(d), srcBuf, ToHandle(res), 0); RDCASSERT(vkr == VK_SUCCESS); vkr = ObjDisp(d)->BindBufferMemory(Unwrap(d), dstBuf, Unwrap(mem), 0); RDCASSERT(vkr == VK_SUCCESS); + VkCmdBufferBeginInfo beginInfo = { VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO, NULL, VK_CMD_BUFFER_OPTIMIZE_SMALL_BATCH_BIT | VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT }; + + vkr = ObjDisp(d)->ResetCommandBuffer(Unwrap(cmd), 0); + RDCASSERT(vkr == VK_SUCCESS); + vkr = ObjDisp(d)->BeginCommandBuffer(Unwrap(cmd), &beginInfo); + RDCASSERT(vkr == VK_SUCCESS); + VkBufferCopy region = { 0, 0, meminfo.size }; ObjDisp(d)->CmdCopyBuffer(Unwrap(cmd), srcBuf, dstBuf, 1, ®ion);