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 @@ ...@@ -6,6 +6,8 @@
#include "ImageManager.hpp" #include "ImageManager.hpp"
#include "vkcv/Core.hpp" #include "vkcv/Core.hpp"
#include <algorithm>
namespace vkcv { namespace vkcv {
/** /**
...@@ -44,6 +46,16 @@ namespace vkcv { ...@@ -44,6 +46,16 @@ namespace vkcv {
destroyImage(ImageHandle(id)); 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) ImageHandle ImageManager::createImage(uint32_t width, uint32_t height, uint32_t depth, vk::Format format)
{ {
...@@ -84,13 +96,16 @@ namespace vkcv { ...@@ -84,13 +96,16 @@ namespace vkcv {
format, imageType, imageTiling, imageUsageFlags 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( const vk::ImageCreateInfo imageCreateInfo(
createFlags, createFlags,
imageType, imageType,
format, format,
vk::Extent3D(width, height, depth), vk::Extent3D(width, height, depth),
1, mipLevels,
1, arrayLayers,
vk::SampleCountFlagBits::e1, vk::SampleCountFlagBits::e1,
imageTiling, imageTiling,
imageUsageFlags, imageUsageFlags,
...@@ -114,6 +129,14 @@ namespace vkcv { ...@@ -114,6 +129,14 @@ 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);
vk::ImageAspectFlags aspectFlags;
if (isDepthImageFormat(format)) {
aspectFlags = vk::ImageAspectFlagBits::eDepth;
} else {
aspectFlags = vk::ImageAspectFlagBits::eColor;
}
const vk::ImageViewCreateInfo imageViewCreateInfo ( const vk::ImageViewCreateInfo imageViewCreateInfo (
{}, {},
image, image,
...@@ -126,18 +149,18 @@ namespace vkcv { ...@@ -126,18 +149,18 @@ namespace vkcv {
vk::ComponentSwizzle::eIdentity vk::ComponentSwizzle::eIdentity
), ),
vk::ImageSubresourceRange( vk::ImageSubresourceRange(
vk::ImageAspectFlagBits::eColor, aspectFlags,
0, 0,
1, mipLevels,
0, 0,
1 arrayLayers
) )
); );
vk::ImageView view = device.createImageView(imageViewCreateInfo); 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, view, width, height, depth, format }); m_images.push_back({ image, memory, view, width, height, depth, format, arrayLayers, mipLevels });
return ImageHandle(id); return ImageHandle(id);
} }
...@@ -178,6 +201,14 @@ namespace vkcv { ...@@ -178,6 +201,14 @@ namespace vkcv {
} }
void ImageManager::switchImageLayout(const ImageHandle& handle, vk::ImageLayout oldLayout, vk::ImageLayout newLayout) { 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 //alternativly we could use switch case for every variable to set
vk::AccessFlags sourceAccessMask; vk::AccessFlags sourceAccessMask;
vk::PipelineStageFlags sourceStage; vk::PipelineStageFlags sourceStage;
...@@ -203,22 +234,22 @@ namespace vkcv { ...@@ -203,22 +234,22 @@ namespace vkcv {
destinationStage = vk::PipelineStageFlagBits::eFragmentShader; 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::ImageSubresourceRange imageSubresourceRange(
vk::ImageAspectFlagBits::eColor, aspectFlags,
0, 0,
1, image.m_levels,
0, 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( vk::ImageMemoryBarrier imageMemoryBarrier(
sourceAccessMask, sourceAccessMask,
destinationAccessMask, destinationAccessMask,
...@@ -286,15 +317,23 @@ namespace vkcv { ...@@ -286,15 +317,23 @@ namespace vkcv {
m_core->submitCommands( m_core->submitCommands(
submitInfo, submitInfo,
[&image, &stagingBuffer](const vk::CommandBuffer& commandBuffer) { [&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 ( const vk::BufferImageCopy region (
0, 0,
0, 0,
0, 0,
vk::ImageSubresourceLayers( vk::ImageSubresourceLayers(
vk::ImageAspectFlagBits::eColor, aspectFlags,
0, 0,
0, 0,
1 image.m_layers
), ),
vk::Offset3D(0, 0, 0), vk::Offset3D(0, 0, 0),
vk::Extent3D(image.m_width, image.m_height, image.m_depth) vk::Extent3D(image.m_width, image.m_height, image.m_depth)
......
...@@ -25,6 +25,8 @@ namespace vkcv { ...@@ -25,6 +25,8 @@ namespace vkcv {
uint32_t m_height = 0; uint32_t m_height = 0;
uint32_t m_depth = 0; uint32_t m_depth = 0;
vk::Format m_format; vk::Format m_format;
uint32_t m_layers = 1;
uint32_t m_levels = 1;
}; };
Core* m_core; 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