From d76b0dd8ff1ee01c8aabaec1311153f207f87169 Mon Sep 17 00:00:00 2001 From: Tony Wasserka Date: Sun, 29 Sep 2024 16:08:39 +0200 Subject: [PATCH] Properly handle VK_SUBOPTIMAL_KHR --- source/gui-sdl/sdl_vulkan_display.hpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source/gui-sdl/sdl_vulkan_display.hpp b/source/gui-sdl/sdl_vulkan_display.hpp index 50abd12..4c75217 100644 --- a/source/gui-sdl/sdl_vulkan_display.hpp +++ b/source/gui-sdl/sdl_vulkan_display.hpp @@ -338,9 +338,15 @@ public: device->waitForFences({*current_frame->render_finished_fence}, true, std::numeric_limits::max()); auto [result, next_image_index] = device->acquireNextImageKHR(*swapchain, std::numeric_limits::max(), *current_frame->image_available_semaphore, vk::Fence { }); - if (result != vk::Result::eSuccess) { + if (result != vk::Result::eSuccess && result != vk::Result::eSuboptimalKHR) { throw std::runtime_error(fmt::format("Unexpected error in vkAcquireNextImageKHR: {}", vk::to_string(result))); } + if (result == vk::Result::eSuboptimalKHR) { + device->waitIdle(); + CreateSwapchain(); + BeginFrame(); + return; + } if (!current_frame->render_finished_fence_awaitable.IsReady(*device)) { // Reset CPUAwaitable throw std::runtime_error("Couldn't wait on previous UI frame"); @@ -462,7 +468,11 @@ public: vk::PresentInfoKHR info { 1, &*current_frame->render_finished_semaphore, 1, &*swapchain, ¤t_frame->image_index }; auto result = present_queue.presentKHR(info); - if (result != vk::Result::eSuccess) { + if (result == vk::Result::eSuboptimalKHR) { + // TODO: Other drivers might actually return other error codes on resize + device->waitIdle(); + CreateSwapchain(); + } else if (result != vk::Result::eSuccess) { // TODO: On VK_ERROR_OUT_OF_DATE_KHR, we should recreate the swap chain! logger->error("Error in vkQueuePresentKHR: {}", vk::to_string(result)); throw std::runtime_error("Error in vkQueuePresentKHR");