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;