From 7598c8c2282ead555e6f61c373ea2208ca657a06 Mon Sep 17 00:00:00 2001
From: Lars Hoerttrich <larshoerttrich@uni-koblenz.de>
Date: Wed, 26 May 2021 16:41:01 +0200
Subject: [PATCH] [#31] Begin of Image class and ImageManager class, mostly
 taken from Buffer and BufferManager classes

---
 config/Sources.cmake          |  6 +++++
 include/vkcv/Image.hpp        | 19 ++++++++++++++
 include/vkcv/ImageManager.hpp | 45 +++++++++++++++++++++++++++++++++
 src/vkcv/Image.cpp            | 19 ++++++++++++++
 src/vkcv/ImageManager.cpp     | 47 +++++++++++++++++++++++++++++++++++
 5 files changed, 136 insertions(+)
 create mode 100644 include/vkcv/Image.hpp
 create mode 100644 include/vkcv/ImageManager.hpp
 create mode 100644 src/vkcv/Image.cpp
 create mode 100644 src/vkcv/ImageManager.cpp

diff --git a/config/Sources.cmake b/config/Sources.cmake
index df1880ce..9e121ffc 100644
--- a/config/Sources.cmake
+++ b/config/Sources.cmake
@@ -24,6 +24,12 @@ set(vkcv_sources
 		${vkcv_include}/vkcv/BufferManager.hpp
 		${vkcv_source}/vkcv/BufferManager.cpp
 
+		${vkcv_include}/vkcv/Image.hpp
+		${vkcv_source}/vkcv/Image.cpp
+
+		${vkcv_include}/vkcv/ImageManager.hpp
+		${vkcv_source}/vkcv/ImageManager.cpp
+
 		${vkcv_include}/vkcv/SwapChain.hpp
 		${vkcv_source}/vkcv/SwapChain.cpp
 
diff --git a/include/vkcv/Image.hpp b/include/vkcv/Image.hpp
new file mode 100644
index 00000000..9b632c29
--- /dev/null
+++ b/include/vkcv/Image.hpp
@@ -0,0 +1,19 @@
+#pragma once
+/**
+ * @authors Lars Hoerttrich
+ * @file vkcv/Buffer.hpp
+ * @brief class for image handles
+ */
+#include "ImageManager.hpp"
+
+namespace vkcv {
+	class Image {
+	public:
+		static Image create(ImageManager* manager);
+	private:
+		ImageManager* const m_manager;
+		const uint64_t m_handle_id;
+
+		Image(ImageManager* manager, uint64_t id);
+	};
+}
diff --git a/include/vkcv/ImageManager.hpp b/include/vkcv/ImageManager.hpp
new file mode 100644
index 00000000..db53ad72
--- /dev/null
+++ b/include/vkcv/ImageManager.hpp
@@ -0,0 +1,45 @@
+#pragma once
+/**
+ * @authors Lars Hoerttrich
+ * @file vkcv/ImageManager.hpp
+ * @brief class creating and managing images
+ */
+#include <vector>
+#include <vulkan/vulkan.hpp>
+
+namespace vkcv {
+	class Core;
+	class ImageManager 
+	{
+		friend class Core;
+	private:
+		struct Image
+		{
+			vk::Image m_handle;
+			vk::DeviceMemory m_memory;
+			void* m_mapped = nullptr;
+			bool m_mappable;
+		};
+		Core* m_core;
+		std::vector<Image> m_images;
+		ImageManager() noexcept;
+	public:
+		~ImageManager() noexcept;
+		ImageManager(ImageManager&& other) = delete;
+		ImageManager(const ImageManager& other) = delete;
+
+		ImageManager& operator=(ImageManager&& other) = delete;
+		ImageManager& operator=(const ImageManager& other) = delete;
+
+
+		uint64_t createImage();
+
+		/**
+		 * Destroys and deallocates image represented by a given
+		 * buffer handle id.
+		 *
+		 * @param id Buffer handle id
+		 */
+		void destroyImage(uint64_t id);
+	};
+}
\ No newline at end of file
diff --git a/src/vkcv/Image.cpp b/src/vkcv/Image.cpp
new file mode 100644
index 00000000..4af32f97
--- /dev/null
+++ b/src/vkcv/Image.cpp
@@ -0,0 +1,19 @@
+/**
+ * @authors Lars Hoerttrich
+ * @file vkcv/Image.cpp
+ * @brief class for image handles
+ */
+#include "vkcv/Image.hpp"
+namespace vkcv{
+	Image Image::create(ImageManager* manager)
+	{
+		return Image(manager, manager->createImage());
+	}
+
+	Image::Image(ImageManager* manager, uint64_t id) :
+		m_manager(manager),
+		m_handle_id(id)
+	{
+	}
+
+}
diff --git a/src/vkcv/ImageManager.cpp b/src/vkcv/ImageManager.cpp
new file mode 100644
index 00000000..ec82ca09
--- /dev/null
+++ b/src/vkcv/ImageManager.cpp
@@ -0,0 +1,47 @@
+/**
+ * @authors Lars Hoerttrich
+ * @file vkcv/ImageManager.cpp
+ * @brief class creating and managing images
+ */
+#include "vkcv/ImageManager.hpp"
+#include "vkcv/Core.hpp"
+
+namespace vkcv {
+	
+	ImageManager::ImageManager() noexcept :
+		m_core(nullptr), m_images()
+	{
+	}
+
+	ImageManager::~ImageManager() noexcept {
+		for (size_t id = 0; id < m_images.size(); id++) {
+			destroyImage(id);
+		}
+	}
+
+	uint64_t ImageManager::createImage()
+	{
+		
+		return uint64_t();
+	}
+
+	void ImageManager::destroyImage(uint64_t id)
+	{
+		if (id >= m_images.size()) {
+			return;
+		}
+		auto& image = m_images[id];
+
+		const vk::Device& device = m_core->getContext().getDevice();
+
+		if (image.m_memory) {
+			device.freeMemory(image.m_memory);
+		}
+
+		if (image.m_handle) {
+			device.destroyImage(image.m_handle);
+		}
+	}
+
+
+}
\ No newline at end of file
-- 
GitLab