Implement 1D array image sampling

Treat it as a 2D array image by setting the second coordinate to 0 and
assigning the layer coordinate to the third.

Bug: b/129523279
Test: dEQP-VK.pipeline.image.*
Test: dEQP-VK.pipeline.sampler.*
Change-Id: I82e9a8081c2b7d7a2f62ffc016b860925bd853ad
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30708
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp
index 7ea5bfc..b53624c 100644
--- a/src/Pipeline/SpirvShaderSampling.cpp
+++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -69,7 +69,11 @@
 	samplerState.compareEnable = (sampler->compareEnable == VK_TRUE);
 	samplerState.compareOp = sampler->compareOp;
 
-	ASSERT(sampler->anisotropyEnable == VK_FALSE);  // TODO(b/129523279)
+	if(sampler->anisotropyEnable != VK_FALSE)
+	{
+		UNSUPPORTED("anisotropyEnable");
+	}
+
 	ASSERT(sampler->unnormalizedCoordinates == VK_FALSE);  // TODO(b/129523279)
 
 	auto fptr = emitSamplerFunction(instruction, samplerState);
@@ -113,11 +117,15 @@
 
 		// TODO(b/129523279): Currently 1D textures are treated as 2D by setting the second coordinate to 0.
 		// Implement optimized 1D sampling.
-		if(samplerState.textureType == TEXTURE_1D ||
-			samplerState.textureType == TEXTURE_1D_ARRAY)
+		if(samplerState.textureType == TEXTURE_1D)
 		{
 			uvw[1] = SIMD::Float(0);
 		}
+		else if(samplerState.textureType == TEXTURE_1D_ARRAY)
+		{
+			uvw[1] = SIMD::Float(0);
+			uvw[2] = in[1];  // Move 1D layer coordinate to 2D layer coordinate index.
+		}
 
 		if(instruction.samplerMethod == Lod || instruction.samplerMethod == Bias)
 		{
@@ -165,7 +173,7 @@
 	case VK_IMAGE_VIEW_TYPE_2D:         return TEXTURE_2D;
 	case VK_IMAGE_VIEW_TYPE_3D:         return TEXTURE_3D;
 	case VK_IMAGE_VIEW_TYPE_CUBE:       return TEXTURE_CUBE;
-//	case VK_IMAGE_VIEW_TYPE_1D_ARRAY:   return TEXTURE_1D_ARRAY;
+	case VK_IMAGE_VIEW_TYPE_1D_ARRAY:   return TEXTURE_1D_ARRAY;
 	case VK_IMAGE_VIEW_TYPE_2D_ARRAY:   return TEXTURE_2D_ARRAY;
 //	case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return TEXTURE_CUBE_ARRAY;
 	default:
@@ -233,8 +241,7 @@
 	case VK_IMAGE_VIEW_TYPE_2D:
 	case VK_IMAGE_VIEW_TYPE_3D:
 		break;
-//	case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
-		break;
+	case VK_IMAGE_VIEW_TYPE_1D_ARRAY:  // Treated as 2D texture with second coordinate 0.
 	case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
 		if(coordinateIndex == 2)
 		{
@@ -261,7 +268,7 @@
 	case VK_IMAGE_VIEW_TYPE_1D:
 	case VK_IMAGE_VIEW_TYPE_2D:
 	case VK_IMAGE_VIEW_TYPE_3D:
-//	case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
+	case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
 	case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
 		break;
 	default: