summaryrefslogtreecommitdiff
path: root/src/window.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/window.cpp')
-rw-r--r--src/window.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/window.cpp b/src/window.cpp
index 8e91184..de391a2 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -60,6 +60,8 @@ VkCommandBuffer presentCommandBuffers[MAX_FRAMES_IN_FLIGHT];
VkSemaphore presentImageAvailableSemaphores[MAX_FRAMES_IN_FLIGHT];
VkSemaphore presentRenderFinishedSemaphores[MAX_FRAMES_IN_FLIGHT];
VkFence presentInFlightFences[MAX_FRAMES_IN_FLIGHT];
+VkDeviceMemory uniformBufferMemory;
+VkBuffer uniformBuffers[MAX_FRAMES_IN_FLIGHT];
/*
* ImGui
@@ -955,6 +957,40 @@ void CreateCommandBuffer() {
}
}
+void CreateUniformBuffers() {
+ uint32_t queueFamilyIndexes[2] = {graphicsFamilyIndex, transferFamilyIndex};
+ VkBufferCreateInfo vkBufferCreateInfo;
+ vkBufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ vkBufferCreateInfo.pNext = nullptr;
+ vkBufferCreateInfo.flags = {};
+ vkBufferCreateInfo.size = sizeof(UniformBufferObject);
+ vkBufferCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
+ vkBufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ vkBufferCreateInfo.queueFamilyIndexCount = graphicsFamilyIndex == transferFamilyIndex ? 1 : 2;
+ vkBufferCreateInfo.pQueueFamilyIndices = queueFamilyIndexes;
+
+ vkCreateBuffer(vkDevice, &vkBufferCreateInfo, vkAllocator, &uniformBuffers[0]);
+
+ VkMemoryRequirements memReqs;
+ vkGetBufferMemoryRequirements(vkDevice, uniformBuffers[0], &memReqs);
+
+ VkMemoryAllocateInfo vkMemoryAllocateInfo;
+ vkMemoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ vkMemoryAllocateInfo.pNext = nullptr;
+ vkMemoryAllocateInfo.allocationSize = memReqs.size * 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);
+
+ vkDestroyBuffer(vkDevice, uniformBuffers[0], vkAllocator);
+ vkBufferCreateInfo.size = memReqs.size;
+
+ for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
+ vkCreateBuffer(vkDevice, &vkBufferCreateInfo, vkAllocator, &uniformBuffers[i]);
+ vkBindBufferMemory(vkDevice, uniformBuffers[i], uniformBufferMemory, memReqs.size * i);
+ }
+}
+
void CreateSyncObjects() {
VkSemaphoreCreateInfo semaphoreInfo;
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -1207,6 +1243,7 @@ void CreateWindow(PKEWindowProperties *wp) {
CreateFramebuffers();
CreateCommandPool();
CreateCommandBuffer();
+ CreateUniformBuffers();
CreateSyncObjects();
CreateImGui();
}
@@ -1218,10 +1255,12 @@ void DestroyWindow() {
ImGui::DestroyContext();
DestroySwapchain();
for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
+ vkDestroyBuffer(vkDevice, uniformBuffers[i], vkAllocator);
vkDestroySemaphore(vkDevice, presentImageAvailableSemaphores[i], vkAllocator);
vkDestroySemaphore(vkDevice, presentRenderFinishedSemaphores[i], vkAllocator);
vkDestroyFence(vkDevice, presentInFlightFences[i], vkAllocator);
}
+ vkFreeMemory(vkDevice, uniformBufferMemory, vkAllocator);
vkDestroyCommandPool(vkDevice, graphicsCommandPool, vkAllocator);
vkDestroyCommandPool(vkDevice, transferCommandPool, vkAllocator);
vkDestroyPipeline(vkDevice, graphicsPipeline, vkAllocator);