VulkanRenderer: Fix views and arrays support
This commit is contained in:
parent
56acbb2694
commit
4ae3f51174
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue