Implement B10G11R11_UFLOAT_PACK32 uniform texel buffer support

VK_FORMAT_B10G11R11_UFLOAT_PACK32 is a mandatory uniform texel buffer
format, which we claimed support for, but the implementation was
missing.

Bug: b/159561781
Change-Id: I47a1aa3d4f371603e4d97e85526e10677753b9ca
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/46008
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/Pipeline/SpirvShaderImage.cpp b/src/Pipeline/SpirvShaderImage.cpp
index e6c0438..b60af78 100644
--- a/src/Pipeline/SpirvShaderImage.cpp
+++ b/src/Pipeline/SpirvShaderImage.cpp
@@ -872,6 +872,12 @@
 			dst.move(2, SIMD::Float((packed[0]) & SIMD::Int(0x1F)) * SIMD::Float(1.0f / 0x1F));
 			dst.move(3, SIMD::Float((packed[0] >> 15) & SIMD::Int(0x1)));
 			break;
+		case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
+			dst.move(0, halfToFloatBits((packed[0] << 4) & SIMD::Int(0x7FF0)));
+			dst.move(1, halfToFloatBits((packed[0] >> 7) & SIMD::Int(0x7FF0)));
+			dst.move(2, halfToFloatBits((packed[0] >> 17) & SIMD::Int(0x7FE0)));
+			dst.move(3, SIMD::Float(1));
+			break;
 		default:
 			UNSUPPORTED("VkFormat %d", int(vkFormat));
 			break;
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp
index 77cefb6..0a806ce 100644
--- a/src/Vulkan/VkPhysicalDevice.cpp
+++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -791,6 +791,7 @@
 
 	switch(format)
 	{
+		// Vulkan 1.1 mandatory
 		case VK_FORMAT_R8_UNORM:
 		case VK_FORMAT_R8_SNORM:
 		case VK_FORMAT_R8_UINT:
@@ -810,8 +811,6 @@
 		case VK_FORMAT_A8B8G8R8_SINT_PACK32:
 		case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
 		case VK_FORMAT_A2B10G10R10_UINT_PACK32:
-		case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
-		case VK_FORMAT_A2R10G10B10_UINT_PACK32:
 		case VK_FORMAT_R16_UINT:
 		case VK_FORMAT_R16_SINT:
 		case VK_FORMAT_R16_SFLOAT:
@@ -831,6 +830,9 @@
 		case VK_FORMAT_R32G32B32A32_SINT:
 		case VK_FORMAT_R32G32B32A32_SFLOAT:
 		case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
+		// Optional
+		case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
+		case VK_FORMAT_A2R10G10B10_UINT_PACK32:
 			pFormatProperties->bufferFeatures |=
 			    VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
 			break;