Skip to content
Snippets Groups Projects
Verified Commit 024ca480 authored by Tobias Frisch's avatar Tobias Frisch
Browse files

[#31] Added ImageView to images in ImageManager

parent e167746b
Branches
Tags
1 merge request!32Resolve "Image-Klasse"
Pipeline #25286 passed
...@@ -59,12 +59,15 @@ namespace vkcv { ...@@ -59,12 +59,15 @@ namespace vkcv {
const vk::Device& device = m_core->getContext().getDevice(); const vk::Device& device = m_core->getContext().getDevice();
vk::ImageType imageType = vk::ImageType::e3D; vk::ImageType imageType = vk::ImageType::e3D;
vk::ImageViewType imageViewType = vk::ImageViewType::e3D;
if (depth <= 1) { if (depth <= 1) {
if (height <= 1) { if (height <= 1) {
imageType = vk::ImageType::e1D; imageType = vk::ImageType::e1D;
imageViewType = vk::ImageViewType::e1D;
} else { } else {
imageType = vk::ImageType::e2D; imageType = vk::ImageType::e2D;
imageViewType = vk::ImageViewType::e2D;
} }
} }
...@@ -81,7 +84,7 @@ namespace vkcv { ...@@ -81,7 +84,7 @@ namespace vkcv {
format, imageType, imageTiling, imageUsageFlags format, imageType, imageTiling, imageUsageFlags
); );
vk::ImageCreateInfo imageCreateInfo( const vk::ImageCreateInfo imageCreateInfo(
createFlags, createFlags,
imageType, imageType,
format, format,
...@@ -111,11 +114,69 @@ namespace vkcv { ...@@ -111,11 +114,69 @@ namespace vkcv {
vk::DeviceMemory memory = device.allocateMemory(vk::MemoryAllocateInfo(requirements.size, memoryTypeIndex)); vk::DeviceMemory memory = device.allocateMemory(vk::MemoryAllocateInfo(requirements.size, memoryTypeIndex));
device.bindImageMemory(image, memory, 0); 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(); 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); 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) { void ImageManager::switchImageLayout(const ImageHandle& handle, vk::ImageLayout oldLayout, vk::ImageLayout newLayout) {
//alternativly we could use switch case for every variable to set //alternativly we could use switch case for every variable to set
vk::AccessFlags sourceAccessMask; vk::AccessFlags sourceAccessMask;
...@@ -270,6 +331,11 @@ namespace vkcv { ...@@ -270,6 +331,11 @@ namespace vkcv {
auto& image = m_images[id]; auto& image = m_images[id];
const vk::Device& device = m_core->getContext().getDevice(); 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) { if (image.m_memory) {
device.freeMemory(image.m_memory); device.freeMemory(image.m_memory);
......
...@@ -20,6 +20,7 @@ namespace vkcv { ...@@ -20,6 +20,7 @@ namespace vkcv {
{ {
vk::Image m_handle; vk::Image m_handle;
vk::DeviceMemory m_memory; vk::DeviceMemory m_memory;
vk::ImageView m_view;
uint32_t m_width = 0; uint32_t m_width = 0;
uint32_t m_height = 0; uint32_t m_height = 0;
uint32_t m_depth = 0; uint32_t m_depth = 0;
...@@ -41,11 +42,20 @@ namespace vkcv { ...@@ -41,11 +42,20 @@ namespace vkcv {
ImageManager& operator=(ImageManager&& other) = delete; ImageManager& operator=(ImageManager&& other) = delete;
ImageManager& operator=(const 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 switchImageLayout(const ImageHandle& handle, vk::ImageLayout oldLayout, vk::ImageLayout newLayout);
void fillImage(const ImageHandle& handle, void* data, size_t size); 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 * Destroys and deallocates image represented by a given
* buffer handle. * buffer handle.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment