Enable sampling of 2d array textures

Test: dEQP-VK.*2d_array*
Change-Id: I106c9d072362c16e2cff14a70901c2ce89657329
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30069
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp
index c46f6f8..6abb34c 100644
--- a/src/Pipeline/SpirvShaderSampling.cpp
+++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -88,6 +88,10 @@
 	samplerState.addressingModeU = convertAddressingMode(sampler->addressModeU, imageView->getType());
 	samplerState.addressingModeV = convertAddressingMode(sampler->addressModeV, imageView->getType());
 	samplerState.addressingModeW = convertAddressingMode(sampler->addressModeW, imageView->getType());
+
+	if (imageView->getType() == VK_IMAGE_VIEW_TYPE_2D_ARRAY)
+		samplerState.addressingModeW = ADDRESSING_LAYER;
+
 	samplerState.mipmapFilter = convertMipmapMode(sampler);
 	samplerState.sRGB = imageView->getFormat().isSRGBformat();
 	samplerState.swizzle = imageView->getComponentMapping();
@@ -120,7 +124,7 @@
 //	case VK_IMAGE_VIEW_TYPE_3D:         coordinateCount = 3; break;
 	case VK_IMAGE_VIEW_TYPE_CUBE:       coordinateCount = 3; break;
 //	case VK_IMAGE_VIEW_TYPE_1D_ARRAY:   coordinateCount = 2; break;
-//	case VK_IMAGE_VIEW_TYPE_2D_ARRAY:   coordinateCount = 3; break;
+	case VK_IMAGE_VIEW_TYPE_2D_ARRAY:   coordinateCount = 3; break;
 //	case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: coordinateCount = 4; break;
 	default:
 		UNIMPLEMENTED("imageView type %d", imageView->getType());
@@ -164,7 +168,7 @@
 //	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_2D_ARRAY:   return TEXTURE_2D_ARRAY;
+	case VK_IMAGE_VIEW_TYPE_2D_ARRAY:   return TEXTURE_2D_ARRAY;
 //	case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return TEXTURE_CUBE_ARRAY;
 	default:
 		UNIMPLEMENTED("imageViewType %d", imageViewType);
@@ -230,7 +234,7 @@
 	case VK_IMAGE_VIEW_TYPE_2D:
 //	case VK_IMAGE_VIEW_TYPE_3D:
 //	case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
-//	case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
+	case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
 		break;
 	default:
 		UNIMPLEMENTED("imageViewType %d", imageViewType);
diff --git a/src/Vulkan/VkDescriptorSetLayout.cpp b/src/Vulkan/VkDescriptorSetLayout.cpp
index b624057..ac395b2 100644
--- a/src/Vulkan/VkDescriptorSetLayout.cpp
+++ b/src/Vulkan/VkDescriptorSetLayout.cpp
@@ -324,11 +324,13 @@
 
 				VkExtent3D extent = imageView->getMipLevelExtent(level);
 				Format format = imageView->getFormat();
+				int layers = imageView->getSubresourceRange().layerCount;
+				// TODO(b/129523279): Untangle depth vs layers throughout the sampler
 				int width = extent.width;
 				int height = extent.height;
-				int depth = extent.depth;
+				int depth = layers > 1 ? layers : extent.depth;
 				int pitchP = imageView->rowPitchBytes(aspect, level) / format.bytes();
-				int sliceP = imageView->slicePitchBytes(aspect, level) / format.bytes();
+				int sliceP = (layers > 1 ? imageView->layerPitchBytes(aspect) : imageView->slicePitchBytes(aspect, level)) / format.bytes();
 
 				float exp2LOD = 1.0f;