Add support for sampling VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
Bug: b/131246807
Test: dEQP-VK.*e5b9g9r9*
Change-Id: Ieb62847c5d86b57a81e718aa325e92e10c961c71
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30434
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 f04ba6d..f7ae859 100644
--- a/src/Pipeline/SamplerCore.cpp
+++ b/src/Pipeline/SamplerCore.cpp
@@ -250,6 +250,7 @@
case VK_FORMAT_R8G8B8A8_UNORM:
case VK_FORMAT_R8G8B8A8_SRGB:
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
+ case VK_FORMAT_E5B9G9R9_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);
@@ -1922,7 +1923,20 @@
c.w = *Pointer<Float4>(buffer[f3] + index[3] * 16, 16);
transpose4x4(c.x, c.y, c.z, c.w);
break;
-
+ case VK_FORMAT_E5B9G9R9_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.w = Float4(UInt4(1) << ((t0 >> 27) & UInt4(0x1F))) * Float4(1.0f / (1 << 24));
+ c.x = Float4((t0) & UInt4(0x1FF)) * c.w;
+ c.y = Float4((t0 >> 9) & UInt4(0x1FF)) * c.w;
+ c.z = Float4((t0 >> 18) & UInt4(0x1FF)) * c.w;
+ break;
+ }
default:
UNIMPLEMENTED("Format %d", VkFormat(state.textureFormat));
}
diff --git a/src/Vulkan/VkFormat.cpp b/src/Vulkan/VkFormat.cpp
index b6c72d3..3f757eb 100644
--- a/src/Vulkan/VkFormat.cpp
+++ b/src/Vulkan/VkFormat.cpp
@@ -1706,6 +1706,7 @@
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
+ case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
return false;
default:
UNIMPLEMENTED("Format: %d", int(format));
@@ -1759,6 +1760,7 @@
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
+ case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
return false;
default:
UNIMPLEMENTED("Format: %d", int(format));
@@ -1800,6 +1802,7 @@
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
+ case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
return false;
case VK_FORMAT_R16G16_UNORM:
case VK_FORMAT_R16G16B16A16_UNORM:
@@ -1858,6 +1861,7 @@
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
+ case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
return false;
case VK_FORMAT_R32_SINT:
case VK_FORMAT_R32_UINT:
@@ -1918,6 +1922,7 @@
case VK_FORMAT_R16G16B16A16_SFLOAT:
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
+ case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
return false;
default:
UNIMPLEMENTED("Format: %d", int(format));
@@ -1970,6 +1975,7 @@
case VK_FORMAT_R32G32B32A32_UINT:
case VK_FORMAT_R32G32B32A32_SFLOAT:
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
+ case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
return component < 3;
default:
UNIMPLEMENTED("Format: %d", int(format));