From 2e25b70cf0677285784c39dcfa8f1dc109d3ee36 Mon Sep 17 00:00:00 2001 From: BearOso Date: Thu, 13 Jun 2024 11:16:36 -0500 Subject: [PATCH] Vulkan: Associate new fence with swapchain image, not frame resources. --- vulkan/vulkan_swapchain.cpp | 28 ++++++++++++++++------------ vulkan/vulkan_swapchain.hpp | 6 +++--- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/vulkan/vulkan_swapchain.cpp b/vulkan/vulkan_swapchain.cpp index bfee445a..5ec08fc3 100644 --- a/vulkan/vulkan_swapchain.cpp +++ b/vulkan/vulkan_swapchain.cpp @@ -80,14 +80,16 @@ void Swapchain::create_render_pass() bool Swapchain::recreate(int new_width, int new_height) { if (swapchain_object) + { wait_on_frames(); + } return create(num_swapchain_images, new_width, new_height); } vk::Image Swapchain::get_image() { - return imageviewfbs[current_swapchain_image].image; + return image_data[current_swapchain_image].image; } bool Swapchain::check_and_resize(int width, int height) @@ -116,7 +118,7 @@ bool Swapchain::check_and_resize(int width, int height) bool Swapchain::create(unsigned int desired_num_swapchain_images, int new_width, int new_height) { frames.clear(); - imageviewfbs.clear(); + image_data.clear(); auto surface_capabilities = physical_device.getSurfaceCapabilitiesKHR(surface).value; @@ -224,7 +226,7 @@ bool Swapchain::create_resources() auto command_buffers = device.allocateCommandBuffersUnique(command_buffer_allocate_info).value; frames.resize(num_swapchain_images); - imageviewfbs.resize(num_swapchain_images); + image_data.resize(num_swapchain_images); vk::FenceCreateInfo fence_create_info(vk::FenceCreateFlagBits::eSignaled); @@ -234,7 +236,6 @@ bool Swapchain::create_resources() auto &frame = frames[i]; frame.command_buffer = std::move(command_buffers[i]); frame.fence = device.createFenceUnique(fence_create_info).value; - frame.freeable = device.createFenceUnique(fence_create_info).value; frame.acquire = device.createSemaphoreUnique({}).value; frame.complete = device.createSemaphoreUnique({}).value; } @@ -242,7 +243,7 @@ bool Swapchain::create_resources() for (unsigned int i = 0; i < num_swapchain_images; i++) { // Create resources associated with swapchain images - auto &image = imageviewfbs[i]; + auto &image = image_data[i]; image.image = swapchain_images[i]; auto image_view_create_info = vk::ImageViewCreateInfo{} .setImage(swapchain_images[i]) @@ -259,6 +260,8 @@ bool Swapchain::create_resources() .setLayers(1) .setRenderPass(render_pass.get()); image.framebuffer = device.createFramebufferUnique(framebuffer_create_info).value; + + image.fence = device.createFenceUnique(fence_create_info).value; } current_swapchain_image = 0; @@ -277,7 +280,7 @@ bool Swapchain::begin_frame() auto &frame = frames[current_frame]; - auto result = device.waitForFences({ frame.fence.get(), frame.freeable.get() }, true, 33333333); + auto result = device.waitForFences({ frame.fence.get() }, true, 33333333); if (result != vk::Result::eSuccess) { printf("Timed out waiting for fence.\n"); @@ -350,8 +353,9 @@ bool Swapchain::swap() present_mode_info.setPresentModes(present_mode); present_info.setPNext(&present_mode_info); - device.resetFences(frames[current_frame].freeable.get()); - vk::SwapchainPresentFenceInfoEXT present_fence_info(frames[current_frame].freeable.get()); + auto &present_fence = image_data[current_swapchain_image].fence.get(); + device.resetFences(present_fence); + vk::SwapchainPresentFenceInfoEXT present_fence_info(present_fence); present_mode_info.setPNext(&present_fence_info); vk::Result result = queue.presentKHR(present_info); @@ -376,7 +380,7 @@ bool Swapchain::end_frame() vk::Framebuffer Swapchain::get_framebuffer() { - return imageviewfbs[current_swapchain_image].framebuffer.get(); + return image_data[current_swapchain_image].framebuffer.get(); } vk::CommandBuffer &Swapchain::get_cmd() @@ -393,7 +397,7 @@ void Swapchain::begin_render_pass() auto render_pass_begin_info = vk::RenderPassBeginInfo{} .setRenderPass(render_pass.get()) - .setFramebuffer(imageviewfbs[current_swapchain_image].framebuffer.get()) + .setFramebuffer(image_data[current_swapchain_image].framebuffer.get()) .setRenderArea(vk::Rect2D({}, extents)) .setClearValues(value); get_cmd().beginRenderPass(render_pass_begin_info, vk::SubpassContents::eInline); @@ -412,13 +416,13 @@ void Swapchain::end_render_pass() bool Swapchain::wait_on_frame(int frame_num) { - auto result = device.waitForFences({ frames[frame_num].fence.get(), frames[frame_num].freeable.get() }, true, 133000000); + auto result = device.waitForFences({ image_data[frame_num].fence.get() }, true, 33000000); return (result == vk::Result::eSuccess); } void Swapchain::wait_on_frames() { - for (auto i = 0; i < frames.size(); i++) + for (auto i = 0; i < image_data.size(); i++) wait_on_frame(i); } diff --git a/vulkan/vulkan_swapchain.hpp b/vulkan/vulkan_swapchain.hpp index 2fd65695..8159ee73 100644 --- a/vulkan/vulkan_swapchain.hpp +++ b/vulkan/vulkan_swapchain.hpp @@ -45,15 +45,15 @@ class Swapchain struct Frame { vk::UniqueFence fence; - vk::UniqueFence freeable; vk::UniqueSemaphore acquire; vk::UniqueSemaphore complete; vk::UniqueCommandBuffer command_buffer; }; - struct ImageViewFB + struct ImageData { vk::Image image; + vk::UniqueFence fence; vk::UniqueImageView image_view; vk::UniqueFramebuffer framebuffer; }; @@ -70,7 +70,7 @@ class Swapchain bool supports_immediate = false; bool supports_mailbox = false; std::vector frames; - std::vector imageviewfbs; + std::vector image_data; vk::Device device; vk::SurfaceKHR surface;