diff options
| author | Clement Sibille <clements@lisible.xyz> | 2024-12-11 17:48:13 +0100 | 
|---|---|---|
| committer | Clement Sibille <clements@lisible.xyz> | 2024-12-11 17:48:13 +0100 | 
| commit | 1adcfe6082aba2bf993319691e677082287090e5 (patch) | |
| tree | fbd4e3163b2dea1a45cc0b8767871ea3c4887964 | |
| parent | 7d978e795e75e55aa5578992ccff29f13e0f496d (diff) | |
Add swapchain framebuffers
| -rw-r--r-- | src/main.c | 40 | 
1 files changed, 40 insertions, 0 deletions
@@ -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);  | 
