Support frustum clipping against z = -1.

This allows performing the depth range adjustment only once as part of the
viewport transform and not have it be affected by transform feedback.

Change-Id: I89fba3b131c234bea064b1b65f50b62261f4c307
Reviewed-on: https://swiftshader-review.googlesource.com/5421
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/Renderer/Clipper.cpp b/src/Renderer/Clipper.cpp
index 3256d68..1c17402 100644
--- a/src/Renderer/Clipper.cpp
+++ b/src/Renderer/Clipper.cpp
@@ -20,8 +20,9 @@
 
 namespace sw
 {
-	Clipper::Clipper()
+	Clipper::Clipper(bool symmetricNormalizedDepth)
 	{
+		n = symmetricNormalizedDepth ? -1.0f : 0.0f;
 	}
 
 	Clipper::~Clipper()
@@ -30,12 +31,12 @@
 
 	unsigned int Clipper::computeClipFlags(const float4 &v)
 	{
-		return ((v.x > v.w)  ? CLIP_RIGHT  : 0) |
-		       ((v.y > v.w)  ? CLIP_TOP    : 0) |
-		       ((v.z > v.w)  ? CLIP_FAR    : 0) |
-		       ((v.x < -v.w) ? CLIP_LEFT   : 0) |
-		       ((v.y < -v.w) ? CLIP_BOTTOM : 0) |
-		       ((v.z < 0)    ? CLIP_NEAR   : 0) |
+		return ((v.x > v.w)     ? CLIP_RIGHT  : 0) |
+		       ((v.y > v.w)     ? CLIP_TOP    : 0) |
+		       ((v.z > v.w)     ? CLIP_FAR    : 0) |
+		       ((v.x < -v.w)    ? CLIP_LEFT   : 0) |
+		       ((v.y < -v.w)    ? CLIP_BOTTOM : 0) |
+		       ((v.z < n * v.w) ? CLIP_NEAR   : 0) |
 		       Clipper::CLIP_FINITE;   // FIXME: xyz finite
 	}
 
@@ -90,8 +91,8 @@
 		{
 			int j = i == polygon.n - 1 ? 0 : i + 1;
 
-			float di = V[i]->z;
-			float dj = V[j]->z;
+			float di = V[i]->z - n * V[i]->w;
+			float dj = V[j]->z - n * V[j]->w;
 
 			if(di >= 0)
 			{
@@ -100,7 +101,7 @@
 				if(dj < 0)
 				{
 					clipEdge(polygon.B[polygon.b], *V[i], *V[j], di, dj);
-					polygon.B[polygon.b].z = 0;
+					polygon.B[polygon.b].z = n * polygon.B[polygon.b].w;
 					T[t++] = &polygon.B[polygon.b++];
 				}
 			}
@@ -109,7 +110,7 @@
 				if(dj > 0)
 				{
 					clipEdge(polygon.B[polygon.b], *V[j], *V[i], dj, di);
-					polygon.B[polygon.b].z = 0;
+					polygon.B[polygon.b].z = n * polygon.B[polygon.b].w;
 					T[t++] = &polygon.B[polygon.b++];
 				}
 			}