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