Commit 5491cb48 by Nicolas Capens

Eliminate the half-pixel NDC shift.

Bug 22123818 Change-Id: If9bf78d6b44ccd0662676c8896837cca8829efc8 Reviewed-on: https://swiftshader-review.googlesource.com/3624Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 83d0e98e
...@@ -166,8 +166,8 @@ namespace sw ...@@ -166,8 +166,8 @@ namespace sw
{ {
int j = i == polygon.n - 1 ? 0 : i + 1; int j = i == polygon.n - 1 ? 0 : i + 1;
float di = V[i]->w + (V[i]->x + data.halfPixelX[0] * V[i]->w); float di = V[i]->w + V[i]->x;
float dj = V[j]->w + (V[j]->x + data.halfPixelX[0] * V[j]->w); float dj = V[j]->w + V[j]->x;
if(di >= 0) if(di >= 0)
{ {
...@@ -208,8 +208,8 @@ namespace sw ...@@ -208,8 +208,8 @@ namespace sw
{ {
int j = i == polygon.n - 1 ? 0 : i + 1; int j = i == polygon.n - 1 ? 0 : i + 1;
float di = V[i]->w - (V[i]->x + data.halfPixelX[0] * V[i]->w); float di = V[i]->w - V[i]->x;
float dj = V[j]->w - (V[j]->x + data.halfPixelX[0] * V[j]->w); float dj = V[j]->w - V[j]->x;
if(di >= 0) if(di >= 0)
{ {
...@@ -250,8 +250,8 @@ namespace sw ...@@ -250,8 +250,8 @@ namespace sw
{ {
int j = i == polygon.n - 1 ? 0 : i + 1; int j = i == polygon.n - 1 ? 0 : i + 1;
float di = V[i]->w - (V[i]->y + data.halfPixelY[0] * V[i]->w); float di = V[i]->w - V[i]->y;
float dj = V[j]->w - (V[j]->y + data.halfPixelY[0] * V[j]->w); float dj = V[j]->w - V[j]->y;
if(di >= 0) if(di >= 0)
{ {
...@@ -292,8 +292,8 @@ namespace sw ...@@ -292,8 +292,8 @@ namespace sw
{ {
int j = i == polygon.n - 1 ? 0 : i + 1; int j = i == polygon.n - 1 ? 0 : i + 1;
float di = V[i]->w + (V[i]->y + data.halfPixelY[0] * V[i]->w); float di = V[i]->w + V[i]->y;
float dj = V[j]->w + (V[j]->y + data.halfPixelY[0] * V[j]->w); float dj = V[j]->w + V[j]->y;
if(di >= 0) if(di >= 0)
{ {
......
...@@ -540,8 +540,8 @@ namespace sw ...@@ -540,8 +540,8 @@ namespace sw
data->Wx16 = replicate(W * 16); data->Wx16 = replicate(W * 16);
data->Hx16 = replicate(H * 16); data->Hx16 = replicate(H * 16);
data->X0x16 = replicate(X0 * 16); data->X0x16 = replicate(X0 * 16 - 8);
data->Y0x16 = replicate(Y0 * 16); data->Y0x16 = replicate(Y0 * 16 - 8);
data->XXXX = replicate(X[s][q] / W); data->XXXX = replicate(X[s][q] / W);
data->YYYY = replicate(Y[s][q] / H); data->YYYY = replicate(Y[s][q] / H);
data->halfPixelX = replicate(0.5f / W); data->halfPixelX = replicate(0.5f / W);
...@@ -1856,14 +1856,11 @@ namespace sw ...@@ -1856,14 +1856,11 @@ namespace sw
unsigned int Renderer::computeClipFlags(const float4 &v, const DrawData &data) unsigned int Renderer::computeClipFlags(const float4 &v, const DrawData &data)
{ {
float clX = v.x + data.halfPixelX[0] * v.w; return ((v.x > v.w) << 0) |
float clY = v.y + data.halfPixelY[0] * v.w; ((v.y > v.w) << 1) |
return ((clX > v.w) << 0) |
((clY > v.w) << 1) |
((v.z > v.w) << 2) | ((v.z > v.w) << 2) |
((clX < -v.w) << 3) | ((v.x < -v.w) << 3) |
((clY < -v.w) << 4) | ((v.y < -v.w) << 4) |
((v.z < 0) << 5) | ((v.z < 0) << 5) |
Clipper::CLIP_FINITE; // FIXME: xyz finite Clipper::CLIP_FINITE; // FIXME: xyz finite
} }
......
...@@ -134,21 +134,12 @@ namespace sw ...@@ -134,21 +134,12 @@ namespace sw
r.o[pos].y = r.o[pos].y + *Pointer<Float4>(r.data + OFFSET(DrawData,YYYY)) * r.o[pos].w; 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; Int4 maxX = CmpLT(r.o[pos].w, r.o[pos].x);
Float4 clipY = r.o[pos].y; Int4 maxY = CmpLT(r.o[pos].w, 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 maxZ = CmpLT(r.o[pos].w, r.o[pos].z); Int4 maxZ = CmpLT(r.o[pos].w, r.o[pos].z);
Int4 minX = CmpNLE(-r.o[pos].w, clipX); Int4 minX = CmpNLE(-r.o[pos].w, r.o[pos].x);
Int4 minY = CmpNLE(-r.o[pos].w, clipY); Int4 minY = CmpNLE(-r.o[pos].w, r.o[pos].y);
Int4 minZ = CmpNLE(Float4(0.0f), r.o[pos].z); Int4 minZ = CmpNLE(Float4(0.0f), r.o[pos].z);
Int flags; Int flags;
...@@ -491,10 +482,10 @@ namespace sw ...@@ -491,10 +482,10 @@ namespace sw
{ {
int pos = state.positionRegister; 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].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].y = r.o[pos].y + *Pointer<Float4>(r.data + OFFSET(DrawData,halfPixelY)) * r.o[pos].w;
} }
if(symmetricNormalizedDepth) if(symmetricNormalizedDepth)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment