diff --git a/src/vkcv/ImageManager.cpp b/src/vkcv/ImageManager.cpp index 39cca04b3ba5fa9842a225272cf6a8732838a938..70b4a6016c5faddff7073589794af7c77dc0d2d0 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 22a4301977392876e520cecc6ccbfd7982cb3d59..98c4e4e67bbe27eed453f655c56138200d78e5f4 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.