Move interpolant clamping out of interpolate()

Vulkan never clamps interpolants, except for depth values (specifically
for fixed-point formats, and for floating-point formats when the
unrestricted depth extension is not enabled).

This change moves the clamping operation out of interpolate(), which
makes it easier to see depth clamping being performed when necessary,
and will facilitate changes in applying depth bias.

Bug: b/139341727
Change-Id: I8cef29d63fef00308ef2f813b4feb687c83baa86
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/49148
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Sean Risser <srisser@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Device/QuadRasterizer.cpp b/src/Device/QuadRasterizer.cpp
index 389b81a..62f2253 100644
--- a/src/Device/QuadRasterizer.cpp
+++ b/src/Device/QuadRasterizer.cpp
@@ -231,7 +231,7 @@
 	Until(y >= yMax);
 }
 
-Float4 QuadRasterizer::interpolate(Float4 &x, Float4 &D, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective, bool clamp)
+Float4 QuadRasterizer::interpolate(Float4 &x, Float4 &D, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective)
 {
 	Float4 interpolant = D;
 
@@ -245,11 +245,6 @@
 		}
 	}
 
-	if(clamp)
-	{
-		interpolant = Min(Max(interpolant, Float4(0.0f)), Float4(1.0f));
-	}
-
 	return interpolant;
 }
 
diff --git a/src/Device/QuadRasterizer.hpp b/src/Device/QuadRasterizer.hpp
index f24e80e..2f19d1d 100644
--- a/src/Device/QuadRasterizer.hpp
+++ b/src/Device/QuadRasterizer.hpp
@@ -46,7 +46,7 @@
 
 	bool interpolateZ() const;
 	bool interpolateW() const;
-	Float4 interpolate(Float4 &x, Float4 &D, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective, bool clamp);
+	Float4 interpolate(Float4 &x, Float4 &D, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective);
 
 	const PixelProcessor::State &state;
 	const SpirvShader *const spirvShader;
diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp
index 7d9f349..dc27e90 100644
--- a/src/Pipeline/PixelRoutine.cpp
+++ b/src/Pipeline/PixelRoutine.cpp
@@ -90,7 +90,12 @@
 				x -= *Pointer<Float4>(constants + OFFSET(Constants, X) + q * sizeof(float4));
 			}
 
-			z[q] = interpolate(x, Dz[q], z[q], primitive + OFFSET(Primitive, z), false, false, state.depthClamp);
+			z[q] = interpolate(x, Dz[q], z[q], primitive + OFFSET(Primitive, z), false, false);
+
+			if(state.depthClamp)
+			{
+				z[q] = Min(Max(z[q], Float4(0.0f)), Float4(1.0f));
+			}
 		}
 	}
 
@@ -133,7 +138,7 @@
 
 		if(interpolateW())
 		{
-			w = interpolate(xxxx, Dw, rhw, primitive + OFFSET(Primitive, w), false, false, false);
+			w = interpolate(xxxx, Dw, rhw, primitive + OFFSET(Primitive, w), false, false);
 			rhw = reciprocal(w, false, false, true);
 
 			if(state.centroid)
@@ -161,7 +166,7 @@
 						routine.inputs[interpolant] =
 						    interpolate(xxxx, Dv[interpolant], rhw,
 						                primitive + OFFSET(Primitive, V[interpolant]),
-						                input.Flat, !input.NoPerspective, false);
+						                input.Flat, !input.NoPerspective);
 					}
 				}
 			}
@@ -172,7 +177,7 @@
 			{
 				auto distance = interpolate(xxxx, DclipDistance[i], rhw,
 				                            primitive + OFFSET(Primitive, clipDistance[i]),
-				                            false, true, false);
+				                            false, true);
 
 				auto clipMask = SignMask(CmpGE(distance, SIMD::Float(0)));
 				for(auto ms = 0u; ms < state.multiSampleCount; ms++)
@@ -208,7 +213,7 @@
 							routine.getVariable(it->second.Id)[it->second.FirstComponent + i] =
 							    interpolate(xxxx, DcullDistance[i], rhw,
 							                primitive + OFFSET(Primitive, cullDistance[i]),
-							                false, true, false);
+							                false, true);
 						}
 					}
 				}