From f79ebc8fdde70c1c772ad692b92ef9ba929d823c Mon Sep 17 00:00:00 2001
From: Sebastian Gaida <gaida@ca-digit.com>
Date: Tue, 24 Aug 2021 17:46:13 +0200
Subject: [PATCH] [#89] change imageView handling to SwapchainManager and
 changed Swapchain creation

---
 include/vkcv/SwapchainManager.hpp |  8 +++++-
 include/vkcv/WindowManager.hpp    |  6 ++--
 src/vkcv/SwapchainManager.cpp     | 48 +++++++++++++++++++++++++++++--
 src/vkcv/WindowManager.cpp        |  8 +++---
 4 files changed, 60 insertions(+), 10 deletions(-)

diff --git a/include/vkcv/SwapchainManager.hpp b/include/vkcv/SwapchainManager.hpp
index 197bbc73..5b1648a7 100644
--- a/include/vkcv/SwapchainManager.hpp
+++ b/include/vkcv/SwapchainManager.hpp
@@ -17,6 +17,7 @@ namespace vkcv {
 
 	private:
 
+		Context *m_context;
 		void destroySwapchainById(uint64_t id);
 
 	public:
@@ -32,10 +33,15 @@ namespace vkcv {
 
 		SwapchainManager &operator=(const SwapchainManager &other) = delete;
 
-		SwapchainHandle createSwapchain(Window &window, Context &context);
+		SwapchainHandle createSwapchain(Window &window);
 
 		[[nodiscard]]
 		Swapchain &getSwapchain(const SwapchainHandle handle) const;
 
+		void signalRecreation(const SwapchainHandle handle);
+
+		std::vector<vk::Image> getSwapchainImages(const SwapchainHandle handle);
+
+		std::vector<vk::ImageView> createSwapchainImageViews(SwapchainHandle handle);
 	};
 }
\ No newline at end of file
diff --git a/include/vkcv/WindowManager.hpp b/include/vkcv/WindowManager.hpp
index 3fe66ade..0eae73b4 100644
--- a/include/vkcv/WindowManager.hpp
+++ b/include/vkcv/WindowManager.hpp
@@ -5,9 +5,11 @@
 
 #include "vkcv/Window.hpp"
 #include "vkcv/Handles.hpp"
+#include "vkcv/SwapchainManager.hpp"
 
 namespace vkcv {
-	class Core;
+	class Context;
+	class SwapchainManager;
 
 	class WindowManager {
 		friend class Core;
@@ -29,7 +31,7 @@ namespace vkcv {
 
 		WindowManager &operator=(const WindowManager &other) = delete;
 
-		WindowHandle createWindow(Core &core, const char *applicationName, uint32_t windowWidth, uint32_t windowHeight,
+		WindowHandle createWindow( SwapchainManager &swapchainManager, const char *applicationName, uint32_t windowWidth, uint32_t windowHeight,
 								  bool resizeable);
 
 		[[nodiscard]]
diff --git a/src/vkcv/SwapchainManager.cpp b/src/vkcv/SwapchainManager.cpp
index b97a645e..ef8f9c98 100644
--- a/src/vkcv/SwapchainManager.cpp
+++ b/src/vkcv/SwapchainManager.cpp
@@ -13,13 +13,15 @@ namespace vkcv {
 		m_swapchains.clear();
 	}
 
-	[[maybe_unused]] SwapchainHandle SwapchainManager::createSwapchain(Window &window, Context &context) {
+	SwapchainHandle SwapchainManager::createSwapchain(Window &window) {
 		const uint64_t id = m_swapchains.size();
 
-		Swapchain swapchain = Swapchain::create(window, context);
+		Swapchain swapchain = Swapchain::create(window, *m_context);
 
 		m_swapchains.push_back(swapchain);
-		return SwapchainHandle(id, [&](uint64_t id) { destroySwapchainById(id); });
+		SwapchainHandle swapchainHandle = SwapchainHandle(id, [&](uint64_t id) { destroySwapchainById(id); });
+		window.m_swapchainHandle = swapchainHandle;
+		return swapchainHandle;
 	}
 
 	Swapchain &SwapchainManager::getSwapchain(const SwapchainHandle handle) const {
@@ -32,5 +34,45 @@ namespace vkcv {
 			vkcv_log(LogLevel::ERROR, "Invalid id");
 			return;
 		}
+		m_context->getDevice().destroySwapchainKHR(m_swapchains[id].getSwapchain());
+		m_context->getInstance().destroySurfaceKHR(m_swapchains[id].getSurface());
+	}
+
+	void SwapchainManager::signalRecreation(const SwapchainHandle handle) {
+		m_swapchains[handle.getId()].signalSwapchainRecreation();
+	}
+
+	std::vector<vk::Image> SwapchainManager::getSwapchainImages(const SwapchainHandle handle) {
+		return m_context->getDevice().getSwapchainImagesKHR(m_swapchains[handle.getId()].getSwapchain());
+	}
+
+	std::vector<vk::ImageView> SwapchainManager::createSwapchainImageViews(SwapchainHandle handle){
+		std::vector<vk::Image> images = getSwapchainImages(handle);
+		Swapchain &swapchain = m_swapchains[handle.getId()];
+
+		std::vector<vk::ImageView> imageViews;
+		imageViews.reserve( images.size() );
+		//here can be swizzled with vk::ComponentSwizzle if needed
+		vk::ComponentMapping componentMapping(
+				vk::ComponentSwizzle::eR,
+				vk::ComponentSwizzle::eG,
+				vk::ComponentSwizzle::eB,
+				vk::ComponentSwizzle::eA );
+
+		vk::ImageSubresourceRange subResourceRange( vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1 );
+
+		for ( auto image : images )
+		{
+			vk::ImageViewCreateInfo imageViewCreateInfo(
+					vk::ImageViewCreateFlags(),
+					image,
+					vk::ImageViewType::e2D,
+					swapchain.getFormat(),
+					componentMapping,
+					subResourceRange);
+
+			imageViews.push_back(m_context->getDevice().createImageView(imageViewCreateInfo));
+		}
+		return imageViews;
 	}
 }
\ No newline at end of file
diff --git a/src/vkcv/WindowManager.cpp b/src/vkcv/WindowManager.cpp
index 73d98266..f1b2c9bb 100644
--- a/src/vkcv/WindowManager.cpp
+++ b/src/vkcv/WindowManager.cpp
@@ -1,5 +1,5 @@
 #include "vkcv/WindowManager.hpp"
-#include "vkcv/Core.hpp"
+#include "vkcv/Context.hpp"
 
 namespace vkcv {
 	static std::vector<Window> m_windows;
@@ -15,7 +15,7 @@ namespace vkcv {
 	}
 
 	WindowHandle WindowManager::createWindow(
-			Core &core,
+			SwapchainManager &swapchainManager,
 			const char *applicationName,
 			uint32_t windowWidth,
 			uint32_t windowHeight,
@@ -24,11 +24,11 @@ namespace vkcv {
 
 		vkcv::Window window = vkcv::Window(applicationName, windowWidth, windowHeight, resizeable);
 
-		Swapchain swapChain = Swapchain::create(window, core.getContext());
+		SwapchainHandle swapchainHandle = swapchainManager.createSwapchain(window);
 
 		if (resizeable) {
 			window.e_resize.add([&](int width, int height) {
-				// m_swapchain.signalSwapchainRecreation(); // swapchain signal
+				swapchainManager.signalRecreation(swapchainHandle);
 			});
 		}
 
-- 
GitLab