diff --git a/include/Nazara/VulkanRenderer/Utils.hpp b/include/Nazara/VulkanRenderer/Utils.hpp index 67910e179..cc96c3726 100644 --- a/include/Nazara/VulkanRenderer/Utils.hpp +++ b/include/Nazara/VulkanRenderer/Utils.hpp @@ -30,6 +30,7 @@ namespace Nz inline VkPipelineStageFlagBits ToVulkan(PipelineStage pipelineStage); inline VkPipelineStageFlags ToVulkan(PipelineStageFlags pipelineStages); inline VkFormat ToVulkan(PixelFormat pixelFormat); + inline VkImageAspectFlags ToVulkan(PixelFormatContent pixelFormatContent); inline VkPrimitiveTopology ToVulkan(PrimitiveMode primitiveMode); inline VkCompareOp ToVulkan(RendererComparison comparison); inline VkFilter ToVulkan(SamplerFilter samplerFilter); diff --git a/include/Nazara/VulkanRenderer/Utils.inl b/include/Nazara/VulkanRenderer/Utils.inl index a7517852b..34e6fb2df 100644 --- a/include/Nazara/VulkanRenderer/Utils.inl +++ b/include/Nazara/VulkanRenderer/Utils.inl @@ -272,6 +272,23 @@ namespace Nz return {}; } + VkImageAspectFlags ToVulkan(PixelFormatContent pixelFormatContent) + { + switch (pixelFormatContent) + { + case PixelFormatContent::Undefined: + break; + + case PixelFormatContent::ColorRGBA: return VK_IMAGE_ASPECT_COLOR_BIT; + case PixelFormatContent::Depth: return VK_IMAGE_ASPECT_DEPTH_BIT; + case PixelFormatContent::DepthStencil: return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; + case PixelFormatContent::Stencil: return VK_IMAGE_ASPECT_STENCIL_BIT; + } + + NazaraError("Unhandled PixelFormatContent 0x" + NumberToString(UnderlyingCast(pixelFormatContent), 16)); + return VK_IMAGE_ASPECT_COLOR_BIT; + } + inline VkPrimitiveTopology ToVulkan(PrimitiveMode primitiveMode) { switch (primitiveMode) diff --git a/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp b/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp index da1d6462c..0d611f112 100644 --- a/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp +++ b/src/Nazara/VulkanRenderer/VulkanCommandBufferBuilder.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -255,6 +256,7 @@ namespace Nz { const VulkanTexture& vkTexture = static_cast(texture); - m_commandBuffer.ImageBarrier(ToVulkan(srcStageMask), ToVulkan(dstStageMask), VkDependencyFlags(0), ToVulkan(srcAccessMask), ToVulkan(dstAccessMask), ToVulkan(oldLayout), ToVulkan(newLayout), vkTexture.GetImage(), VK_IMAGE_ASPECT_COLOR_BIT); + 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); } } diff --git a/src/Nazara/VulkanRenderer/VulkanTexture.cpp b/src/Nazara/VulkanRenderer/VulkanTexture.cpp index 89014f3c1..1af29c135 100644 --- a/src/Nazara/VulkanRenderer/VulkanTexture.cpp +++ b/src/Nazara/VulkanRenderer/VulkanTexture.cpp @@ -29,7 +29,7 @@ namespace Nz VkImageViewCreateInfo createInfoView = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO }; createInfoView.subresourceRange = { - VK_IMAGE_ASPECT_COLOR_BIT, + ToVulkan(PixelFormatInfo::GetContent(params.pixelFormat)), 0, 1, 0, @@ -350,6 +350,29 @@ namespace Nz // TODO: Fill this switch switch (pixelFormat) { + // Regular formats + case PixelFormat::BGR8: + case PixelFormat::BGR8_SRGB: + case PixelFormat::BGRA8: + case PixelFormat::BGRA8_SRGB: + case PixelFormat::Depth16: + case PixelFormat::Depth16Stencil8: + case PixelFormat::Depth24Stencil8: + case PixelFormat::Depth32F: + case PixelFormat::Depth32FStencil8: + case PixelFormat::RGB8: + case PixelFormat::RGB8_SRGB: + case PixelFormat::RGBA8: + case PixelFormat::RGBA8_SRGB: + case PixelFormat::RGBA16F: + case PixelFormat::RGBA32F: + { + createImage.format = ToVulkan(pixelFormat); + createImageView.format = createImage.format; + break; + } + + // "emulated" formats case PixelFormat::A8: { createImage.format = VK_FORMAT_R8_UNORM; @@ -363,62 +386,6 @@ namespace Nz break; } - case PixelFormat::BGR8: - case PixelFormat::BGR8_SRGB: - case PixelFormat::BGRA8: - case PixelFormat::BGRA8_SRGB: - case PixelFormat::RGB8: - case PixelFormat::RGB8_SRGB: - case PixelFormat::RGBA8: - case PixelFormat::RGBA8_SRGB: - case PixelFormat::RGBA16F: - case PixelFormat::RGBA32F: - { - createImage.format = ToVulkan(pixelFormat); - createImageView.format = createImage.format; - break; - } - - case PixelFormat::Depth16: - { - createImage.format = VK_FORMAT_D16_UNORM; - createImageView.format = createImage.format; - createImageView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; - break; - } - - case PixelFormat::Depth16Stencil8: - { - createImage.format = VK_FORMAT_D16_UNORM_S8_UINT; - createImageView.format = createImage.format; - createImageView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; - break; - } - - case PixelFormat::Depth24Stencil8: - { - createImage.format = VK_FORMAT_D24_UNORM_S8_UINT; - createImageView.format = createImage.format; - createImageView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; - break; - } - - case PixelFormat::Depth32F: - { - createImage.format = VK_FORMAT_D32_SFLOAT; - createImageView.format = createImage.format; - createImageView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; - break; - } - - case PixelFormat::Depth32FStencil8: - { - createImage.format = VK_FORMAT_D32_SFLOAT_S8_UINT; - createImageView.format = createImage.format; - createImageView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; - break; - } - case PixelFormat::L8: { createImage.format = VK_FORMAT_R8_UNORM; @@ -427,7 +394,7 @@ namespace Nz VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_R, - VK_COMPONENT_SWIZZLE_A + VK_COMPONENT_SWIZZLE_ONE }; break; }