Add support for sampling VK_FORMAT_B10G11R11_UFLOAT_PACK32
Test: dEQP-VK.*b10g11r11*
Bug: b/131246807
Change-Id: I3357cb5d6fccd37c1bf612fbc51380b490ded7d0
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30508
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp
index 93ae7e3..e9a4ac4 100644
--- a/src/Pipeline/SamplerCore.cpp
+++ b/src/Pipeline/SamplerCore.cpp
@@ -251,6 +251,7 @@
case VK_FORMAT_R8G8B8A8_SRGB:
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
+ case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
if(componentCount < 2) c.y = Float4(0.0f);
if(componentCount < 3) c.z = Float4(0.0f);
if(componentCount < 4) c.w = Float4(1.0f);
@@ -1939,6 +1940,19 @@
c.z = Float4((t0 >> 18) & UInt4(0x1FF)) * c.w;
break;
}
+ case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
+ {
+ Float4 t; // TODO: add Insert(UInt4, RValue<UInt>)
+ t.x = *Pointer<Float>(buffer[f0] + index[0] * 4);
+ t.y = *Pointer<Float>(buffer[f1] + index[1] * 4);
+ t.z = *Pointer<Float>(buffer[f2] + index[2] * 4);
+ t.w = *Pointer<Float>(buffer[f3] + index[3] * 4);
+ t0 = As<UInt4>(t);
+ c.x = As<Float4>(halfToFloatBits((t0 << 4) & UInt4(0x7FF0)));
+ c.y = As<Float4>(halfToFloatBits((t0 >> 7) & UInt4(0x7FF0)));
+ c.z = As<Float4>(halfToFloatBits((t0 >> 17) & UInt4(0x7FE0)));
+ break;
+ }
default:
UNIMPLEMENTED("Format %d", VkFormat(state.textureFormat));
}
diff --git a/src/Vulkan/VkFormat.cpp b/src/Vulkan/VkFormat.cpp
index 9ad6be3..c1851cf 100644
--- a/src/Vulkan/VkFormat.cpp
+++ b/src/Vulkan/VkFormat.cpp
@@ -1707,6 +1707,7 @@
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
+ case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
return false;
default:
UNIMPLEMENTED("Format: %d", int(format));
@@ -1761,6 +1762,7 @@
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
+ case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
return false;
default:
UNIMPLEMENTED("Format: %d", int(format));
@@ -1803,6 +1805,7 @@
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
+ case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
return false;
case VK_FORMAT_R16G16_UNORM:
case VK_FORMAT_R16G16B16A16_UNORM:
@@ -1862,6 +1865,7 @@
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
+ case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
return false;
case VK_FORMAT_R32_SINT:
case VK_FORMAT_R32_UINT:
@@ -1924,6 +1928,7 @@
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
case VK_FORMAT_D32_SFLOAT:
+ case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
return false;
default:
UNIMPLEMENTED("Format: %d", int(format));
@@ -1977,6 +1982,7 @@
case VK_FORMAT_R32G32B32A32_SFLOAT:
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
+ case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
return component < 3;
case VK_FORMAT_D32_SFLOAT:
return false;