From dfacf9e8db8a01a7cedb310a3ef0f9f6caa2da83 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 30 Nov 2024 01:08:50 +1000 Subject: [PATCH] VulkanDevice: Only create swap chain framebuffer without dynamic rendering --- src/util/vulkan_swap_chain.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/util/vulkan_swap_chain.cpp b/src/util/vulkan_swap_chain.cpp index 3ba8ec3f3..34bceaf26 100644 --- a/src/util/vulkan_swap_chain.cpp +++ b/src/util/vulkan_swap_chain.cpp @@ -534,13 +534,13 @@ bool VulkanSwapChain::CreateSwapChainImages(VulkanDevice& dev, Error* error) return false; } - Vulkan::FramebufferBuilder fbb; m_images.reserve(image_count); m_current_image = 0; for (u32 i = 0; i < image_count; i++) { Image& image = m_images.emplace_back(); image.image = images[i]; + image.framebuffer = VK_NULL_HANDLE; const VkImageViewCreateInfo view_info = { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, @@ -560,15 +560,19 @@ bool VulkanSwapChain::CreateSwapChainImages(VulkanDevice& dev, Error* error) return false; } - fbb.AddAttachment(image.view); - fbb.SetRenderPass(render_pass); - fbb.SetSize(m_window_info.surface_width, m_window_info.surface_height, 1); - if ((image.framebuffer = fbb.Create(vkdev)) == VK_NULL_HANDLE) + if (!dev.GetOptionalExtensions().vk_khr_dynamic_rendering) { - Error::SetStringView(error, "Failed to create swap chain image framebuffer."); - vkDestroyImageView(vkdev, image.view, nullptr); - m_images.pop_back(); - return false; + Vulkan::FramebufferBuilder fbb; + fbb.AddAttachment(image.view); + fbb.SetRenderPass(render_pass); + fbb.SetSize(m_window_info.surface_width, m_window_info.surface_height, 1); + if ((image.framebuffer = fbb.Create(vkdev)) == VK_NULL_HANDLE) + { + Error::SetStringView(error, "Failed to create swap chain image framebuffer."); + vkDestroyImageView(vkdev, image.view, nullptr); + m_images.pop_back(); + return false; + } } } @@ -621,7 +625,8 @@ void VulkanSwapChain::DestroySwapChainImages() for (const auto& it : m_images) { // don't defer view destruction, images are no longer valid - vkDestroyFramebuffer(vkdev, it.framebuffer, nullptr); + if (it.framebuffer != VK_NULL_HANDLE) + vkDestroyFramebuffer(vkdev, it.framebuffer, nullptr); vkDestroyImageView(vkdev, it.view, nullptr); } m_images.clear();