Refactor sampler LOD calculation method into an enum.

Change-Id: I0beed96cd68608ce07aec0b11f14d6f61e67e53d
Reviewed-on: https://swiftshader-review.googlesource.com/5034
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
index dc829ef..e0ecd73 100644
--- a/src/Shader/VertexProgram.cpp
+++ b/src/Shader/VertexProgram.cpp
@@ -136,11 +136,11 @@
 			Vector4f s3;
 			Vector4f s4;
 
-			if(src0.type != Shader::PARAMETER_VOID) s0 = fetchRegisterF(src0);
-			if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterF(src1);
-			if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterF(src2);
-			if(src3.type != Shader::PARAMETER_VOID) s3 = fetchRegisterF(src3);
-			if(src4.type != Shader::PARAMETER_VOID) s4 = fetchRegisterF(src4);
+			if(src0.type != Shader::PARAMETER_VOID) s0 = fetchRegister(src0);
+			if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegister(src1);
+			if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegister(src2);
+			if(src3.type != Shader::PARAMETER_VOID) s3 = fetchRegister(src3);
+			if(src4.type != Shader::PARAMETER_VOID) s4 = fetchRegister(src4);
 
 			switch(opcode)
 			{
@@ -647,7 +647,7 @@
 		}
 	}
 
-	Vector4f VertexProgram::fetchRegisterF(const Src &src, unsigned int offset)
+	Vector4f VertexProgram::fetchRegister(const Src &src, unsigned int offset)
 	{
 		Vector4f reg;
 		unsigned int i = src.index + offset;
@@ -830,7 +830,7 @@
 			if(src.rel.deterministic)
 			{
 				Int a = relativeAddress(src, src.bufferIndex);
-			
+
 				c.x = c.y = c.z = c.w = *Pointer<Float4>(uniformAddress(src.bufferIndex, i, a));
 
 				c.x = c.x.xxxx;
@@ -930,8 +930,8 @@
 
 	void VertexProgram::M3X2(Vector4f &dst, Vector4f &src0, Src &src1)
 	{
-		Vector4f row0 = fetchRegisterF(src1, 0);
-		Vector4f row1 = fetchRegisterF(src1, 1);
+		Vector4f row0 = fetchRegister(src1, 0);
+		Vector4f row1 = fetchRegister(src1, 1);
 
 		dst.x = dot3(src0, row0);
 		dst.y = dot3(src0, row1);
@@ -939,9 +939,9 @@
 
 	void VertexProgram::M3X3(Vector4f &dst, Vector4f &src0, Src &src1)
 	{
-		Vector4f row0 = fetchRegisterF(src1, 0);
-		Vector4f row1 = fetchRegisterF(src1, 1);
-		Vector4f row2 = fetchRegisterF(src1, 2);
+		Vector4f row0 = fetchRegister(src1, 0);
+		Vector4f row1 = fetchRegister(src1, 1);
+		Vector4f row2 = fetchRegister(src1, 2);
 
 		dst.x = dot3(src0, row0);
 		dst.y = dot3(src0, row1);
@@ -950,10 +950,10 @@
 
 	void VertexProgram::M3X4(Vector4f &dst, Vector4f &src0, Src &src1)
 	{
-		Vector4f row0 = fetchRegisterF(src1, 0);
-		Vector4f row1 = fetchRegisterF(src1, 1);
-		Vector4f row2 = fetchRegisterF(src1, 2);
-		Vector4f row3 = fetchRegisterF(src1, 3);
+		Vector4f row0 = fetchRegister(src1, 0);
+		Vector4f row1 = fetchRegister(src1, 1);
+		Vector4f row2 = fetchRegister(src1, 2);
+		Vector4f row3 = fetchRegister(src1, 3);
 
 		dst.x = dot3(src0, row0);
 		dst.y = dot3(src0, row1);
@@ -963,9 +963,9 @@
 
 	void VertexProgram::M4X3(Vector4f &dst, Vector4f &src0, Src &src1)
 	{
-		Vector4f row0 = fetchRegisterF(src1, 0);
-		Vector4f row1 = fetchRegisterF(src1, 1);
-		Vector4f row2 = fetchRegisterF(src1, 2);
+		Vector4f row0 = fetchRegister(src1, 0);
+		Vector4f row1 = fetchRegister(src1, 1);
+		Vector4f row2 = fetchRegister(src1, 2);
 
 		dst.x = dot4(src0, row0);
 		dst.y = dot4(src0, row1);
@@ -974,10 +974,10 @@
 
 	void VertexProgram::M4X4(Vector4f &dst, Vector4f &src0, Src &src1)
 	{
-		Vector4f row0 = fetchRegisterF(src1, 0);
-		Vector4f row1 = fetchRegisterF(src1, 1);
-		Vector4f row2 = fetchRegisterF(src1, 2);
-		Vector4f row3 = fetchRegisterF(src1, 3);
+		Vector4f row0 = fetchRegister(src1, 0);
+		Vector4f row1 = fetchRegister(src1, 1);
+		Vector4f row2 = fetchRegister(src1, 2);
+		Vector4f row3 = fetchRegister(src1, 3);
 
 		dst.x = dot4(src0, row0);
 		dst.y = dot4(src0, row1);
@@ -1259,7 +1259,7 @@
 		}
 		else
 		{
-			Int4 condition = As<Int4>(fetchRegisterF(src).x);
+			Int4 condition = As<Int4>(fetchRegister(src).x);
 			IF(condition);
 		}
 	}
@@ -1429,7 +1429,7 @@
 		Nucleus::setInsertBlock(testBlock);
 		enableContinue = restoreContinue;
 
-		const Vector4f &src = fetchRegisterF(temporaryRegister);
+		const Vector4f &src = fetchRegister(temporaryRegister);
 		Int4 condition = As<Int4>(src.x);
 		condition &= enableStack[enableIndex - 1];
 		enableStack[enableIndex] = condition;
@@ -1494,25 +1494,13 @@
 
 	void VertexProgram::TEXLDL(Vector4f &dst, Vector4f &src0, const Src &src1)
 	{
-		Vector4f tmp;
-		sampleTexture(tmp, src1, src0.x, src0.y, src0.z, src0.w);
-
-		dst.x = tmp[(src1.swizzle >> 0) & 0x3];
-		dst.y = tmp[(src1.swizzle >> 2) & 0x3];
-		dst.z = tmp[(src1.swizzle >> 4) & 0x3];
-		dst.w = tmp[(src1.swizzle >> 6) & 0x3];
+		sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, Lod);
 	}
 
 	void VertexProgram::TEX(Vector4f &dst, Vector4f &src0, const Src &src1)
 	{
-		Float4 lod = Float4(0.0f);
-		Vector4f tmp;
-		sampleTexture(tmp, src1, src0.x, src0.y, src0.z, lod);
-
-		dst.x = tmp[(src1.swizzle >> 0) & 0x3];
-		dst.y = tmp[(src1.swizzle >> 2) & 0x3];
-		dst.z = tmp[(src1.swizzle >> 4) & 0x3];
-		dst.w = tmp[(src1.swizzle >> 6) & 0x3];
+		Float4 lod0 = Float4(0.0f);
+		sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod0, Lod);
 	}
 
 	void VertexProgram::TEXOFFSET(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3)
@@ -1557,29 +1545,36 @@
 		}
 	}
 
-	void VertexProgram::sampleTexture(Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q)
+	void VertexProgram::sampleTexture(Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q, SamplerMethod method)
 	{
+		Vector4f tmp;
+
 		if(s.type == Shader::PARAMETER_SAMPLER && s.rel.type == Shader::PARAMETER_VOID)
 		{
-			Pointer<Byte> texture = data + OFFSET(DrawData,mipmap[16]) + s.index * sizeof(Texture);
-			sampler[s.index]->sampleTexture(texture, c, u, v, w, q, a0, a0, false, false, true);
+			Pointer<Byte> texture = data + OFFSET(DrawData,mipmap[TEXTURE_IMAGE_UNITS]) + s.index * sizeof(Texture);
+			sampler[s.index]->sampleTexture(texture, tmp, u, v, w, q, a0, a0, method);
 		}
 		else
 		{
-			Int index = As<Int>(Float(fetchRegisterF(s).x.x));
+			Int index = As<Int>(Float(fetchRegister(s).x.x));
 
-			for(int i = 0; i < 16; i++)
+			for(int i = 0; i < VERTEX_TEXTURE_IMAGE_UNITS; i++)
 			{
 				if(shader->usesSampler(i))
 				{
 					If(index == i)
 					{
-						Pointer<Byte> texture = data + OFFSET(DrawData,mipmap[16]) + i * sizeof(Texture);
-						sampler[i]->sampleTexture(texture, c, u, v, w, q, a0, a0, false, false, true);
+						Pointer<Byte> texture = data + OFFSET(DrawData,mipmap[TEXTURE_IMAGE_UNITS]) + i * sizeof(Texture);
+						sampler[i]->sampleTexture(texture, tmp, u, v, w, q, a0, a0, method);
 						// FIXME: When the sampler states are the same, we could use one sampler and just index the texture
 					}
 				}
 			}
 		}
+
+		c.x = tmp[(s.swizzle >> 0) & 0x3];
+		c.y = tmp[(s.swizzle >> 2) & 0x3];
+		c.z = tmp[(s.swizzle >> 4) & 0x3];
+		c.w = tmp[(s.swizzle >> 6) & 0x3];
 	}
 }