Enable sampling a depth-stencil format
ANGLE needs to be able to use the depth buffer in a sampled
texture to emulate some GLES2 features, even when the image
also contains a stencil. Added support for sampling the
depth+stencil format we support.
Tests: dEQP-VK.*
Bug b/141304420
Change-Id: Ia4ccce2a155aa16178f16eb92efae9fc357b6e45
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/36449
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Vulkan/VkFormat.cpp b/src/Vulkan/VkFormat.cpp
index 7e7cce7..3746c08 100644
--- a/src/Vulkan/VkFormat.cpp
+++ b/src/Vulkan/VkFormat.cpp
@@ -196,6 +196,7 @@
case VK_IMAGE_ASPECT_STENCIL_BIT:
switch(format)
{
+ case VK_FORMAT_S8_UINT:
case VK_FORMAT_D16_UNORM_S8_UINT:
case VK_FORMAT_D24_UNORM_S8_UINT:
case VK_FORMAT_D32_SFLOAT_S8_UINT:
@@ -211,6 +212,7 @@
case VK_IMAGE_ASPECT_PLANE_0_BIT:
switch(format)
{
+ case VK_FORMAT_R8_UNORM:
case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
return VK_FORMAT_R8_UNORM;
@@ -223,8 +225,10 @@
case VK_IMAGE_ASPECT_PLANE_1_BIT:
switch(format)
{
+ case VK_FORMAT_R8_UNORM:
case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
return VK_FORMAT_R8_UNORM;
+ case VK_FORMAT_R8G8_UNORM:
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
return VK_FORMAT_R8G8_UNORM;
default:
@@ -236,6 +240,7 @@
case VK_IMAGE_ASPECT_PLANE_2_BIT:
switch(format)
{
+ case VK_FORMAT_R8_UNORM:
case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
return VK_FORMAT_R8_UNORM;
default:
diff --git a/src/Vulkan/VkImageView.cpp b/src/Vulkan/VkImageView.cpp
index d847aa7..0a61ce6 100644
--- a/src/Vulkan/VkImageView.cpp
+++ b/src/Vulkan/VkImageView.cpp
@@ -253,7 +253,8 @@
Format ImageView::getFormat(Usage usage) const
{
- return ((usage == RAW) || (getImage(usage) == image)) ? format : getImage(usage)->getFormat();
+ Format imageFormat = ((usage == RAW) || (getImage(usage) == image)) ? format : getImage(usage)->getFormat();
+ return imageFormat.getAspectFormat(subresourceRange.aspectMask);
}
int ImageView::rowPitchBytes(VkImageAspectFlagBits aspect, uint32_t mipLevel, Usage usage) const
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp
index 1618773..1112b56 100644
--- a/src/Vulkan/VkPhysicalDevice.cpp
+++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -451,8 +451,10 @@
case VK_FORMAT_R32G32B32A32_UINT:
case VK_FORMAT_R32G32B32A32_SINT:
case VK_FORMAT_R32G32B32A32_SFLOAT:
+ case VK_FORMAT_S8_UINT:
case VK_FORMAT_D16_UNORM:
case VK_FORMAT_D32_SFLOAT:
+ case VK_FORMAT_D32_SFLOAT_S8_UINT:
pFormatProperties->optimalTilingFeatures |=
VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
VK_FORMAT_FEATURE_BLIT_SRC_BIT |
@@ -557,6 +559,7 @@
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
VK_FORMAT_FEATURE_BLIT_DST_BIT;
break;
+ case VK_FORMAT_S8_UINT:
case VK_FORMAT_D16_UNORM:
case VK_FORMAT_D32_SFLOAT: // Note: either VK_FORMAT_D32_SFLOAT or VK_FORMAT_X8_D24_UNORM_PACK32 must be supported
case VK_FORMAT_D32_SFLOAT_S8_UINT: // Note: either VK_FORMAT_D24_UNORM_S8_UINT or VK_FORMAT_D32_SFLOAT_S8_UINT must be supported