summaryrefslogtreecommitdiff
path: root/src/window.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-10-16 08:28:46 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-10-16 08:28:46 -0400
commit611eba4565b6f25881a6294696ea10492c025ec4 (patch)
tree9bbb7c0185df12334f0de9b8f3c15374e045227f /src/window.cpp
parent4c2b44bd3d1bee953712e4ab92b0cf9402288f18 (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.cpp21
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);
}