From 1adcfe6082aba2bf993319691e677082287090e5 Mon Sep 17 00:00:00 2001 From: Clement Sibille Date: Wed, 11 Dec 2024 17:48:13 +0100 Subject: Add swapchain framebuffers --- src/main.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 8dbf720..1d65fd8 100644 --- a/src/main.c +++ b/src/main.c @@ -35,6 +35,7 @@ struct vulkan_renderer { VkRenderPass render_pass; VkPipelineLayout pipeline_layout; VkPipeline pipeline; + VkFramebuffer swapchain_framebuffers[MAX_SWAPCHAIN_IMAGE_COUNT]; uint32_t swapchain_image_count; bool enable_validation_layers; }; @@ -829,6 +830,31 @@ bool vulkan_renderer_create_render_pass(struct vulkan_renderer *renderer) { return true; } +bool vulkan_renderer_create_framebuffers(struct vulkan_renderer *renderer) { + for (uint32_t swapchain_image_view_index = 0; + swapchain_image_view_index < renderer->swapchain_image_count; + swapchain_image_view_index++) { + VkImageView attachments[] = { + renderer->swapchain_image_views[swapchain_image_view_index]}; + + if (vkCreateFramebuffer( + renderer->device, + &(const VkFramebufferCreateInfo){ + .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, + .renderPass = renderer->render_pass, + .attachmentCount = 1, + .pAttachments = attachments, + .width = renderer->swapchain_extent.width, + .height = renderer->swapchain_extent.height, + .layers = 1}, + NULL, + &renderer->swapchain_framebuffers[swapchain_image_view_index]) != + VK_SUCCESS) { + return false; + } + } + return true; +} bool vulkan_renderer_init(struct vulkan_renderer *renderer, SDL_Window *window) { assert(renderer); @@ -893,8 +919,15 @@ bool vulkan_renderer_init(struct vulkan_renderer *renderer, goto destroy_render_pass; } + if (!vulkan_renderer_create_framebuffers(renderer)) { + LOG("Couldn't create framebuffers"); + goto destroy_graphics_pipeline; + } + return true; +destroy_graphics_pipeline: + vkDestroyPipeline(renderer->device, renderer->pipeline, NULL); destroy_render_pass: vkDestroyPipelineLayout(renderer->device, renderer->pipeline_layout, NULL); vkDestroyRenderPass(renderer->device, renderer->render_pass, NULL); @@ -923,6 +956,13 @@ err: } void vulkan_renderer_deinit(struct vulkan_renderer *renderer) { + for (uint32_t framebuffer_index = 0; + framebuffer_index < renderer->swapchain_image_count; + framebuffer_index++) { + vkDestroyFramebuffer(renderer->device, + renderer->swapchain_framebuffers[framebuffer_index], + NULL); + } vkDestroyPipeline(renderer->device, renderer->pipeline, NULL); vkDestroyPipelineLayout(renderer->device, renderer->pipeline_layout, NULL); vkDestroyRenderPass(renderer->device, renderer->render_pass, NULL); -- cgit v1.2.3