Refactor discerning image view types

Bug: b/162315264
Change-Id: I92cca44ad78aea9fcdcb8e0bc0f3c2c1ff28f19f
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/47508
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Device/Sampler.hpp b/src/Device/Sampler.hpp
index 148d781..87111d7 100644
--- a/src/Device/Sampler.hpp
+++ b/src/Device/Sampler.hpp
@@ -114,19 +114,99 @@
 	float minLod = 0.0f;
 	float maxLod = 0.0f;
 
+	bool is1D() const
+	{
+		switch(textureType)
+		{
+			case VK_IMAGE_VIEW_TYPE_1D:
+			case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
+				return true;
+			case VK_IMAGE_VIEW_TYPE_2D:
+			case VK_IMAGE_VIEW_TYPE_3D:
+			case VK_IMAGE_VIEW_TYPE_CUBE:
+			case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
+			case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
+				return false;
+			default:
+				UNSUPPORTED("VkImageViewType %d", (int)textureType);
+		}
+
+		return false;
+	}
+
+	bool is2D() const
+	{
+		switch(textureType)
+		{
+			case VK_IMAGE_VIEW_TYPE_2D:
+			case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
+				return true;
+			case VK_IMAGE_VIEW_TYPE_1D:
+			case VK_IMAGE_VIEW_TYPE_3D:
+			case VK_IMAGE_VIEW_TYPE_CUBE:
+			case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
+			case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
+				return false;
+			default:
+				UNSUPPORTED("VkImageViewType %d", (int)textureType);
+		}
+
+		return false;
+	}
+
+	bool is3D() const
+	{
+		switch(textureType)
+		{
+			case VK_IMAGE_VIEW_TYPE_3D:
+				return true;
+			case VK_IMAGE_VIEW_TYPE_1D:
+			case VK_IMAGE_VIEW_TYPE_2D:
+			case VK_IMAGE_VIEW_TYPE_CUBE:
+			case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
+			case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
+			case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
+				return false;
+			default:
+				UNSUPPORTED("VkImageViewType %d", (int)textureType);
+		}
+
+		return false;
+	}
+
+	bool isCube() const
+	{
+		switch(textureType)
+		{
+			case VK_IMAGE_VIEW_TYPE_CUBE:
+			case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
+				return true;
+			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_2D_ARRAY:
+				return false;
+			default:
+				UNSUPPORTED("VkImageViewType %d", (int)textureType);
+		}
+
+		return false;
+	}
+
 	bool isArrayed() const
 	{
 		switch(textureType)
 		{
+			case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
+			case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
+			case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
+				return true;
 			case VK_IMAGE_VIEW_TYPE_1D:
 			case VK_IMAGE_VIEW_TYPE_2D:
 			case VK_IMAGE_VIEW_TYPE_3D:
 			case VK_IMAGE_VIEW_TYPE_CUBE:
 				return false;
-			case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
-			case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
-			case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
-				return true;
 			default:
 				UNSUPPORTED("VkImageViewType %d", (int)textureType);
 		}
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp
index 43a7fa2..ee59c1e 100644
--- a/src/Pipeline/SamplerCore.cpp
+++ b/src/Pipeline/SamplerCore.cpp
@@ -50,7 +50,7 @@
 	Float4 vDelta;
 	Float4 M;  // Major axis
 
-	if(isCube())
+	if(state.isCube())
 	{
 		Int4 face = cubeFace(u, v, uvwa[0], uvwa[1], uvwa[2], M);
 		w = As<Float4>(face);
@@ -58,15 +58,15 @@
 
 	if(function == Implicit || function == Bias || function == Grad || function == Query)
 	{
-		if(state.addressingModeV == ADDRESSING_UNUSED)
+		if(state.is1D())
 		{
 			computeLod1D(texture, lod, u, dsx, dsy, function);
 		}
-		else if(state.addressingModeW == ADDRESSING_UNUSED)
+		else if(state.is2D())
 		{
 			computeLod2D(texture, lod, anisotropy, uDelta, vDelta, u, v, dsx, dsy, function);
 		}
-		else if(isCube())
+		else if(state.isCube())
 		{
 			computeLodCube(texture, lod, uvwa[0], uvwa[1], uvwa[2], dsx, dsy, M, function);
 		}
@@ -128,9 +128,8 @@
 	}
 
 	bool force32BitFiltering = state.highPrecisionFiltering && !isYcbcrFormat() && (state.textureFilter != FILTER_POINT);
-	bool seamlessCube = (state.addressingModeU == ADDRESSING_SEAMLESS);
 	bool use32BitFiltering = hasFloatTexture() || hasUnnormalizedIntegerTexture() || force32BitFiltering ||
-	                         seamlessCube || state.unnormalizedCoordinates || state.compareEnable ||
+	                         state.isCube() || state.unnormalizedCoordinates || state.compareEnable ||
 	                         borderModeActive() || (function == Gather) || (function == Fetch);
 
 	if(use32BitFiltering)
@@ -978,7 +977,7 @@
 	y0 *= pitchP;
 
 	Int4 z;
-	if(state.addressingModeW == ADDRESSING_CUBEFACE || state.isArrayed())
+	if(state.isCube() || state.isArrayed())
 	{
 		Int4 face = As<Int4>(w);
 		Int4 layerIndex = computeLayerIndex(a, mipmap, function);
@@ -989,7 +988,7 @@
 			layerIndex *= Int4(6);
 		}
 
-		z = (state.addressingModeW == ADDRESSING_CUBEFACE) ? face : layerIndex;
+		z = state.isCube() ? face : layerIndex;
 
 		if(state.textureType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
 		{
@@ -1391,7 +1390,7 @@
 
 	UInt4 indices = Int4(uuuu);
 
-	if(state.addressingModeV != ADDRESSING_UNUSED)
+	if(state.is2D() || state.is3D() || state.isCube())
 	{
 		vvvv = MulHigh(As<UShort4>(vvvv), UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, height))));
 
@@ -1408,7 +1407,7 @@
 		indices = UInt4(As<UInt2>(i01), As<UInt2>(i23));
 	}
 
-	if(state.textureType == VK_IMAGE_VIEW_TYPE_3D)
+	if(state.is3D())
 	{
 		wwww = MulHigh(As<UShort4>(wwww), UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, depth))));
 
@@ -1451,12 +1450,12 @@
 {
 	UInt4 indices = uuuu;
 
-	if(state.addressingModeV != ADDRESSING_UNUSED)
+	if(state.is2D() || state.is3D() || state.isCube())
 	{
 		indices += As<UInt4>(vvvv);
 	}
 
-	if(state.addressingModeW != ADDRESSING_UNUSED || state.isArrayed())
+	if(state.is3D() || state.isCube() || state.isArrayed())
 	{
 		indices += As<UInt4>(wwww);
 	}
@@ -1908,8 +1907,8 @@
 	{
 		// Valid texels have positive coordinates.
 		Int4 negative = uuuu;
-		if(state.addressingModeV != ADDRESSING_UNUSED) negative |= vvvv;
-		if(state.addressingModeW != ADDRESSING_UNUSED || state.isArrayed()) negative |= wwww;
+		if(state.is2D() || state.is3D() || state.isCube()) negative |= vvvv;
+		if(state.is3D() || state.isCube() || state.isArrayed()) negative |= wwww;
 		valid = CmpNLT(negative, Int4(0));
 	}
 
@@ -2588,12 +2587,6 @@
 	       state.addressingModeW == ADDRESSING_BORDER;
 }
 
-bool SamplerCore::isCube() const
-{
-	return state.textureType == VK_IMAGE_VIEW_TYPE_CUBE ||
-	       state.textureType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
-}
-
 VkComponentSwizzle SamplerCore::gatherSwizzle() const
 {
 	switch(state.gatherComponent)
diff --git a/src/Pipeline/SamplerCore.hpp b/src/Pipeline/SamplerCore.hpp
index 82c6079..a59cce8 100644
--- a/src/Pipeline/SamplerCore.hpp
+++ b/src/Pipeline/SamplerCore.hpp
@@ -107,7 +107,6 @@
 	bool isYcbcrFormat() const;
 	bool isRGBComponent(int component) const;
 	bool borderModeActive() const;
-	bool isCube() const;
 	VkComponentSwizzle gatherSwizzle() const;
 
 	Pointer<Byte> &constants;