VulkanRenderer: Fix views and arrays support

This commit is contained in:
SirLynix 2022-12-02 22:59:07 +01:00 committed by Jérôme Leclercq
parent 56acbb2694
commit 4ae3f51174
6 changed files with 73 additions and 15 deletions

View File

@ -34,6 +34,7 @@ namespace Nz
UInt8 GetLevelCount() const override; UInt8 GetLevelCount() const override;
VulkanTexture* GetParentTexture() const override; VulkanTexture* GetParentTexture() const override;
Vector3ui GetSize(UInt8 level = 0) const override; Vector3ui GetSize(UInt8 level = 0) const override;
inline const VkImageSubresourceRange& GetSubresourceRange() const;
ImageType GetType() const override; ImageType GetType() const override;
using Texture::Update; using Texture::Update;

View File

@ -16,6 +16,11 @@ namespace Nz
{ {
return m_imageView; return m_imageView;
} }
inline const VkImageSubresourceRange& VulkanTexture::GetSubresourceRange() const
{
return m_imageRange;
}
} }
#include <Nazara/VulkanRenderer/DebugOff.hpp> #include <Nazara/VulkanRenderer/DebugOff.hpp>

View File

@ -80,7 +80,7 @@ namespace Nz
inline VkResult GetLastErrorCode() const; inline VkResult GetLastErrorCode() const;
inline CommandPool& GetPool(); inline CommandPool& GetPool();
inline void ImageBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout, VkImage image, VkImageAspectFlags aspectFlags); inline void ImageBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout, VkImage image, const VkImageSubresourceRange& subresourceRange);
inline void InsertDebugLabel(const char* label); inline void InsertDebugLabel(const char* label);
inline void InsertDebugLabel(const char* label, Color color); inline void InsertDebugLabel(const char* label, Color color);

View File

@ -355,7 +355,7 @@ namespace Nz
return *m_pool; return *m_pool;
} }
inline void CommandBuffer::ImageBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout, VkImage image, VkImageAspectFlags aspectFlags) inline void CommandBuffer::ImageBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout, VkImage image, const VkImageSubresourceRange& subresourceRange)
{ {
VkImageMemoryBarrier imageBarrier = { VkImageMemoryBarrier imageBarrier = {
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
@ -367,11 +367,7 @@ namespace Nz
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
image, image,
{ subresourceRange
aspectFlags,
0, 1,
0, 1
}
}; };
return PipelineBarrier(srcStageMask, dstStageMask, dependencyFlags, imageBarrier); return PipelineBarrier(srcStageMask, dstStageMask, dependencyFlags, imageBarrier);

View File

@ -258,8 +258,7 @@ namespace Nz
{ {
const VulkanTexture& vkTexture = static_cast<const VulkanTexture&>(texture); const VulkanTexture& vkTexture = static_cast<const VulkanTexture&>(texture);
VkImageAspectFlags aspectFlags = ToVulkan(PixelFormatInfo::GetContent(vkTexture.GetFormat())); m_commandBuffer.ImageBarrier(ToVulkan(srcStageMask), ToVulkan(dstStageMask), VkDependencyFlags(0), ToVulkan(srcAccessMask), ToVulkan(dstAccessMask), ToVulkan(oldLayout), ToVulkan(newLayout), vkTexture.GetImage(), vkTexture.GetSubresourceRange());
m_commandBuffer.ImageBarrier(ToVulkan(srcStageMask), ToVulkan(dstStageMask), VkDependencyFlags(0), ToVulkan(srcAccessMask), ToVulkan(dstAccessMask), ToVulkan(oldLayout), ToVulkan(newLayout), vkTexture.GetImage(), aspectFlags);
} }
} }

View File

@ -41,7 +41,6 @@ namespace Nz
createInfo.imageType = VK_IMAGE_TYPE_1D; createInfo.imageType = VK_IMAGE_TYPE_1D;
createInfoView.viewType = VK_IMAGE_VIEW_TYPE_1D; createInfoView.viewType = VK_IMAGE_VIEW_TYPE_1D;
createInfo.extent.width = textureInfo.width;
break; break;
case ImageType::E1D_Array: case ImageType::E1D_Array:
@ -70,6 +69,7 @@ namespace Nz
NazaraAssert(textureInfo.depth == 1, "Depth must be one"); NazaraAssert(textureInfo.depth == 1, "Depth must be one");
NazaraAssert(textureInfo.layerCount > 0, "Array count must be over zero"); NazaraAssert(textureInfo.layerCount > 0, "Array count must be over zero");
createInfo.flags |= VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT;
createInfo.imageType = VK_IMAGE_TYPE_2D; createInfo.imageType = VK_IMAGE_TYPE_2D;
createInfoView.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY; createInfoView.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
break; break;
@ -88,15 +88,12 @@ namespace Nz
NazaraAssert(textureInfo.width > 0, "Width must be over zero"); NazaraAssert(textureInfo.width > 0, "Width must be over zero");
NazaraAssert(textureInfo.height > 0, "Height must be over zero"); NazaraAssert(textureInfo.height > 0, "Height must be over zero");
NazaraAssert(textureInfo.depth == 1, "Depth must be one"); NazaraAssert(textureInfo.depth == 1, "Depth must be one");
NazaraAssert(textureInfo.layerCount % 6 == 0, "Array count must be a multiple of 6"); NazaraAssert(textureInfo.layerCount > 0 && textureInfo.layerCount % 6 == 0, "Array count must be a multiple of 6");
createInfo.imageType = VK_IMAGE_TYPE_2D;
createInfo.flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; createInfo.flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
createInfo.imageType = VK_IMAGE_TYPE_2D;
createInfoView.viewType = VK_IMAGE_VIEW_TYPE_CUBE; createInfoView.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
break; break;
default:
break;
} }
createInfo.extent.width = textureInfo.width; createInfo.extent.width = textureInfo.width;
@ -156,6 +153,66 @@ namespace Nz
createInfoView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; createInfoView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
createInfoView.image = m_image; createInfoView.image = m_image;
createInfoView.subresourceRange = m_imageRange; createInfoView.subresourceRange = m_imageRange;
switch (m_textureInfo.type)
{
case ImageType::E1D:
NazaraAssert(m_textureInfo.width > 0, "Width must be over zero");
NazaraAssert(m_textureInfo.height == 1, "Height must be one");
NazaraAssert(m_textureInfo.depth == 1, "Depth must be one");
NazaraAssert(m_textureInfo.layerCount == 1, "Array count must be one");
createInfoView.viewType = VK_IMAGE_VIEW_TYPE_1D;
break;
case ImageType::E1D_Array:
NazaraAssert(m_textureInfo.width > 0, "Width must be over zero");
NazaraAssert(m_textureInfo.height == 1, "Height must be one");
NazaraAssert(m_textureInfo.depth == 1, "Depth must be one");
NazaraAssert(m_textureInfo.layerCount > 0, "Array count must be over zero");
createInfoView.viewType = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
break;
case ImageType::E2D:
NazaraAssert(m_textureInfo.width > 0, "Width must be over zero");
NazaraAssert(m_textureInfo.height > 0, "Height must be over zero");
NazaraAssert(m_textureInfo.depth == 1, "Depth must be one");
NazaraAssert(m_textureInfo.layerCount == 1, "Array count must be one");
createInfoView.viewType = VK_IMAGE_VIEW_TYPE_2D;
break;
case ImageType::E2D_Array:
NazaraAssert(m_textureInfo.width > 0, "Width must be over zero");
NazaraAssert(m_textureInfo.height > 0, "Height must be over zero");
NazaraAssert(m_textureInfo.depth == 1, "Depth must be one");
NazaraAssert(m_textureInfo.layerCount > 0, "Array count must be over zero");
createInfoView.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
break;
case ImageType::E3D:
NazaraAssert(m_textureInfo.width > 0, "Width must be over zero");
NazaraAssert(m_textureInfo.height > 0, "Height must be over zero");
NazaraAssert(m_textureInfo.depth > 0, "Depth must be over zero");
NazaraAssert(m_textureInfo.layerCount == 1, "Array count must be one");
createInfoView.viewType = VK_IMAGE_VIEW_TYPE_3D;
break;
case ImageType::Cubemap:
NazaraAssert(m_textureInfo.width > 0, "Width must be over zero");
NazaraAssert(m_textureInfo.height > 0, "Height must be over zero");
NazaraAssert(m_textureInfo.depth == 1, "Depth must be one");
NazaraAssert(m_textureInfo.layerCount > 0 && m_textureInfo.layerCount % 6 == 0, "Array count must be a multiple of 6");
createInfoView.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
break;
default:
break;
}
InitViewForFormat(viewInfo.reinterpretFormat, createInfoView); InitViewForFormat(viewInfo.reinterpretFormat, createInfoView);