Browse Source

Add framebuffers

Kajetan Johannes Hammerle 2 months ago
parent
commit
30255e0d1e
3 changed files with 51 additions and 39 deletions
  1. 39 35
      src/VulkanUtils.c
  2. 5 0
      src/VulkanUtils.h
  3. 7 4
      src/VulkanWrapper.c

+ 39 - 35
src/VulkanUtils.c

@@ -370,7 +370,7 @@ static bool createImageView(
 bool initVulkanSwapchainImages(
     VulkanSwapchainImages* si, VkDevice d, VkSwapchainKHR sc, VkFormat format) {
     VK_ASSERT(vkGetSwapchainImagesKHR(d, sc, &si->amount, nullptr));
-    si->images = coreAllocate(sizeof(VkImage) * si->amount);
+    si->images = coreZeroAllocate(sizeof(VkImage) * si->amount);
     si->imageViews = coreZeroAllocate(sizeof(VkImageView) * si->amount);
     VK_ASSERT(vkGetSwapchainImagesKHR(d, sc, &si->amount, si->images));
     for(u32 x = 0; x < si->amount; x++) {
@@ -382,7 +382,7 @@ bool initVulkanSwapchainImages(
 }
 
 void destroyVulkanSwapchainImages(VulkanSwapchainImages* si, VkDevice d) {
-    if(d == VK_NULL_HANDLE) {
+    if(d == VK_NULL_HANDLE || si == nullptr) {
         return;
     }
     for(size_t x = 0; x < si->amount; x++) {
@@ -452,6 +452,36 @@ void destroyVulkanPipelineLayout(VkPipelineLayout pl, VkDevice d) {
     }
 }
 
+bool initVulkanFramebuffers(
+    VkFramebuffer** f, VulkanSwapchainImages* si, VkDevice d, VkRenderPass rp,
+    u32 width, u32 height) {
+    *f = coreZeroAllocate(sizeof(VkFramebuffer) * si->amount);
+    for(u32 i = 0; i < si->amount; i++) {
+        VkFramebufferCreateInfo info = {
+            .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
+            .renderPass = rp,
+            .attachmentCount = 1,
+            .pAttachments = si->imageViews + i,
+            .width = width,
+            .height = height,
+            .layers = 1};
+        VK_ASSERT(vkCreateFramebuffer(d, &info, nullptr, (*f) + i));
+    }
+    return false;
+}
+
+void destroyVulkanFramebuffers(VkFramebuffer** f, u32 amount, VkDevice d) {
+    if(f != nullptr) {
+        if(d != VK_NULL_HANDLE && *f != nullptr) {
+            for(u32 i = 0; i < amount; i++) {
+                vkDestroyFramebuffer(d, (*f)[i], nullptr);
+            }
+        }
+        coreFree(*f);
+        *f = nullptr;
+    }
+}
+
 /*static bool initCommandBuffers() {
     VkCommandPoolCreateInfo info = {
         .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
@@ -471,40 +501,13 @@ void destroyVulkanPipelineLayout(VkPipelineLayout pl, VkDevice d) {
 }
 
 static void destroyCommandBuffers() {
-    if(vk.swapchain.commandPool != VK_NULL_HANDLE && vk.swapchain.amount > 0) {
-        vkFreeCommandBuffers(
-            vk.device.logical, vk.swapchain.commandPool, vk.swapchain.amount,
-            vk.swapchain.commandsBuffers);
+    if(vk.swapchain.commandPool != VK_NULL_HANDLE && vk.swapchain.amount >
+0) { vkFreeCommandBuffers( vk.device.logical, vk.swapchain.commandPool,
+vk.swapchain.amount, vk.swapchain.commandsBuffers);
     }
     coreFree(vk.swapchain.commandsBuffers);
-    vkDestroyCommandPool(vk.device.logical, vk.swapchain.commandPool, nullptr);
-}
-
-static bool initFramebuffers() {
-    vk.swapchain.framebuffers =
-        coreAllocate(sizeof(VkFramebuffer) * vk.swapchain.amount);
-    for(u32 i = 0; i < vk.swapchain.amount; i++) {
-        VkFramebufferCreateInfo info = {
-            .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
-            .renderPass = vk.renderPass,
-            .attachmentCount = 1,
-            .pAttachments = vk.swapchain.imageViews + i,
-            .width = vk.width,
-            .height = vk.height,
-            .layers = 1};
-        VK_ASSERT(vkCreateFramebuffer(
-            vk.device.logical, &info, nullptr, vk.swapchain.framebuffers + i));
-    }
-    printf("%u\n", vk.swapchain.amount);
-    return false;
-}
-
-static void destroyFramebuffers() {
-    for(u32 i = 0; i < vk.swapchain.amount; i++) {
-        vkDestroyFramebuffer(
-            vk.device.logical, vk.swapchain.framebuffers[i], nullptr);
-    }
-    coreFree(vk.swapchain.framebuffers);
+    vkDestroyCommandPool(vk.device.logical, vk.swapchain.commandPool,
+nullptr);
 }
 
 static bool fillCommandBuffer(u32 index) {
@@ -518,7 +521,8 @@ static bool fillCommandBuffer(u32 index) {
     //     .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
     //     .renderPass = vk.renderPass,
     //     .framebuffer = vk.swapchain.framebuffers[index],
-    //     .renderArea = {.offset = {0, 0}, .extent = {vk.width, vk.height}},
+    //     .renderArea = {.offset = {0, 0}, .extent = {vk.width,
+vk.height}},
     //     .clearValueCount = 1,
     //     .pClearValues = &v};
     // vkCmdBeginRenderPass(vk.swapchain.commandsBuffers[index], &rInfo,

+ 5 - 0
src/VulkanUtils.h

@@ -86,4 +86,9 @@ void destroyVulkanShaderModule(VkShaderModule sm, VkDevice d);
 bool initVulkanPipelineLayout(VkPipelineLayout* pl, VkDevice d);
 void destroyVulkanPipelineLayout(VkPipelineLayout pl, VkDevice d);
 
+bool initVulkanFramebuffers(
+    VkFramebuffer** f, VulkanSwapchainImages* si, VkDevice d, VkRenderPass rp,
+    u32 width, u32 height);
+void destroyVulkanFramebuffers(VkFramebuffer** f, u32 amount, VkDevice d);
+
 #endif

+ 7 - 4
src/VulkanWrapper.c

@@ -8,7 +8,6 @@
 
 // VkCommandPool commandPool;
 // VkCommandBuffer* commandsBuffers;
-// VkFramebuffer* framebuffers;
 // VkSemaphore semaphore;
 // VkSemaphore renderSemaphore;
 
@@ -28,6 +27,7 @@ static VkShaderModule fragmentShaderModule;
 static VkPipelineLayout pipelineLayout;
 static VkRenderPass renderPass;
 static VkPipeline pipeline;
+static VkFramebuffer* framebuffers;
 
 static int getSurfaceFormatPoints(const VkSurfaceFormatKHR* sf) {
     if(sf->format == VK_FORMAT_B8G8R8A8_UNORM &&
@@ -348,10 +348,13 @@ bool initVulkan() {
            initVulkanSurface(&surface, getWindow()) || initPhysicalDevice() ||
            initDevice() || initSwapchain() || initSwapchainImages() ||
            initShaders() || initVulkanPipelineLayout(&pipelineLayout, device) ||
-           initRenderPass() || initPipeline();
+           initRenderPass() || initPipeline() ||
+           initVulkanFramebuffers(
+               &framebuffers, &images, device, renderPass, swapchainSize.width,
+               swapchainSize.height);
     /*  || initSemaphore(&vk.semaphore) ||
        initSemaphore(&vk.renderSemaphore) || initCommandBuffers() ||
-        || initFramebuffers()*/
+     */
 }
 
 void renderVulkan() {
@@ -359,10 +362,10 @@ void renderVulkan() {
 
 void destroyVulkan(void) {
     if(device != VK_NULL_HANDLE) {
-        //     destroyFramebuffers();
         //     destroyCommandBuffers();
         //     destroySemaphore(vk.semaphore);
         //     destroySemaphore(vk.renderSemaphore);
+        destroyVulkanFramebuffers(&framebuffers, images.amount, device);
         vkDestroyPipeline(device, pipeline, nullptr);
         vkDestroyRenderPass(device, renderPass, nullptr);
     }