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