From 4e217306c05bb8cfe7a71aede05e7a95c030c3c1 Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Sat, 5 Jun 2021 17:15:06 +0200
Subject: [PATCH] [#66] Moved resizing out of event because it is not
 synchronized yet (see #55)

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 include/vkcv/Core.hpp                |  2 +-
 projects/cmd_sync_test/src/main.cpp  | 23 +++++++++++++++--------
 projects/first_mesh/src/main.cpp     | 27 ++++++++++++++++-----------
 projects/first_triangle/src/main.cpp |  5 ++++-
 src/vkcv/Core.cpp                    |  7 ++++++-
 5 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index 67973ba1..81b1defb 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();
+		void 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 55c11577..e3283fb1 100644
--- a/projects/cmd_sync_test/src/main.cpp
+++ b/projects/cmd_sync_test/src/main.cpp
@@ -8,8 +8,9 @@
 int main(int argc, const char** argv) {
 	const char* applicationName = "First Mesh";
 
-	const int windowWidth = 800;
-	const int windowHeight = 600;
+	uint32_t windowWidth = 800;
+	uint32_t windowHeight = 600;
+	
 	vkcv::Window window = vkcv::Window::create(
 		applicationName,
 		windowWidth,
@@ -138,10 +139,6 @@ int main(int argc, const char** argv) {
 
 	vkcv::ImageHandle depthBuffer = core.createImage(vk::Format::eD32Sfloat, windowWidth, windowHeight).getHandle();
 
-	window.e_resize.add([&](int width, int height) {
-		depthBuffer = core.createImage(vk::Format::eD32Sfloat, width, height).getHandle();
-	});
-
 	const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
 
 	const vkcv::DescriptorSetUsage descriptorUsage(0, core.getDescriptorSet(descriptorSet).vulkanHandle);
@@ -164,8 +161,18 @@ int main(int argc, const char** argv) {
 
 	auto start = std::chrono::system_clock::now();
 	while (window.isWindowOpen()) {
-		window.pollEvents();
-		core.beginFrame();
+		vkcv::Window::pollEvents();
+		
+		uint32_t swapchainWidth, swapchainHeight;
+		core.beginFrame(swapchainWidth, swapchainHeight);
+		
+		if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) {
+			depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle();
+			
+			windowWidth = swapchainWidth;
+			windowHeight = swapchainHeight;
+		}
+		
 		auto end = std::chrono::system_clock::now();
 		auto deltatime = end - start;
 		start = end;
diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp
index 27b255c3..97e866c3 100644
--- a/projects/first_mesh/src/main.cpp
+++ b/projects/first_mesh/src/main.cpp
@@ -8,8 +8,8 @@
 int main(int argc, const char** argv) {
 	const char* applicationName = "First Mesh";
 
-	const int windowWidth = 800;
-	const int windowHeight = 600;
+	uint32_t windowWidth = 800;
+	uint32_t windowHeight = 600;
 
 	vkcv::Window window = vkcv::Window::create(
 		applicationName,
@@ -137,10 +137,6 @@ int main(int argc, const char** argv) {
 
 	vkcv::ImageHandle depthBuffer = core.createImage(vk::Format::eD32Sfloat, windowWidth, windowHeight).getHandle();
 
-	window.e_resize.add([&](int width, int height) {
-		depthBuffer = core.createImage(vk::Format::eD32Sfloat, width, height).getHandle();
-	});
-
 	const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
 
 	const vkcv::Mesh renderMesh(vertexBufferBindings, indexBuffer.getVulkanHandle(), mesh.vertexGroups[0].numIndices);
@@ -151,11 +147,20 @@ int main(int argc, const char** argv) {
 	auto start = std::chrono::system_clock::now();
 	while (window.isWindowOpen()) {
         vkcv::Window::pollEvents();
-
-        if(window.getHeight() == 0 || window.getWidth() == 0)
-            continue;
-
-		core.beginFrame();
+		
+		if(window.getHeight() == 0 || window.getWidth() == 0)
+			continue;
+		
+		uint32_t swapchainWidth, swapchainHeight;
+		core.beginFrame(swapchainWidth, swapchainHeight);
+		
+		if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) {
+			depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle();
+			
+			windowWidth = swapchainWidth;
+			windowHeight = swapchainHeight;
+		}
+  
 		auto end = std::chrono::system_clock::now();
 		auto deltatime = end - start;
 		start = end;
diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index b4a08659..70366d13 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -142,7 +142,10 @@ int main(int argc, const char** argv) {
 	while (window.isWindowOpen())
 	{
         window.pollEvents();
-        core.beginFrame();
+		
+		uint32_t swapchainWidth, swapchainHeight; // No resizing = No problem
+		core.beginFrame(swapchainWidth, swapchainHeight);
+		
         auto end = std::chrono::system_clock::now();
         auto deltatime = end - start;
         start = end;
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index c9ac4dec..ddcb0086 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -127,7 +127,7 @@ namespace vkcv
 		return Result::SUCCESS;
 	}
 
-	void Core::beginFrame() {
+	void Core::beginFrame(uint32_t& width, uint32_t& height) {
 		if (m_swapchain.shouldUpdateSwapchain()) {
 			m_Context.getDevice().waitIdle();
 			
@@ -149,6 +149,11 @@ namespace vkcv
     	}
 		
 		m_Context.getDevice().waitIdle(); // TODO: this is a sin against graphics programming, but its getting late - Alex
+		
+		const auto& extent = m_swapchain.getExtent();
+		
+		width = extent.width;
+		height = extent.height;
 	}
 
 	void Core::recordDrawcallsToCmdStream(
-- 
GitLab