diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-10-16 08:28:46 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-10-16 08:28:46 -0400 |
| commit | 611eba4565b6f25881a6294696ea10492c025ec4 (patch) | |
| tree | 9bbb7c0185df12334f0de9b8f3c15374e045227f /src/window.cpp | |
| parent | 4c2b44bd3d1bee953712e4ab92b0cf9402288f18 (diff) | |
keep track of UBO buffer offsets so we can update the UBO accurately
Diffstat (limited to 'src/window.cpp')
| -rw-r--r-- | src/window.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/window.cpp b/src/window.cpp index 279c876..c7b9dba 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -92,6 +92,7 @@ UniformBufferObject UBO{ .proj = glm::mat4(1), }; VkDeviceMemory uniformBufferMemory; +VkDeviceSize paddedUboBufferSize; // public VkBuffer UniformBuffers[MAX_FRAMES_IN_FLIGHT]; @@ -1216,25 +1217,31 @@ void CreateUniformBuffers() { vkBufferCreateInfo.queueFamilyIndexCount = graphicsFamilyIndex == transferFamilyIndex ? 1 : 2; vkBufferCreateInfo.pQueueFamilyIndices = queueFamilyIndexes; - vkCreateBuffer(vkDevice, &vkBufferCreateInfo, vkAllocator, &UniformBuffers[0]); + VkResult result; + result = vkCreateBuffer(vkDevice, &vkBufferCreateInfo, vkAllocator, &UniformBuffers[0]); + assert(result == VK_SUCCESS); VkMemoryRequirements memReqs; vkGetBufferMemoryRequirements(vkDevice, UniformBuffers[0], &memReqs); + paddedUboBufferSize = memReqs.size + (memReqs.alignment - (memReqs.size & memReqs.alignment)); VkMemoryAllocateInfo vkMemoryAllocateInfo; vkMemoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; vkMemoryAllocateInfo.pNext = nullptr; - vkMemoryAllocateInfo.allocationSize = memReqs.size * MAX_FRAMES_IN_FLIGHT; + vkMemoryAllocateInfo.allocationSize = paddedUboBufferSize * MAX_FRAMES_IN_FLIGHT; vkMemoryAllocateInfo.memoryTypeIndex = FindMemoryTypeIndex(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); - vkAllocateMemory(vkDevice, &vkMemoryAllocateInfo, vkAllocator, &uniformBufferMemory); + result = vkAllocateMemory(vkDevice, &vkMemoryAllocateInfo, vkAllocator, &uniformBufferMemory); + assert(result == VK_SUCCESS); vkDestroyBuffer(vkDevice, UniformBuffers[0], vkAllocator); - vkBufferCreateInfo.size = memReqs.size; + vkBufferCreateInfo.size = paddedUboBufferSize; for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) { - vkCreateBuffer(vkDevice, &vkBufferCreateInfo, vkAllocator, &UniformBuffers[i]); - vkBindBufferMemory(vkDevice, UniformBuffers[i], uniformBufferMemory, memReqs.size * i); + result = vkCreateBuffer(vkDevice, &vkBufferCreateInfo, vkAllocator, &UniformBuffers[i]); + assert(result == VK_SUCCESS); + result = vkBindBufferMemory(vkDevice, UniformBuffers[i], uniformBufferMemory, paddedUboBufferSize * i); + assert(result == VK_SUCCESS); } } @@ -2456,7 +2463,7 @@ void Render() { // update uniform buffer { void *mappedUboMemory; - vkMapMemory(vkDevice, uniformBufferMemory, sizeof(UniformBufferObject) * imageIndex, sizeof(UniformBufferObject), 0, &mappedUboMemory); + vkMapMemory(vkDevice, uniformBufferMemory, paddedUboBufferSize * imageIndex, sizeof(UniformBufferObject), 0, &mappedUboMemory); memcpy(mappedUboMemory, &UBO, sizeof(UniformBufferObject)); vkUnmapMemory(vkDevice, uniformBufferMemory); } |
