diff options
Diffstat (limited to 'src/window.cpp')
| -rw-r--r-- | src/window.cpp | 39 |
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); |
