VulkanDevice: Only create swap chain framebuffer without dynamic rendering

This commit is contained in:
Stenzek 2024-11-30 01:08:50 +10:00
parent ee750b44e3
commit dfacf9e8db
No known key found for this signature in database

View File

@ -534,13 +534,13 @@ bool VulkanSwapChain::CreateSwapChainImages(VulkanDevice& dev, Error* error)
return false; return false;
} }
Vulkan::FramebufferBuilder fbb;
m_images.reserve(image_count); m_images.reserve(image_count);
m_current_image = 0; m_current_image = 0;
for (u32 i = 0; i < image_count; i++) for (u32 i = 0; i < image_count; i++)
{ {
Image& image = m_images.emplace_back(); Image& image = m_images.emplace_back();
image.image = images[i]; image.image = images[i];
image.framebuffer = VK_NULL_HANDLE;
const VkImageViewCreateInfo view_info = { const VkImageViewCreateInfo view_info = {
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
@ -560,15 +560,19 @@ bool VulkanSwapChain::CreateSwapChainImages(VulkanDevice& dev, Error* error)
return false; return false;
} }
fbb.AddAttachment(image.view); if (!dev.GetOptionalExtensions().vk_khr_dynamic_rendering)
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."); Vulkan::FramebufferBuilder fbb;
vkDestroyImageView(vkdev, image.view, nullptr); fbb.AddAttachment(image.view);
m_images.pop_back(); fbb.SetRenderPass(render_pass);
return false; 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) for (const auto& it : m_images)
{ {
// don't defer view destruction, images are no longer valid // 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); vkDestroyImageView(vkdev, it.view, nullptr);
} }
m_images.clear(); m_images.clear();