Skip to content
Snippets Groups Projects

Resolve "Image-Klasse"

Merged Ghost User requested to merge 31-image-klasse into develop
All threads resolved!
2 files
+ 60
19
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 58
19
@@ -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)
Loading