diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/window.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/window.cpp b/src/window.cpp index dc6de6f..e8a4b4a 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -44,6 +44,7 @@ VkRenderPass renderPass; VkDescriptorSetLayout vkDescriptorSetLayout; VkPipelineLayout pipelineLayout; VkPipeline graphicsPipeline; +VkFramebuffer *swapchainFramebuffers = nullptr; const std::vector<const char *> REQUIRED_EXTENSIONS = std::vector<const char *> { VK_KHR_SWAPCHAIN_EXTENSION_NAME @@ -648,7 +649,37 @@ void CreateGraphicsPipeline() { DestroyAsset(vertShaderAsset); } +void CreateFramebuffers() { + assert(swapchainFramebuffers == nullptr || swapchainFramebuffers == CAFE_BABE(VkFramebuffer)); + swapchainFramebuffers = pke::PkeNew<VkFramebuffer>(swapchainLength); + + VkFramebufferCreateInfo framebufferInfo{}; + framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; + framebufferInfo.renderPass = renderPass; + framebufferInfo.attachmentCount = 1; + framebufferInfo.width = extent.width; + framebufferInfo.height = extent.height; + framebufferInfo.layers = 1; + + for (long i = 0; i < swapchainLength; ++i) { + VkImageView attachments[] = { + swapchainImageViews[i] + }; + framebufferInfo.pAttachments = attachments; + auto result = vkCreateFramebuffer(vkDevice, &framebufferInfo, vkAllocator, &swapchainFramebuffers[i]); + if (result != VK_SUCCESS) { + throw "failed to create framebuffer"; + } + } +} + void DestroySwapchain() { + if (swapchainFramebuffers != nullptr && swapchainFramebuffers != CAFE_BABE(VkFramebuffer)) { + for (long i = 0; i < swapchainLength; ++i) { + vkDestroyFramebuffer(vkDevice, swapchainFramebuffers[i], vkAllocator); + } + pke::PkeDelete<VkFramebuffer>(swapchainFramebuffers, swapchainLength); + } if (swapchainImageViews!= nullptr && swapchainImageViews != CAFE_BABE(VkImageView)) { for (long i = 0; i < swapchainLength; ++i) { vkDestroyImageView(vkDevice, swapchainImageViews[i], vkAllocator); @@ -659,6 +690,7 @@ void DestroySwapchain() { vkDestroySwapchainKHR(vkDevice, vkSwapchainKHR, vkAllocator); swapchainImages = CAFE_BABE(VkImage); swapchainImageViews = CAFE_BABE(VkImageView); + swapchainFramebuffers = CAFE_BABE(VkFramebuffer); } void FramebufferResizeCallback(GLFWwindow *window, int width, int height) { @@ -681,6 +713,7 @@ void CreateWindow(PKEWindowProperties *wp) { CreateSwapchain(); CreateRenderPass(); CreateGraphicsPipeline(); + CreateFramebuffers(); } void DestroyWindow() { |
