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