Eliminate the half-pixel NDC shift.

Bug 22123818

Change-Id: If9bf78d6b44ccd0662676c8896837cca8829efc8
Reviewed-on: https://swiftshader-review.googlesource.com/3624
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 246ec2f..e2bb617 100644
--- a/src/Renderer/Clipper.cpp
+++ b/src/Renderer/Clipper.cpp
@@ -166,8 +166,8 @@
 		{
 			int j = i == polygon.n - 1 ? 0 : i + 1;
 
-			float di = V[i]->w + (V[i]->x + data.halfPixelX[0] * V[i]->w);
-			float dj = V[j]->w + (V[j]->x + data.halfPixelX[0] * V[j]->w);
+			float di = V[i]->w + V[i]->x;
+			float dj = V[j]->w + V[j]->x;
 
 			if(di >= 0)
 			{
@@ -208,8 +208,8 @@
 		{
 			int j = i == polygon.n - 1 ? 0 : i + 1;
 
-			float di = V[i]->w - (V[i]->x + data.halfPixelX[0] * V[i]->w);
-			float dj = V[j]->w - (V[j]->x + data.halfPixelX[0] * V[j]->w);
+			float di = V[i]->w - V[i]->x;
+			float dj = V[j]->w - V[j]->x;
 
 			if(di >= 0)
 			{
@@ -250,8 +250,8 @@
 		{
 			int j = i == polygon.n - 1 ? 0 : i + 1;
 
-			float di = V[i]->w - (V[i]->y + data.halfPixelY[0] * V[i]->w);
-			float dj = V[j]->w - (V[j]->y + data.halfPixelY[0] * V[j]->w);
+			float di = V[i]->w - V[i]->y;
+			float dj = V[j]->w - V[j]->y;
 
 			if(di >= 0)
 			{
@@ -292,8 +292,8 @@
 		{
 			int j = i == polygon.n - 1 ? 0 : i + 1;
 
-			float di = V[i]->w + (V[i]->y + data.halfPixelY[0] * V[i]->w);
-			float dj = V[j]->w + (V[j]->y + data.halfPixelY[0] * V[j]->w);
+			float di = V[i]->w + V[i]->y;
+			float dj = V[j]->w + V[j]->y;
 
 			if(di >= 0)
 			{
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp
index d245b3a..f14e14a 100644
--- a/src/Renderer/Renderer.cpp
+++ b/src/Renderer/Renderer.cpp
@@ -540,8 +540,8 @@
 
 				data->Wx16 = replicate(W * 16);
 				data->Hx16 = replicate(H * 16);
-				data->X0x16 = replicate(X0 * 16);
-				data->Y0x16 = replicate(Y0 * 16);
+				data->X0x16 = replicate(X0 * 16 - 8);
+				data->Y0x16 = replicate(Y0 * 16 - 8);
 				data->XXXX = replicate(X[s][q] / W);
 				data->YYYY = replicate(Y[s][q] / H);
 				data->halfPixelX = replicate(0.5f / W);
@@ -1856,14 +1856,11 @@
 
 	unsigned int Renderer::computeClipFlags(const float4 &v, const DrawData &data)
 	{
-		float clX = v.x + data.halfPixelX[0] * v.w;
-		float clY = v.y + data.halfPixelY[0] * v.w;
-
-		return ((clX > v.w)  << 0) |
-			   ((clY > v.w)  << 1) |
+		return ((v.x > v.w)  << 0) |
+			   ((v.y > v.w)  << 1) |
 			   ((v.z > v.w)  << 2) |
-			   ((clX < -v.w) << 3) |
-		       ((clY < -v.w) << 4) |
+			   ((v.x < -v.w) << 3) |
+		       ((v.y < -v.w) << 4) |
 			   ((v.z < 0)    << 5) |
 			   Clipper::CLIP_FINITE;   // FIXME: xyz finite
 	}
diff --git a/src/Shader/VertexRoutine.cpp b/src/Shader/VertexRoutine.cpp
index ca8a4c2..c14b633 100644
--- a/src/Shader/VertexRoutine.cpp
+++ b/src/Shader/VertexRoutine.cpp
@@ -134,21 +134,12 @@
 			r.o[pos].y = r.o[pos].y + *Pointer<Float4>(r.data + OFFSET(DrawData,YYYY)) * r.o[pos].w;
 		}
 
-		Float4 clipX = r.o[pos].x;
-		Float4 clipY = r.o[pos].y;
-
-		if(state.multiSampling)   // Clip at pixel edges instead of pixel centers
-		{
-			clipX += *Pointer<Float4>(r.data + OFFSET(DrawData,halfPixelX)) * r.o[pos].w;
-			clipY += *Pointer<Float4>(r.data + OFFSET(DrawData,halfPixelY)) * r.o[pos].w;
-		}
-
-		Int4 maxX = CmpLT(r.o[pos].w, clipX);
-		Int4 maxY = CmpLT(r.o[pos].w, clipY);
+		Int4 maxX = CmpLT(r.o[pos].w, r.o[pos].x);
+		Int4 maxY = CmpLT(r.o[pos].w, r.o[pos].y);
 		Int4 maxZ = CmpLT(r.o[pos].w, r.o[pos].z);
 
-		Int4 minX = CmpNLE(-r.o[pos].w, clipX);
-		Int4 minY = CmpNLE(-r.o[pos].w, clipY);
+		Int4 minX = CmpNLE(-r.o[pos].w, r.o[pos].x);
+		Int4 minY = CmpNLE(-r.o[pos].w, r.o[pos].y);
 		Int4 minZ = CmpNLE(Float4(0.0f), r.o[pos].z);
 
 		Int flags;
@@ -491,10 +482,10 @@
 	{
 		int pos = state.positionRegister;
 
-		if(halfIntegerCoordinates)
+		if(!halfIntegerCoordinates)
 		{
-			r.o[pos].x = r.o[pos].x - *Pointer<Float4>(r.data + OFFSET(DrawData,halfPixelX)) * r.o[pos].w;
-			r.o[pos].y = r.o[pos].y - *Pointer<Float4>(r.data + OFFSET(DrawData,halfPixelY)) * r.o[pos].w;
+			r.o[pos].x = r.o[pos].x + *Pointer<Float4>(r.data + OFFSET(DrawData,halfPixelX)) * r.o[pos].w;
+			r.o[pos].y = r.o[pos].y + *Pointer<Float4>(r.data + OFFSET(DrawData,halfPixelY)) * r.o[pos].w;
 		}
 
 		if(symmetricNormalizedDepth)