From 024ca4806ab3b1efaa0252492e2c99c9aaf87eb4 Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Sun, 30 May 2021 11:48:38 +0200
Subject: [PATCH] [#31] Added ImageView to images in ImageManager

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 src/vkcv/ImageManager.cpp | 72 +++++++++++++++++++++++++++++++++++++--
 src/vkcv/ImageManager.hpp | 14 ++++++--
 2 files changed, 81 insertions(+), 5 deletions(-)

diff --git a/src/vkcv/ImageManager.cpp b/src/vkcv/ImageManager.cpp
index 39cca04b..70b4a601 100644
--- a/src/vkcv/ImageManager.cpp
+++ b/src/vkcv/ImageManager.cpp
@@ -59,12 +59,15 @@ namespace vkcv {
 		const vk::Device& device = m_core->getContext().getDevice();
 
 		vk::ImageType imageType = vk::ImageType::e3D;
+		vk::ImageViewType imageViewType = vk::ImageViewType::e3D;
 		
 		if (depth <= 1) {
 			if (height <= 1) {
 				imageType = vk::ImageType::e1D;
+				imageViewType = vk::ImageViewType::e1D;
 			} else {
 				imageType = vk::ImageType::e2D;
+				imageViewType = vk::ImageViewType::e2D;
 			}
 		}
 		
@@ -81,7 +84,7 @@ namespace vkcv {
 				format, imageType, imageTiling, imageUsageFlags
 		);
 		
-		vk::ImageCreateInfo imageCreateInfo(
+		const vk::ImageCreateInfo imageCreateInfo(
 			createFlags,
 			imageType,
 			format,
@@ -111,11 +114,69 @@ namespace vkcv {
 		vk::DeviceMemory memory = device.allocateMemory(vk::MemoryAllocateInfo(requirements.size, memoryTypeIndex));
 		device.bindImageMemory(image, memory, 0);
 
+		const vk::ImageViewCreateInfo imageViewCreateInfo (
+				{},
+				image,
+				imageViewType,
+				format,
+				vk::ComponentMapping(
+						vk::ComponentSwizzle::eIdentity,
+						vk::ComponentSwizzle::eIdentity,
+						vk::ComponentSwizzle::eIdentity,
+						vk::ComponentSwizzle::eIdentity
+				),
+				vk::ImageSubresourceRange(
+						vk::ImageAspectFlagBits::eColor,
+						0,
+						1,
+						0,
+						1
+				)
+		);
+		
+		vk::ImageView view = device.createImageView(imageViewCreateInfo);
+		
 		const uint64_t id = m_images.size();
-		m_images.push_back({ image, memory, width, height, depth, format });
+		m_images.push_back({ image, memory, view, width, height, depth, format });
 		return ImageHandle(id);
 	}
-
+	
+	vk::Image ImageManager::getVulkanImage(const ImageHandle &handle) const {
+		const uint64_t id = handle.getId();
+		
+		if (id >= m_images.size()) {
+			return nullptr;
+		}
+		
+		auto& image = m_images[id];
+		
+		return image.m_handle;
+	}
+	
+	vk::DeviceMemory ImageManager::getVulkanDeviceMemory(const ImageHandle &handle) const {
+		const uint64_t id = handle.getId();
+		
+		if (id >= m_images.size()) {
+			return nullptr;
+		}
+		
+		auto& image = m_images[id];
+		
+		return image.m_memory;
+	}
+	
+	vk::ImageView ImageManager::getVulkanImageView(const ImageHandle &handle) const {
+		const uint64_t id = handle.getId();
+		
+		if (id >= m_images.size()) {
+			return nullptr;
+		}
+		
+		auto& image = m_images[id];
+		
+		return image.m_view;
+	}
+	
 	void ImageManager::switchImageLayout(const ImageHandle& handle, vk::ImageLayout oldLayout, vk::ImageLayout newLayout) {
 		//alternativly we could use switch case for every variable to set
 		vk::AccessFlags sourceAccessMask;
@@ -270,6 +331,11 @@ namespace vkcv {
 		auto& image = m_images[id];
 
 		const vk::Device& device = m_core->getContext().getDevice();
+		
+		if (image.m_view) {
+			device.destroyImageView(image.m_view);
+			image.m_view = nullptr;
+		}
 
 		if (image.m_memory) {
 			device.freeMemory(image.m_memory);
diff --git a/src/vkcv/ImageManager.hpp b/src/vkcv/ImageManager.hpp
index 22a43019..98c4e4e6 100644
--- a/src/vkcv/ImageManager.hpp
+++ b/src/vkcv/ImageManager.hpp
@@ -20,6 +20,7 @@ namespace vkcv {
 		{
 			vk::Image m_handle;
 			vk::DeviceMemory m_memory;
+			vk::ImageView m_view;
 			uint32_t m_width = 0;
 			uint32_t m_height = 0;
 			uint32_t m_depth = 0;
@@ -41,11 +42,20 @@ namespace vkcv {
 		ImageManager& operator=(ImageManager&& other) = delete;
 		ImageManager& operator=(const ImageManager& other) = delete;
 		
+		ImageHandle createImage(uint32_t width, uint32_t height, uint32_t depth, vk::Format format);
+		
+		[[nodiscard]]
+		vk::Image getVulkanImage(const ImageHandle& handle) const;
+		
+		[[nodiscard]]
+		vk::DeviceMemory getVulkanDeviceMemory(const ImageHandle& handle) const;
+		
+		[[nodiscard]]
+		vk::ImageView getVulkanImageView(const ImageHandle& handle) const;
+		
 		void switchImageLayout(const ImageHandle& handle, vk::ImageLayout oldLayout, vk::ImageLayout newLayout);
 		void fillImage(const ImageHandle& handle, void* data, size_t size);
 
-		ImageHandle createImage(uint32_t width, uint32_t height, uint32_t depth, vk::Format format);
-
 		/**
 		 * Destroys and deallocates image represented by a given
 		 * buffer handle.
-- 
GitLab