diff --git a/config/Sources.cmake b/config/Sources.cmake index df1880cea6a46ea279a2173eebf1108300778fb5..9e121ffc1c120e771ebbb5366efe3412f6dcac3c 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 0000000000000000000000000000000000000000..9b632c290989658dfae8154205e94ac7ab2e1a5e --- /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 0000000000000000000000000000000000000000..db53ad72c6cd8d980e84f5d082c28464c7b5f0fc --- /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 0000000000000000000000000000000000000000..4af32f97cb5501029325aeccd938790b6271680e --- /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 0000000000000000000000000000000000000000..ec82ca09c26696a8c0fc69ff34c08a5b6f30e170 --- /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