misc improvements

This commit is contained in:
Jaklyy 2023-12-14 23:00:12 -05:00
parent a46316d71f
commit 2217a34d39
2 changed files with 29 additions and 20 deletions

View File

@ -341,15 +341,20 @@ public:
// GPU 3D rasterization timings, for emulating the timeout // GPU 3D rasterization timings, for emulating the timeout
static constexpr int ScanlinePairLength = 2130 * TimingFrac; static constexpr int ScanlinePairLength = 2130 * TimingFrac;
static constexpr int ScanlineTimeout = 1686 * TimingFrac; // 2126? 1686? //static constexpr int ScanlineTimeout = 1686 * TimingFrac; // 2126? 1686?
static constexpr int ScanlineBreak = 4 * TimingFrac; //static constexpr int ScanlineBreak = 4 * TimingFrac;
static constexpr int ScanlineBreak2 = 40 * TimingFrac; //static constexpr int ScanlineBreak2 = 40 * TimingFrac;
static constexpr int IncrementStrange = 1618 * TimingFrac; // 1882? 1442? 1618?? static constexpr int ScanlineIncrement = 1618 * TimingFrac; // how much to increment per scanline pair
static constexpr int FreeTiming = 440 * TimingFrac; static constexpr int AbortIncrement = 12 * TimingFrac; // how much extra to increment after an aborted scanline (total 1630)
static constexpr int FreeTiming = 496 * TimingFrac; // every scanline has a free 496 pixels worth of timing for some reason.
static constexpr int InitialTiming = 48688 * TimingFrac; // add 1618*2 to get the timeout of the second scanline pair
static constexpr int Post50Max = 51116 * TimingFrac; // for some reason it doesn't care about how full it actually is, it just cares about if its the first 50 scanlines to speedrun rendering?
// GPU 3D rasterization timings II, for counting each element with timing characteristics // GPU 3D rasterization timings II, for counting each element with timing characteristics
static constexpr int PerPolyTiming = 12 * TimingFrac; // should be correct for *most* line polygons and polygons with vertical slopes static constexpr int FirstPolyScanline = 0 * TimingFrac;
static constexpr int PerPixelTiming = 1 * TimingFrac; // does not apply to the first 4 pixels in a polygon (per scanline?) static constexpr int PerPolyScanline = 12 * TimingFrac; // should be correct for *most* line polygons and polygons with vertical slopes
static constexpr int PerPixelTiming = 1 * TimingFrac; // 1 pixel = 1 pixel
static constexpr int NumFreePixels = 4; // First 4 pixels in a polygon scanline are free (for some reason)
// static constexpr int RasterTimingCap = 51116 * TimingFrac; // static constexpr int RasterTimingCap = 51116 * TimingFrac;
static constexpr int PerScanlineTiming = 1064 * TimingFrac; // approximate currently, used to calc RDLines. TEMPORARY UNTIL ACCURATE "FRAMEBUFFER" CAN BE IMPLEMENTED static constexpr int PerScanlineTiming = 1064 * TimingFrac; // approximate currently, used to calc RDLines. TEMPORARY UNTIL ACCURATE "FRAMEBUFFER" CAN BE IMPLEMENTED

View File

@ -993,7 +993,7 @@ bool SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y, bool odd)
CheckSlope(rp, y); CheckSlope(rp, y);
if (DoTimings(PerPolyTiming, odd)) if (DoTimings(PerPolyScanline, odd))
{ {
Step(rp); Step(rp);
return true; return true;
@ -1439,18 +1439,19 @@ bool SoftRenderer::RenderScanline(s32 y, int npolys, bool odd)
RendererPolygon* rp = &PolygonList[i]; RendererPolygon* rp = &PolygonList[i];
Polygon* polygon = rp->PolyData; Polygon* polygon = rp->PolyData;
if (abort) if (y == polygon->YBottom && y != polygon->YTop)
{
CheckSlope(rp, y);
Step(rp);
}
else if (y == polygon->YBottom && y != polygon->YTop)
{ {
if (DoTimings(EmptyPolyScanline, odd)) abort = true; if (DoTimings(EmptyPolyScanline, odd)) abort = true;
} }
else if (y >= polygon->YTop && (y < polygon->YBottom || (y == polygon->YTop && polygon->YBottom == polygon->YTop))) else if (y >= polygon->YTop && (y < polygon->YBottom || (y == polygon->YTop && polygon->YBottom == polygon->YTop)))
{ {
if (polygon->IsShadowMask) if (y == polygon->YTop) if(DoTimings(FirstPolyScanline, odd)) abort = true;
if (abort)
{
CheckSlope(rp, y);
Step(rp);
}
else if (polygon->IsShadowMask)
;//RenderShadowMaskScanline(rp, y); ;//RenderShadowMaskScanline(rp, y);
else else
if (RenderPolygonScanline(rp, y, odd)) abort = true; if (RenderPolygonScanline(rp, y, odd)) abort = true;
@ -1768,17 +1769,18 @@ void SoftRenderer::RenderPolygons(bool threaded, Polygon** polygons, int npolys)
RasterTimingOdd = 0; RasterTimingOdd = 0;
RasterTimingEven = 0; RasterTimingEven = 0;
if (buffersize > 48) RasterTiming += ScanlineIncrement;
if (abort) RasterTiming += AbortIncrement; // if previous scanline was aborted, allow an extra 12 pixels worth of timing
if (y >= 50)
{ {
RasterTiming = ScanlinePairLength * 23; if (RasterTiming > Post50Max) RasterTiming = Post50Max;
timingadvance = 0; timingadvance = 0;
buffersize = 48; buffersize = 48;
} }
if (!abort) RasterTiming += IncrementStrange;
else RasterTiming += ScanlineTimeout;
abort = RenderScanline(y, j, true); abort = RenderScanline(y, j, true);
abort = RenderScanline(y+1, j, false); abort |= RenderScanline(y+1, j, false);
buffersize += 2; buffersize += 2;
//RasterTiming += ScanlineBreak; //RasterTiming += ScanlineBreak;
@ -1795,6 +1797,8 @@ void SoftRenderer::RenderPolygons(bool threaded, Polygon** polygons, int npolys)
timespent -= FreeTiming; timespent -= FreeTiming;
}*/ }*/
//if (!abort) //if (!abort)
//if (buffersize > 48) timespent -= PerScanlineRecup;
/*else*/
timespent -= FreeTiming; timespent -= FreeTiming;
if (timespent > 0) if (timespent > 0)