gsdx sw: rcp introduce bad rounding on the grandient

Division is slower but more accurate. Fix rendering issue on Xenosaga (batte slot)/Jak3 (skin color)

Coauthor:pseudonym

Fix issue #1769
This commit is contained in:
Gregory Hainaut 2017-02-27 19:40:05 +01:00
parent ae8aa358e4
commit 438fbf31cf
1 changed files with 4 additions and 6 deletions

View File

@ -451,8 +451,6 @@ void GSRasterizer::DrawTriangle(const GSVertexSW* vertex, const uint32* index)
m2 &= 1; m2 &= 1;
cross = cross.rcpnr();
GSVector4 dxy01 = dv[0].p.xyxy(dv[1].p); GSVector4 dxy01 = dv[0].p.xyxy(dv[1].p);
GSVector4 dx = dxy01.xzxy(dv[2].p); GSVector4 dx = dxy01.xzxy(dv[2].p);
@ -464,7 +462,8 @@ void GSRasterizer::DrawTriangle(const GSVertexSW* vertex, const uint32* index)
ddx[1] = ddx[0].yxzw(); ddx[1] = ddx[0].yxzw();
ddx[2] = ddx[0].xzyw(); ddx[2] = ddx[0].xzyw();
GSVector8 _dxy01c(dxy01 * cross); // Precision is important here. Don't use reciprocal, it will break Jak3/Xenosaga1
GSVector8 _dxy01c(dxy01 / cross);
/* /*
dscan = dv[1] * dxy01c.yyyy() - dv[0] * dxy01c.wwww(); dscan = dv[1] * dxy01c.yyyy() - dv[0] * dxy01c.wwww();
@ -639,8 +638,6 @@ void GSRasterizer::DrawTriangle(const GSVertexSW* vertex, const uint32* index)
m2 &= 1; m2 &= 1;
cross = cross.rcpnr();
GSVector4 dxy01 = dv[0].p.xyxy(dv[1].p); GSVector4 dxy01 = dv[0].p.xyxy(dv[1].p);
GSVector4 dx = dxy01.xzxy(dv[2].p); GSVector4 dx = dxy01.xzxy(dv[2].p);
@ -652,7 +649,8 @@ void GSRasterizer::DrawTriangle(const GSVertexSW* vertex, const uint32* index)
ddx[1] = ddx[0].yxzw(); ddx[1] = ddx[0].yxzw();
ddx[2] = ddx[0].xzyw(); ddx[2] = ddx[0].xzyw();
GSVector4 dxy01c = dxy01 * cross; // Precision is important here. Don't use reciprocal, it will break Jak3/Xenosaga1
GSVector4 dxy01c = dxy01 / cross;
/* /*
dscan = dv[1] * dxy01c.yyyy() - dv[0] * dxy01c.wwww(); dscan = dv[1] * dxy01c.yyyy() - dv[0] * dxy01c.wwww();