* fix range for 'equal' Z-test mode
* confirm clear Z value for screen outer borders * misc code cleanup
This commit is contained in:
parent
77d0a0d76e
commit
d81b68b16b
|
@ -248,6 +248,7 @@ public:
|
|||
this->xmax = this->xmin;
|
||||
}
|
||||
|
||||
// TODO: check the precision of the slope increment on hardware
|
||||
if (y0 == y1)
|
||||
Increment = 0;
|
||||
else
|
||||
|
@ -280,27 +281,44 @@ public:
|
|||
else dx = 0;
|
||||
}
|
||||
|
||||
s32 x = XVal();
|
||||
|
||||
if (XMajor)
|
||||
{
|
||||
if (side) Interp.Setup(x0-1, x1-1, w0, w1, 9); // checkme
|
||||
else Interp.Setup(x0, x1, w0, w1, 9);
|
||||
}
|
||||
else Interp.Setup(y0, y1, w0, w1, 9);
|
||||
Interp.SetX(x);
|
||||
|
||||
// used for calculating AA coverage
|
||||
//inv_incr = (1 << (16+10)) / Increment;
|
||||
}
|
||||
else
|
||||
{
|
||||
Interp.Setup(y0, y1, w0, w1, 9);
|
||||
Interp.SetX(y);
|
||||
|
||||
//ycov_incr = Increment >> 2;
|
||||
//ycoverage = ycov_incr >> 1;
|
||||
}
|
||||
|
||||
s32 x = XVal();
|
||||
if (XMajor) Interp.SetX(x);
|
||||
else Interp.SetX(y);
|
||||
return x;
|
||||
}
|
||||
s32 DX() { return dx; }
|
||||
|
||||
s32 Step()
|
||||
{
|
||||
dx += Increment;
|
||||
y++;
|
||||
|
||||
s32 x = XVal();
|
||||
if (XMajor) Interp.SetX(x);
|
||||
else Interp.SetX(y);
|
||||
if (XMajor)
|
||||
{
|
||||
Interp.SetX(x);
|
||||
}
|
||||
else
|
||||
{
|
||||
Interp.SetX(y);
|
||||
//ycoverage += ycov_incr;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
|
@ -323,22 +341,24 @@ s32 DX() { return dx; }
|
|||
*length = ((dx+Increment) >> 16) - (dx >> 16);
|
||||
|
||||
// for X-major edges, coverage will be calculated later
|
||||
*coverage = -1;
|
||||
// we just return the factor for it
|
||||
*coverage = 31;//inv_incr | (1<<31);
|
||||
}
|
||||
|
||||
void EdgeParams_YMajor(s32* length, s32* coverage)
|
||||
{
|
||||
*length = 1;
|
||||
|
||||
if (Increment == 0)
|
||||
/*if (Increment == 0)
|
||||
{
|
||||
*coverage = 31;
|
||||
}
|
||||
else
|
||||
{
|
||||
*coverage = (dx & 0xF800) >> 11;
|
||||
*coverage = (ycoverage >> 9) & 0x1F;
|
||||
if (!(side ^ Negative)) *coverage = 0x1F - *coverage;
|
||||
}
|
||||
}*/
|
||||
*coverage = 31;
|
||||
}
|
||||
|
||||
void EdgeParams(s32* length, s32* coverage)
|
||||
|
@ -349,23 +369,6 @@ s32 DX() { return dx; }
|
|||
return EdgeParams_YMajor(length, coverage);
|
||||
}
|
||||
|
||||
/*s32 EdgeLimit()
|
||||
{
|
||||
s32 ret;
|
||||
if (side)
|
||||
{
|
||||
if (Negative) ret = x0 - ((dx+Increment) >> 16);
|
||||
else ret = x0 + ((dx-Increment) >> 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Negative) ret = x0 - ((dx-Increment) >> 16);
|
||||
else ret = x0 + ((dx+Increment) >> 16);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}*/
|
||||
|
||||
s32 Increment;
|
||||
bool Negative;
|
||||
bool XMajor;
|
||||
|
@ -375,6 +378,9 @@ private:
|
|||
s32 x0, xmin, xmax;
|
||||
s32 dx;
|
||||
s32 y;
|
||||
|
||||
s32 inv_incr;
|
||||
s32 ycoverage, ycov_incr;
|
||||
};
|
||||
|
||||
typedef struct
|
||||
|
@ -624,7 +630,7 @@ bool DepthTest(s32 oldz, s32 z)
|
|||
if (func_equal)
|
||||
{
|
||||
s32 diff = oldz - z;
|
||||
if ((u32)(diff + 0x200) <= 0x400)
|
||||
if ((u32)(diff + 0xFF) <= 0x1FE) // range is +-0xFF
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
@ -834,10 +840,7 @@ void SetupPolygon(RendererPolygon* rp, Polygon* polygon)
|
|||
|
||||
if (ybot == ytop)
|
||||
{
|
||||
//ybot++;
|
||||
|
||||
vtop = 0; vbot = 0;
|
||||
//xtop = 256; xbot = 0;
|
||||
int i;
|
||||
|
||||
i = 1;
|
||||
|
@ -897,8 +900,6 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
|
|||
bool l_filledge, r_filledge;
|
||||
s32 l_edgelen, r_edgelen;
|
||||
s32 l_edgecov, r_edgecov;
|
||||
//Slope* slope_start;
|
||||
//Slope* slope_end;
|
||||
Interpolator* interp_start;
|
||||
Interpolator* interp_end;
|
||||
|
||||
|
@ -993,7 +994,7 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
|
|||
for (; x < xstart+l_edgelen; x++)
|
||||
{
|
||||
u32 pixeladdr = 258*3 + 1 + (y*258*3) + x;
|
||||
u32 attr = (polygon->Attr & 0x3F008000) | edge;
|
||||
u32 attr = (polygon->Attr & 0x3F008000);
|
||||
|
||||
// check stencil buffer for shadows
|
||||
if (polygon->IsShadow)
|
||||
|
@ -1055,6 +1056,8 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
|
|||
|
||||
if (alpha == 31)
|
||||
{
|
||||
attr |= edge;
|
||||
|
||||
if (RenderDispCnt & (1<<4))
|
||||
{
|
||||
// anti-aliasing: all edges are rendered
|
||||
|
@ -1076,6 +1079,8 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
|
|||
cov = r_edgecov;
|
||||
if (cov == -1) cov = ((xend - x) << 5) / r_edgelen;
|
||||
}cov=31;*/
|
||||
cov = l_edgecov;
|
||||
if (cov == -1) cov = 31;
|
||||
attr |= (cov << 8);
|
||||
|
||||
// push old pixel down if needed
|
||||
|
@ -1127,7 +1132,7 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
|
|||
else for (; x <= xend-r_edgelen; x++)
|
||||
{
|
||||
u32 pixeladdr = 258*3 + 1 + (y*258*3) + x;
|
||||
u32 attr = (polygon->Attr & 0x3F008000) | edge;
|
||||
u32 attr = (polygon->Attr & 0x3F008000);
|
||||
|
||||
// check stencil buffer for shadows
|
||||
if (polygon->IsShadow)
|
||||
|
@ -1179,6 +1184,7 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
|
|||
|
||||
if (alpha == 31)
|
||||
{
|
||||
attr |= edge;
|
||||
DepthBuffer[pixeladdr] = z;
|
||||
}
|
||||
else
|
||||
|
@ -1217,7 +1223,7 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
|
|||
for (; x <= xend; x++)
|
||||
{
|
||||
u32 pixeladdr = 258*3 + 1 + (y*258*3) + x;
|
||||
u32 attr = (polygon->Attr & 0x3F008000) | edge;
|
||||
u32 attr = (polygon->Attr & 0x3F008000);
|
||||
|
||||
// check stencil buffer for shadows
|
||||
if (polygon->IsShadow)
|
||||
|
@ -1279,6 +1285,8 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
|
|||
|
||||
if (alpha == 31)
|
||||
{
|
||||
attr |= edge;
|
||||
|
||||
if (RenderDispCnt & (1<<4))
|
||||
{
|
||||
// anti-aliasing: all edges are rendered
|
||||
|
@ -1300,6 +1308,8 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
|
|||
cov = r_edgecov;
|
||||
if (cov == -1) cov = ((xend - x) << 5) / r_edgelen;
|
||||
}cov=31;*/
|
||||
cov = r_edgecov;
|
||||
if (cov == -1) cov = 31;
|
||||
attr |= (cov << 8);
|
||||
|
||||
// push old pixel down if needed
|
||||
|
@ -1502,7 +1512,7 @@ void ScanlineFinalPass(s32 y)
|
|||
u32 botG = (botcolor >> 8) & 0x3F;
|
||||
u32 botB = (botcolor >> 16) & 0x3F;
|
||||
u32 botA = (botcolor >> 24) & 0x1F;
|
||||
if (y==48) printf("x=%d: cov=%d\n", x, coverage);
|
||||
//if (y==48) printf("x=%d: cov=%d\n", x, coverage);
|
||||
coverage++;
|
||||
|
||||
// only blend color if the bottom pixel isn't fully transparent
|
||||
|
@ -1528,8 +1538,6 @@ void ClearBuffers()
|
|||
u32 polyid = RenderClearAttr1 & 0x3F000000;
|
||||
|
||||
// fill screen borders for edge marking
|
||||
// CHECKME
|
||||
// GBAtek is unsure about the polygon ID, and nothing is said about Z
|
||||
|
||||
for (int x = 0; x < 258; x++)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue