From 4ae3f51174bf834572b64bd44dc7023384779e09 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Fri, 2 Dec 2022 22:59:07 +0100 Subject: [PATCH] VulkanRenderer: Fix views and arrays support --- .../Nazara/VulkanRenderer/VulkanTexture.hpp | 1 + .../Nazara/VulkanRenderer/VulkanTexture.inl | 5 ++ .../VulkanRenderer/Wrapper/CommandBuffer.hpp | 2 +- .../VulkanRenderer/Wrapper/CommandBuffer.inl | 8 +-- .../VulkanCommandBufferBuilder.cpp | 3 +- src/Nazara/VulkanRenderer/VulkanTexture.cpp | 69 +++++++++++++++++-- 6 files changed, 73 insertions(+), 15 deletions(-) diff --git a/include/Nazara/VulkanRenderer/VulkanTexture.hpp b/include/Nazara/VulkanRenderer/VulkanTexture.hpp index 0020f79fd..62c81e5e1 100644 --- a/include/Nazara/VulkanRenderer/VulkanTexture.hpp +++ b/include/Nazara/VulkanRenderer/VulkanTexture.hpp @@ -34,6 +34,7 @@ namespace Nz UInt8 GetLevelCount() const override; VulkanTexture* GetParentTexture() const override; Vector3ui GetSize(UInt8 level = 0) const override; + inline const VkImageSubresourceRange& GetSubresourceRange() const; ImageType GetType() const override; using Texture::Update; diff --git a/include/Nazara/VulkanRenderer/VulkanTexture.inl b/include/Nazara/VulkanRenderer/VulkanTexture.inl index ae493860f..f44837013 100644 --- a/include/Nazara/VulkanRenderer/VulkanTexture.inl +++ b/include/Nazara/VulkanRenderer/VulkanTexture.inl @@ -16,6 +16,11 @@ namespace Nz { return m_imageView; } + + inline const VkImageSubresourceRange& VulkanTexture::GetSubresourceRange() const + { + return m_imageRange; + } } #include diff --git a/include/Nazara/VulkanRenderer/Wrapper/CommandBuffer.hpp b/include/Nazara/VulkanRenderer/Wrapper/CommandBuffer.hpp index 8bf19a261..f07c55428 100644 --- a/include/Nazara/VulkanRenderer/Wrapper/CommandBuffer.hpp +++ b/include/Nazara/VulkanRenderer/Wrapper/CommandBuffer.hpp @@ -80,7 +80,7 @@ namespace Nz inline VkResult GetLastErrorCode() const; 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, Color color); diff --git a/include/Nazara/VulkanRenderer/Wrapper/CommandBuffer.inl b/include/Nazara/VulkanRenderer/Wrapper/CommandBuffer.inl index fbda82a3c..51920184c 100644 --- a/include/Nazara/VulkanRenderer/Wrapper/CommandBuffer.inl +++ b/include/Nazara/VulkanRenderer/Wrapper/CommandBuffer.inl @@ -355,7 +355,7 @@ namespace Nz 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 = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, @@ -367,11 +367,7 @@ namespace Nz VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, image, - { - aspectFlags, - 0, 1, - 0, 1 - } + subresourceRange }; return PipelineBarrier(srcStageMask, dstStageMask, dependencyFlags, imageBarrier); diff --git a/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp b/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp index 3dd5b28e2..70b2c5ead 100644 --- a/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp +++ b/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp @@ -258,8 +258,7 @@ namespace Nz { const VulkanTexture& vkTexture = static_cast(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(), aspectFlags); + m_commandBuffer.ImageBarrier(ToVulkan(srcStageMask), ToVulkan(dstStageMask), VkDependencyFlags(0), ToVulkan(srcAccessMask), ToVulkan(dstAccessMask), ToVulkan(oldLayout), ToVulkan(newLayout), vkTexture.GetImage(), vkTexture.GetSubresourceRange()); } } diff --git a/src/Nazara/VulkanRenderer/VulkanTexture.cpp b/src/Nazara/VulkanRenderer/VulkanTexture.cpp index a238c3589..ec3704ce9 100644 --- a/src/Nazara/VulkanRenderer/VulkanTexture.cpp +++ b/src/Nazara/VulkanRenderer/VulkanTexture.cpp @@ -41,7 +41,6 @@ namespace Nz createInfo.imageType = VK_IMAGE_TYPE_1D; createInfoView.viewType = VK_IMAGE_VIEW_TYPE_1D; - createInfo.extent.width = textureInfo.width; break; case ImageType::E1D_Array: @@ -70,6 +69,7 @@ namespace Nz NazaraAssert(textureInfo.depth == 1, "Depth must be one"); 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; createInfoView.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY; break; @@ -88,15 +88,12 @@ namespace Nz NazaraAssert(textureInfo.width > 0, "Width must be over zero"); NazaraAssert(textureInfo.height > 0, "Height must be over zero"); 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.imageType = VK_IMAGE_TYPE_2D; createInfoView.viewType = VK_IMAGE_VIEW_TYPE_CUBE; break; - - default: - break; } createInfo.extent.width = textureInfo.width; @@ -156,6 +153,66 @@ namespace Nz createInfoView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; createInfoView.image = m_image; 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);