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));