diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp index 81b1defb95b74ae57b86cc5e581087a3407e6f5a..01e59191af54d0562a9b834d52f96050d0499136 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 e3283fb188c2b15fc84cc05dd8a1be41456dd8fb..c3455be6dadb8f8c0ffd34e52080c80570b3ee58 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 97e866c3687640e6b6c7b489aedf747d15d8dd2b..cd0e096002869a4752affae14ba757e224ca9332 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 70366d1325bc101d9cfaa82272d70afc5a3865ae..2ede653ff98e19159e0155b282cab1b309a13816 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 ddcb0086db0053a4c0afdf70b9b95a27f822567e..908cb617052e67f9ffb62775845ff8e861300d66 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; } }