Add support for sampling VK_FORMAT_A1R5G5B5_UNORM_PACK16

Bug: b/131246807
Test: dEQP-VK.*a1r5g5b5*
Change-Id: Iea73786b10dca6f4116a0093218e182a089c5bcf
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30468
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp
index fa34587..10e20dd 100644
--- a/src/Pipeline/SamplerCore.cpp
+++ b/src/Pipeline/SamplerCore.cpp
@@ -151,6 +151,12 @@
 						c.z *= Float4(1.0f / 0xF000);
 						c.w *= Float4(1.0f / 0xF000);
 						break;
+					case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
+						c.x *= Float4(1.0f / 0xF800);
+						c.y *= Float4(1.0f / 0xF800);
+						c.z *= Float4(1.0f / 0xF800);
+						c.w *= Float4(1.0f / 0x8000);
+						break;
 					default:
 						ASSERT(false);
 					}
@@ -181,6 +187,13 @@
 				c.z = Float4(As<UShort4>(cs.z)) * Float4(1.0f / 0xF000);
 				c.w = Float4(As<UShort4>(cs.w)) * Float4(1.0f / 0xF000);
 			}
+			else if (state.textureFormat == VK_FORMAT_A1R5G5B5_UNORM_PACK16)
+			{
+				c.x = Float4(As<UShort4>(cs.x)) * Float4(1.0f / 0xF800);
+				c.y = Float4(As<UShort4>(cs.y)) * Float4(1.0f / 0xF800);
+				c.z = Float4(As<UShort4>(cs.z)) * Float4(1.0f / 0xF800);
+				c.w = Float4(As<UShort4>(cs.w)) * Float4(1.0f / 0x8000);
+			}
 			else
 			{
 				for(int component = 0; component < textureComponentCount(); component++)
@@ -253,6 +266,7 @@
 			case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
 			case VK_FORMAT_A2B10G10R10_UINT_PACK32:
 			case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
+			case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
 				break;
 			default:
 				ASSERT(false);
@@ -1504,6 +1518,12 @@
 				c.y = (c.x << 4) & Short4(0xF000);
 				c.x = (c.x << 8) & Short4(0xF000);
 				break;
+			case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
+				c.w = (c.x) & Short4(0x8000);
+				c.z = (c.x << 11) & Short4(0xF800);
+				c.y = (c.x << 6) & Short4(0xF800);
+				c.x = (c.x << 1) & Short4(0xF800);
+				break;
 			default:
 				ASSERT(false);
 			}
diff --git a/src/Vulkan/VkFormat.cpp b/src/Vulkan/VkFormat.cpp
index c86fa81..e22844a 100644
--- a/src/Vulkan/VkFormat.cpp
+++ b/src/Vulkan/VkFormat.cpp
@@ -1700,6 +1700,7 @@
 	{
 	case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
 	case VK_FORMAT_R5G6B5_UNORM_PACK16:
+	case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
 		return true;
 	case VK_FORMAT_R8_SNORM:
 	case VK_FORMAT_R8G8_SNORM:
@@ -1765,6 +1766,7 @@
 	case VK_FORMAT_R8G8B8A8_SINT:
 	case VK_FORMAT_R8G8B8A8_UINT:
 		return true;
+	case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
 	case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
 	case VK_FORMAT_R5G6B5_UNORM_PACK16:
 	case VK_FORMAT_R32_SFLOAT:
@@ -1802,6 +1804,7 @@
 {
 	switch(format)
 	{
+	case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
 	case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
 	case VK_FORMAT_R5G6B5_UNORM_PACK16:
 	case VK_FORMAT_R8_SNORM:
@@ -1854,6 +1857,7 @@
 {
 	switch(format)
 	{
+	case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
 	case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
 	case VK_FORMAT_R5G6B5_UNORM_PACK16:
 	case VK_FORMAT_R8_SNORM:
@@ -1908,6 +1912,7 @@
 	{
 	case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
 		return true;
+	case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
 	case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
 	case VK_FORMAT_R5G6B5_UNORM_PACK16:
 	case VK_FORMAT_R8_SNORM:
@@ -1981,6 +1986,7 @@
 	case VK_FORMAT_R32G32_UINT:
 	case VK_FORMAT_R32G32_SFLOAT:
 		return component < 2;
+	case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
 	case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
 	case VK_FORMAT_R5G6B5_UNORM_PACK16:
 	case VK_FORMAT_R8G8B8A8_SNORM: