Refactor vertex fetch to use VkFormat more aggressively

Bug: b/152218432
Change-Id: I71eb0cbda5ae98ab39d9953fe049368b8341193a
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/42748
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/VertexRoutine.cpp b/src/Pipeline/VertexRoutine.cpp
index 1eebf57..36e660c 100644
--- a/src/Pipeline/VertexRoutine.cpp
+++ b/src/Pipeline/VertexRoutine.cpp
@@ -225,226 +225,137 @@
 
 					transpose4xN(v.x, v.y, v.z, v.w, componentCount);
 				}
-
-				switch(stream.attribType)
-				{
-					case SpirvShader::ATTRIBTYPE_INT:
-						if(componentCount >= 1) v.x = As<Float4>(Int4(v.x));
-						if(componentCount >= 2) v.x = As<Float4>(Int4(v.y));
-						if(componentCount >= 3) v.x = As<Float4>(Int4(v.z));
-						if(componentCount >= 4) v.x = As<Float4>(Int4(v.w));
-						break;
-					case SpirvShader::ATTRIBTYPE_UINT:
-						if(componentCount >= 1) v.x = As<Float4>(UInt4(v.x));
-						if(componentCount >= 2) v.x = As<Float4>(UInt4(v.y));
-						if(componentCount >= 3) v.x = As<Float4>(UInt4(v.z));
-						if(componentCount >= 4) v.x = As<Float4>(UInt4(v.w));
-						break;
-					default:
-						break;
-				}
 			}
 		}
 		break;
 		case VK_FORMAT_B8G8R8A8_UNORM:
 			bgra = true;
+			// [[fallthrough]]
 		case VK_FORMAT_R8_UNORM:
 		case VK_FORMAT_R8G8_UNORM:
 		case VK_FORMAT_R8G8B8A8_UNORM:
+		case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
+			v.x = Float4(*Pointer<Byte4>(source0));
+			v.y = Float4(*Pointer<Byte4>(source1));
+			v.z = Float4(*Pointer<Byte4>(source2));
+			v.w = Float4(*Pointer<Byte4>(source3));
+
+			transpose4xN(v.x, v.y, v.z, v.w, componentCount);
+
+			if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte));
+			if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte));
+			if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte));
+			if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte));
+			break;
 		case VK_FORMAT_R8_UINT:
 		case VK_FORMAT_R8G8_UINT:
 		case VK_FORMAT_R8G8B8A8_UINT:
-		case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
 		case VK_FORMAT_A8B8G8R8_UINT_PACK32:
-			if(isNativeFloatAttrib)  // Stream: UByte, Shader attrib: Float
-			{
-				v.x = Float4(*Pointer<Byte4>(source0));
-				v.y = Float4(*Pointer<Byte4>(source1));
-				v.z = Float4(*Pointer<Byte4>(source2));
-				v.w = Float4(*Pointer<Byte4>(source3));
+			v.x = As<Float4>(Int4(*Pointer<Byte4>(source0)));
+			v.y = As<Float4>(Int4(*Pointer<Byte4>(source1)));
+			v.z = As<Float4>(Int4(*Pointer<Byte4>(source2)));
+			v.w = As<Float4>(Int4(*Pointer<Byte4>(source3)));
 
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-
-				if(normalized)
-				{
-					if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte));
-					if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte));
-					if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte));
-					if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleByte));
-				}
-			}
-			else  // Stream: UByte, Shader attrib: Int / UInt
-			{
-				v.x = As<Float4>(Int4(*Pointer<Byte4>(source0)));
-				v.y = As<Float4>(Int4(*Pointer<Byte4>(source1)));
-				v.z = As<Float4>(Int4(*Pointer<Byte4>(source2)));
-				v.w = As<Float4>(Int4(*Pointer<Byte4>(source3)));
-
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-			}
+			transpose4xN(v.x, v.y, v.z, v.w, componentCount);
 			break;
 		case VK_FORMAT_R8_SNORM:
-		case VK_FORMAT_R8_SINT:
 		case VK_FORMAT_R8G8_SNORM:
-		case VK_FORMAT_R8G8_SINT:
 		case VK_FORMAT_R8G8B8A8_SNORM:
-		case VK_FORMAT_R8G8B8A8_SINT:
 		case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
+			v.x = Float4(*Pointer<SByte4>(source0));
+			v.y = Float4(*Pointer<SByte4>(source1));
+			v.z = Float4(*Pointer<SByte4>(source2));
+			v.w = Float4(*Pointer<SByte4>(source3));
+
+			transpose4xN(v.x, v.y, v.z, v.w, componentCount);
+
+			if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
+			if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
+			if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
+			if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
+			break;
+		case VK_FORMAT_R8_SINT:
+		case VK_FORMAT_R8G8_SINT:
+		case VK_FORMAT_R8G8B8A8_SINT:
 		case VK_FORMAT_A8B8G8R8_SINT_PACK32:
-			if(isNativeFloatAttrib)  // Stream: SByte, Shader attrib: Float
-			{
-				v.x = Float4(*Pointer<SByte4>(source0));
-				v.y = Float4(*Pointer<SByte4>(source1));
-				v.z = Float4(*Pointer<SByte4>(source2));
-				v.w = Float4(*Pointer<SByte4>(source3));
+			v.x = As<Float4>(Int4(*Pointer<SByte4>(source0)));
+			v.y = As<Float4>(Int4(*Pointer<SByte4>(source1)));
+			v.z = As<Float4>(Int4(*Pointer<SByte4>(source2)));
+			v.w = As<Float4>(Int4(*Pointer<SByte4>(source3)));
 
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-
-				if(normalized)
-				{
-					if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
-					if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
-					if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
-					if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleSByte));
-				}
-			}
-			else  // Stream: SByte, Shader attrib: Int / UInt
-			{
-				v.x = As<Float4>(Int4(*Pointer<SByte4>(source0)));
-				v.y = As<Float4>(Int4(*Pointer<SByte4>(source1)));
-				v.z = As<Float4>(Int4(*Pointer<SByte4>(source2)));
-				v.w = As<Float4>(Int4(*Pointer<SByte4>(source3)));
-
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-			}
+			transpose4xN(v.x, v.y, v.z, v.w, componentCount);
 			break;
 		case VK_FORMAT_R16_SNORM:
-		case VK_FORMAT_R16_SINT:
 		case VK_FORMAT_R16G16_SNORM:
-		case VK_FORMAT_R16G16_SINT:
 		case VK_FORMAT_R16G16B16A16_SNORM:
+			v.x = Float4(*Pointer<Short4>(source0));
+			v.y = Float4(*Pointer<Short4>(source1));
+			v.z = Float4(*Pointer<Short4>(source2));
+			v.w = Float4(*Pointer<Short4>(source3));
+
+			transpose4xN(v.x, v.y, v.z, v.w, componentCount);
+
+			if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
+			if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
+			if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
+			if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
+			break;
+		case VK_FORMAT_R16_SINT:
+		case VK_FORMAT_R16G16_SINT:
 		case VK_FORMAT_R16G16B16A16_SINT:
-			if(isNativeFloatAttrib)  // Stream: Int, Shader attrib: Float
-			{
-				v.x = Float4(*Pointer<Short4>(source0));
-				v.y = Float4(*Pointer<Short4>(source1));
-				v.z = Float4(*Pointer<Short4>(source2));
-				v.w = Float4(*Pointer<Short4>(source3));
+			v.x = As<Float4>(Int4(*Pointer<Short4>(source0)));
+			v.y = As<Float4>(Int4(*Pointer<Short4>(source1)));
+			v.z = As<Float4>(Int4(*Pointer<Short4>(source2)));
+			v.w = As<Float4>(Int4(*Pointer<Short4>(source3)));
 
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-
-				if(normalized)
-				{
-					if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
-					if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
-					if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
-					if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleShort));
-				}
-			}
-			else  // Stream: Short, Shader attrib: Int/UInt, no type conversion
-			{
-				v.x = As<Float4>(Int4(*Pointer<Short4>(source0)));
-				v.y = As<Float4>(Int4(*Pointer<Short4>(source1)));
-				v.z = As<Float4>(Int4(*Pointer<Short4>(source2)));
-				v.w = As<Float4>(Int4(*Pointer<Short4>(source3)));
-
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-			}
+			transpose4xN(v.x, v.y, v.z, v.w, componentCount);
 			break;
 		case VK_FORMAT_R16_UNORM:
-		case VK_FORMAT_R16_UINT:
 		case VK_FORMAT_R16G16_UNORM:
-		case VK_FORMAT_R16G16_UINT:
 		case VK_FORMAT_R16G16B16A16_UNORM:
+			v.x = Float4(*Pointer<UShort4>(source0));
+			v.y = Float4(*Pointer<UShort4>(source1));
+			v.z = Float4(*Pointer<UShort4>(source2));
+			v.w = Float4(*Pointer<UShort4>(source3));
+
+			transpose4xN(v.x, v.y, v.z, v.w, componentCount);
+
+			if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
+			if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
+			if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
+			if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
+			break;
+		case VK_FORMAT_R16_UINT:
+		case VK_FORMAT_R16G16_UINT:
 		case VK_FORMAT_R16G16B16A16_UINT:
-			if(isNativeFloatAttrib)  // Stream: Int, Shader attrib: Float
-			{
-				v.x = Float4(*Pointer<UShort4>(source0));
-				v.y = Float4(*Pointer<UShort4>(source1));
-				v.z = Float4(*Pointer<UShort4>(source2));
-				v.w = Float4(*Pointer<UShort4>(source3));
+			v.x = As<Float4>(Int4(*Pointer<UShort4>(source0)));
+			v.y = As<Float4>(Int4(*Pointer<UShort4>(source1)));
+			v.z = As<Float4>(Int4(*Pointer<UShort4>(source2)));
+			v.w = As<Float4>(Int4(*Pointer<UShort4>(source3)));
 
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-
-				if(normalized)
-				{
-					if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
-					if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
-					if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
-					if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUShort));
-				}
-			}
-			else  // Stream: UShort, Shader attrib: Int/UInt, no type conversion
-			{
-				v.x = As<Float4>(Int4(*Pointer<UShort4>(source0)));
-				v.y = As<Float4>(Int4(*Pointer<UShort4>(source1)));
-				v.z = As<Float4>(Int4(*Pointer<UShort4>(source2)));
-				v.w = As<Float4>(Int4(*Pointer<UShort4>(source3)));
-
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-			}
+			transpose4xN(v.x, v.y, v.z, v.w, componentCount);
 			break;
 		case VK_FORMAT_R32_SINT:
 		case VK_FORMAT_R32G32_SINT:
 		case VK_FORMAT_R32G32B32_SINT:
 		case VK_FORMAT_R32G32B32A32_SINT:
-			if(isNativeFloatAttrib)  // Stream: Int, Shader attrib: Float
-			{
-				v.x = Float4(*Pointer<Int4>(source0));
-				v.y = Float4(*Pointer<Int4>(source1));
-				v.z = Float4(*Pointer<Int4>(source2));
-				v.w = Float4(*Pointer<Int4>(source3));
+			v.x = *Pointer<Float4>(source0);
+			v.y = *Pointer<Float4>(source1);
+			v.z = *Pointer<Float4>(source2);
+			v.w = *Pointer<Float4>(source3);
 
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-
-				if(normalized)
-				{
-					if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt));
-					if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt));
-					if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt));
-					if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleInt));
-				}
-			}
-			else  // Stream: Int, Shader attrib: Int/UInt, no type conversion
-			{
-				v.x = *Pointer<Float4>(source0);
-				v.y = *Pointer<Float4>(source1);
-				v.z = *Pointer<Float4>(source2);
-				v.w = *Pointer<Float4>(source3);
-
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-			}
+			transpose4xN(v.x, v.y, v.z, v.w, componentCount);
 			break;
 		case VK_FORMAT_R32_UINT:
 		case VK_FORMAT_R32G32_UINT:
 		case VK_FORMAT_R32G32B32_UINT:
 		case VK_FORMAT_R32G32B32A32_UINT:
-			if(isNativeFloatAttrib)  // Stream: UInt, Shader attrib: Float
-			{
-				v.x = Float4(*Pointer<UInt4>(source0));
-				v.y = Float4(*Pointer<UInt4>(source1));
-				v.z = Float4(*Pointer<UInt4>(source2));
-				v.w = Float4(*Pointer<UInt4>(source3));
+			v.x = *Pointer<Float4>(source0);
+			v.y = *Pointer<Float4>(source1);
+			v.z = *Pointer<Float4>(source2);
+			v.w = *Pointer<Float4>(source3);
 
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-
-				if(normalized)
-				{
-					if(componentCount >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt));
-					if(componentCount >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt));
-					if(componentCount >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt));
-					if(componentCount >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants, unscaleUInt));
-				}
-			}
-			else  // Stream: UInt, Shader attrib: Int/UInt, no type conversion
-			{
-				v.x = *Pointer<Float4>(source0);
-				v.y = *Pointer<Float4>(source1);
-				v.z = *Pointer<Float4>(source2);
-				v.w = *Pointer<Float4>(source3);
-
-				transpose4xN(v.x, v.y, v.z, v.w, componentCount);
-			}
+			transpose4xN(v.x, v.y, v.z, v.w, componentCount);
 			break;
 		case VK_FORMAT_R16_SFLOAT:
 		case VK_FORMAT_R16G16_SFLOAT:
@@ -504,9 +415,29 @@
 		}
 		break;
 		case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
+			bgra = true;
+			// [[fallthrough]]
+		case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
+		{
+			Int4 src;
+			src = Insert(src, *Pointer<Int>(source0), 0);
+			src = Insert(src, *Pointer<Int>(source1), 1);
+			src = Insert(src, *Pointer<Int>(source2), 2);
+			src = Insert(src, *Pointer<Int>(source3), 3);
+			v.x = Float4((src << 22) >> 22);
+			v.y = Float4((src << 12) >> 22);
+			v.z = Float4((src << 02) >> 22);
+			v.w = Float4(src >> 30);
+
+			v.x = Max(v.x * Float4(1.0f / 0x1FF), Float4(-1.0f));
+			v.y = Max(v.y * Float4(1.0f / 0x1FF), Float4(-1.0f));
+			v.z = Max(v.z * Float4(1.0f / 0x1FF), Float4(-1.0f));
+			v.w = Max(v.w, Float4(-1.0f));
+		}
+		break;
 		case VK_FORMAT_A2R10G10B10_SINT_PACK32:
 			bgra = true;
-		case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
+			// [[fallthrough]]
 		case VK_FORMAT_A2B10G10R10_SINT_PACK32:
 		{
 			Int4 src;
@@ -514,34 +445,37 @@
 			src = Insert(src, *Pointer<Int>(source1), 1);
 			src = Insert(src, *Pointer<Int>(source2), 2);
 			src = Insert(src, *Pointer<Int>(source3), 3);
-			if(isNativeFloatAttrib)  // Stream: Int, Shader attrib: Float
-			{
-				v.x = Float4((src << 22) >> 22);
-				v.y = Float4((src << 12) >> 22);
-				v.z = Float4((src << 02) >> 22);
-				v.w = Float4(src >> 30);
-
-				if(normalized)
-				{
-					v.x = Max(v.x * Float4(1.0f / 0x1FF), Float4(-1.0f));
-					v.y = Max(v.y * Float4(1.0f / 0x1FF), Float4(-1.0f));
-					v.z = Max(v.z * Float4(1.0f / 0x1FF), Float4(-1.0f));
-					v.w = Max(v.w, Float4(-1.0f));
-				}
-			}
-			else  // Stream: UInt, Shader attrib: Int/UInt, no type conversion
-			{
-				v.x = As<Float4>((src << 22) >> 22);
-				v.y = As<Float4>((src << 12) >> 22);
-				v.z = As<Float4>((src << 02) >> 22);
-				v.w = As<Float4>(src >> 30);
-			}
+			v.x = As<Float4>((src << 22) >> 22);
+			v.y = As<Float4>((src << 12) >> 22);
+			v.z = As<Float4>((src << 02) >> 22);
+			v.w = As<Float4>(src >> 30);
 		}
 		break;
 		case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
+			bgra = true;
+			// [[fallthrough]]
+		case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
+		{
+			Int4 src;
+			src = Insert(src, *Pointer<Int>(source0), 0);
+			src = Insert(src, *Pointer<Int>(source1), 1);
+			src = Insert(src, *Pointer<Int>(source2), 2);
+			src = Insert(src, *Pointer<Int>(source3), 3);
+
+			v.x = Float4(src & Int4(0x3FF));
+			v.y = Float4((src >> 10) & Int4(0x3FF));
+			v.z = Float4((src >> 20) & Int4(0x3FF));
+			v.w = Float4((src >> 30) & Int4(0x3));
+
+			v.x *= Float4(1.0f / 0x3FF);
+			v.y *= Float4(1.0f / 0x3FF);
+			v.z *= Float4(1.0f / 0x3FF);
+			v.w *= Float4(1.0f / 0x3);
+		}
+		break;
 		case VK_FORMAT_A2R10G10B10_UINT_PACK32:
 			bgra = true;
-		case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
+			// [[fallthrough]]
 		case VK_FORMAT_A2B10G10R10_UINT_PACK32:
 		{
 			Int4 src;
@@ -550,28 +484,10 @@
 			src = Insert(src, *Pointer<Int>(source2), 2);
 			src = Insert(src, *Pointer<Int>(source3), 3);
 
-			if(isNativeFloatAttrib)  // Stream: Int, Shader attrib: Float
-			{
-				v.x = Float4(src & Int4(0x3FF));
-				v.y = Float4((src >> 10) & Int4(0x3FF));
-				v.z = Float4((src >> 20) & Int4(0x3FF));
-				v.w = Float4((src >> 30) & Int4(0x3));
-
-				if(normalized)
-				{
-					v.x *= Float4(1.0f / 0x3FF);
-					v.y *= Float4(1.0f / 0x3FF);
-					v.z *= Float4(1.0f / 0x3FF);
-					v.w *= Float4(1.0f / 0x3);
-				}
-			}
-			else  // Stream: UInt, Shader attrib: Int/UInt, no type conversion
-			{
-				v.x = As<Float4>(src & Int4(0x3FF));
-				v.y = As<Float4>((src >> 10) & Int4(0x3FF));
-				v.z = As<Float4>((src >> 20) & Int4(0x3FF));
-				v.w = As<Float4>((src >> 30) & Int4(0x3));
-			}
+			v.x = As<Float4>(src & Int4(0x3FF));
+			v.y = As<Float4>((src >> 10) & Int4(0x3FF));
+			v.z = As<Float4>((src >> 20) & Int4(0x3FF));
+			v.w = As<Float4>((src >> 30) & Int4(0x3));
 		}
 		break;
 		default: