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

[#31] Allowed using depth formats for images

parent 024ca480
No related branches found
No related tags found
1 merge request!32Resolve "Image-Klasse"
Pipeline #25287 passed
......@@ -6,6 +6,8 @@
#include "ImageManager.hpp"
#include "vkcv/Core.hpp"
#include <algorithm>
namespace vkcv {
/**
......@@ -44,6 +46,16 @@ namespace vkcv {
destroyImage(ImageHandle(id));
}
}
bool isDepthImageFormat(vk::Format format) {
if ((format == vk::Format::eD16Unorm) || (format == vk::Format::eD16UnormS8Uint) ||
(format == vk::Format::eD24UnormS8Uint) || (format == vk::Format::eD32Sfloat) ||
(format == vk::Format::eD32SfloatS8Uint)) {
return true;
} else {
return false;
}
}
ImageHandle ImageManager::createImage(uint32_t width, uint32_t height, uint32_t depth, vk::Format format)
{
......@@ -84,13 +96,16 @@ namespace vkcv {
format, imageType, imageTiling, imageUsageFlags
);
const uint32_t mipLevels = std::min<uint32_t>(1, imageFormatProperties.maxMipLevels);
const uint32_t arrayLayers = std::min<uint32_t>(1, imageFormatProperties.maxArrayLayers);
const vk::ImageCreateInfo imageCreateInfo(
createFlags,
imageType,
format,
vk::Extent3D(width, height, depth),
1,
1,
mipLevels,
arrayLayers,
vk::SampleCountFlagBits::e1,
imageTiling,
imageUsageFlags,
......@@ -114,6 +129,14 @@ namespace vkcv {
vk::DeviceMemory memory = device.allocateMemory(vk::MemoryAllocateInfo(requirements.size, memoryTypeIndex));
device.bindImageMemory(image, memory, 0);
vk::ImageAspectFlags aspectFlags;
if (isDepthImageFormat(format)) {
aspectFlags = vk::ImageAspectFlagBits::eDepth;
} else {
aspectFlags = vk::ImageAspectFlagBits::eColor;
}
const vk::ImageViewCreateInfo imageViewCreateInfo (
{},
image,
......@@ -126,18 +149,18 @@ namespace vkcv {
vk::ComponentSwizzle::eIdentity
),
vk::ImageSubresourceRange(
vk::ImageAspectFlagBits::eColor,
aspectFlags,
0,
1,
mipLevels,
0,
1
arrayLayers
)
);
vk::ImageView view = device.createImageView(imageViewCreateInfo);
const uint64_t id = m_images.size();
m_images.push_back({ image, memory, view, width, height, depth, format });
m_images.push_back({ image, memory, view, width, height, depth, format, arrayLayers, mipLevels });
return ImageHandle(id);
}
......@@ -178,6 +201,14 @@ namespace vkcv {
}
void ImageManager::switchImageLayout(const ImageHandle& handle, vk::ImageLayout oldLayout, vk::ImageLayout newLayout) {
const uint64_t id = handle.getId();
if (id >= m_images.size()) {
return;
}
auto& image = m_images[id];
//alternativly we could use switch case for every variable to set
vk::AccessFlags sourceAccessMask;
vk::PipelineStageFlags sourceStage;
......@@ -203,22 +234,22 @@ namespace vkcv {
destinationStage = vk::PipelineStageFlagBits::eFragmentShader;
}
vk::ImageAspectFlags aspectFlags;
if (isDepthImageFormat(image.m_format)) {
aspectFlags = vk::ImageAspectFlagBits::eDepth;
} else {
aspectFlags = vk::ImageAspectFlagBits::eColor;
}
vk::ImageSubresourceRange imageSubresourceRange(
vk::ImageAspectFlagBits::eColor,
aspectFlags,
0,
1,
image.m_levels,
0,
1
image.m_layers
);
const uint64_t id = handle.getId();
if (id >= m_images.size()) {
return;
}
auto& image = m_images[id];
vk::ImageMemoryBarrier imageMemoryBarrier(
sourceAccessMask,
destinationAccessMask,
......@@ -286,15 +317,23 @@ namespace vkcv {
m_core->submitCommands(
submitInfo,
[&image, &stagingBuffer](const vk::CommandBuffer& commandBuffer) {
vk::ImageAspectFlags aspectFlags;
if (isDepthImageFormat(image.m_format)) {
aspectFlags = vk::ImageAspectFlagBits::eDepth;
} else {
aspectFlags = vk::ImageAspectFlagBits::eColor;
}
const vk::BufferImageCopy region (
0,
0,
0,
vk::ImageSubresourceLayers(
vk::ImageAspectFlagBits::eColor,
aspectFlags,
0,
0,
1
image.m_layers
),
vk::Offset3D(0, 0, 0),
vk::Extent3D(image.m_width, image.m_height, image.m_depth)
......
......@@ -25,6 +25,8 @@ namespace vkcv {
uint32_t m_height = 0;
uint32_t m_depth = 0;
vk::Format m_format;
uint32_t m_layers = 1;
uint32_t m_levels = 1;
};
Core* m_core;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment