From f4b06de50b10964da71a2ecbe2267be7f4a29f65 Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Sat, 5 Jun 2021 17:48:21 +0200 Subject: [PATCH] [#66] Production ready try&catch trick Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- include/vkcv/Core.hpp | 2 +- projects/cmd_sync_test/src/main.cpp | 4 ++- projects/first_mesh/src/main.cpp | 4 ++- projects/first_triangle/src/main.cpp | 4 ++- src/vkcv/Core.cpp | 46 ++++++++++++++++++---------- 5 files changed, 40 insertions(+), 20 deletions(-) diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp index 81b1defb..01e59191 100644 --- a/include/vkcv/Core.hpp +++ b/include/vkcv/Core.hpp @@ -218,7 +218,7 @@ namespace vkcv /** * @brief start recording command buffers and increment frame index */ - void beginFrame(uint32_t& width, uint32_t& height); + bool beginFrame(uint32_t& width, uint32_t& height); void recordDrawcallsToCmdStream( const CommandStreamHandle cmdStreamHandle, diff --git a/projects/cmd_sync_test/src/main.cpp b/projects/cmd_sync_test/src/main.cpp index e3283fb1..c3455be6 100644 --- a/projects/cmd_sync_test/src/main.cpp +++ b/projects/cmd_sync_test/src/main.cpp @@ -164,7 +164,9 @@ int main(int argc, const char** argv) { vkcv::Window::pollEvents(); uint32_t swapchainWidth, swapchainHeight; - core.beginFrame(swapchainWidth, swapchainHeight); + if (!core.beginFrame(swapchainWidth, swapchainHeight)) { + continue; + } if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) { depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle(); diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp index 97e866c3..cd0e0960 100644 --- a/projects/first_mesh/src/main.cpp +++ b/projects/first_mesh/src/main.cpp @@ -152,7 +152,9 @@ int main(int argc, const char** argv) { continue; uint32_t swapchainWidth, swapchainHeight; - core.beginFrame(swapchainWidth, swapchainHeight); + if (!core.beginFrame(swapchainWidth, swapchainHeight)) { + continue; + } if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) { depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle(); diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp index 70366d13..2ede653f 100644 --- a/projects/first_triangle/src/main.cpp +++ b/projects/first_triangle/src/main.cpp @@ -144,7 +144,9 @@ int main(int argc, const char** argv) { window.pollEvents(); uint32_t swapchainWidth, swapchainHeight; // No resizing = No problem - core.beginFrame(swapchainWidth, swapchainHeight); + if (!core.beginFrame(swapchainWidth, swapchainHeight)) { + continue; + } auto end = std::chrono::system_clock::now(); auto deltatime = end - start; diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp index ddcb0086..908cb617 100644 --- a/src/vkcv/Core.cpp +++ b/src/vkcv/Core.cpp @@ -109,17 +109,23 @@ namespace vkcv Result Core::acquireSwapchainImage() { uint32_t imageIndex; + + vk::Result result; - const auto& acquireResult = m_Context.getDevice().acquireNextImageKHR( - m_swapchain.getSwapchain(), - std::numeric_limits<uint64_t>::max(), - m_SyncResources.swapchainImageAcquired, - nullptr, - &imageIndex, {} - ); + try { + result = m_Context.getDevice().acquireNextImageKHR( + m_swapchain.getSwapchain(), + std::numeric_limits<uint64_t>::max(), + m_SyncResources.swapchainImageAcquired, + nullptr, + &imageIndex, {} + ); + } catch (vk::OutOfDateKHRError e) { + result = vk::Result::eErrorOutOfDateKHR; + } - if (acquireResult != vk::Result::eSuccess) { - std::cerr << vk::to_string(acquireResult) << std::endl; + if (result != vk::Result::eSuccess) { + std::cerr << vk::to_string(result) << std::endl; return Result::ERROR; } @@ -127,7 +133,7 @@ namespace vkcv return Result::SUCCESS; } - void Core::beginFrame(uint32_t& width, uint32_t& height) { + bool Core::beginFrame(uint32_t& width, uint32_t& height) { if (m_swapchain.shouldUpdateSwapchain()) { m_Context.getDevice().waitIdle(); @@ -154,6 +160,8 @@ namespace vkcv width = extent.width; height = extent.height; + + return (m_currentSwapchainImageIndex != std::numeric_limits<uint32_t>::max()); } void Core::recordDrawcallsToCmdStream( @@ -302,16 +310,22 @@ namespace vkcv m_SyncResources.renderFinished, m_SyncResources.swapchainImageAcquired }; - vk::Result presentResult; const vk::SwapchainKHR& swapchain = m_swapchain.getSwapchain(); const vk::PresentInfoKHR presentInfo( waitSemaphores, swapchain, - m_currentSwapchainImageIndex, - presentResult); - queueManager.getPresentQueue().handle.presentKHR(presentInfo); - if (presentResult != vk::Result::eSuccess) { - std::cout << "Error: swapchain present failed" << std::endl; + m_currentSwapchainImageIndex); + + vk::Result result; + + try { + result = queueManager.getPresentQueue().handle.presentKHR(presentInfo); + } catch (vk::OutOfDateKHRError e) { + result = vk::Result::eErrorOutOfDateKHR; + } + + if (result != vk::Result::eSuccess) { + std::cout << "Error: swapchain present failed... " << vk::to_string(result) << std::endl; } } -- GitLab