summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/window.cpp33
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() {