handle changed VCount+threaded rasteriser more gracefully

This commit is contained in:
RSDuck 2021-08-04 14:21:45 +02:00
parent f86ba0fcb3
commit f792d3e6a1
3 changed files with 39 additions and 17 deletions

View File

@ -1061,6 +1061,12 @@ void FinishFrame(u32 lines)
AssignFramebuffers(); AssignFramebuffers();
TotalScanlines = lines; TotalScanlines = lines;
if (GPU3D::AbortFrame)
{
GPU3D::RestartFrame();
GPU3D::AbortFrame = false;
}
} }
void StartScanline(u32 line) void StartScanline(u32 line)
@ -1180,6 +1186,7 @@ void SetVCount(u16 val)
// 3D engine seems to give up on the current frame in that situation, repeating the last two scanlines // 3D engine seems to give up on the current frame in that situation, repeating the last two scanlines
// TODO: also check the various DMA types that can be involved // TODO: also check the various DMA types that can be involved
GPU3D::AbortFrame |= NextVCount != val;
NextVCount = val; NextVCount = val;
} }

View File

@ -275,6 +275,8 @@ u32 FlushAttributes;
std::unique_ptr<GPU3D::Renderer3D> CurrentRenderer = {}; std::unique_ptr<GPU3D::Renderer3D> CurrentRenderer = {};
bool AbortFrame;
bool Init() bool Init()
{ {
return true; return true;
@ -380,6 +382,8 @@ void Reset()
ResetRenderingState(); ResetRenderingState();
RenderXPos = 0; RenderXPos = 0;
AbortFrame = false;
} }
void DoSavestate(Savestate* file) void DoSavestate(Savestate* file)
@ -621,6 +625,8 @@ void DoSavestate(Savestate* file)
file->Bool32(&UseShininessTable); file->Bool32(&UseShininessTable);
file->VarArray(ShininessTable, 128*sizeof(u8)); file->VarArray(ShininessTable, 128*sizeof(u8));
file->Bool32(&AbortFrame);
} }
@ -2611,27 +2617,34 @@ u32 ScrolledLine[256];
u32* GetLine(int line) u32* GetLine(int line)
{ {
u32* rawline = CurrentRenderer->GetLine(line); if (!AbortFrame)
if (RenderXPos == 0) return rawline;
// apply X scroll
if (RenderXPos & 0x100)
{ {
int i = 0, j = RenderXPos; u32* rawline = CurrentRenderer->GetLine(line);
for (; j < 512; i++, j++)
ScrolledLine[i] = 0; if (RenderXPos == 0) return rawline;
for (j = 0; i < 256; i++, j++)
ScrolledLine[i] = rawline[j]; // apply X scroll
if (RenderXPos & 0x100)
{
int i = 0, j = RenderXPos;
for (; j < 512; i++, j++)
ScrolledLine[i] = 0;
for (j = 0; i < 256; i++, j++)
ScrolledLine[i] = rawline[j];
}
else
{
int i = 0, j = RenderXPos;
for (; j < 256; i++, j++)
ScrolledLine[i] = rawline[j];
for (; i < 256; i++)
ScrolledLine[i] = 0;
}
} }
else else
{ {
int i = 0, j = RenderXPos; memset(ScrolledLine, 0, 256*4);
for (; j < 256; i++, j++)
ScrolledLine[i] = rawline[j];
for (; i < 256; i++)
ScrolledLine[i] = 0;
} }
return ScrolledLine; return ScrolledLine;

View File

@ -97,6 +97,8 @@ extern u16 RenderXPos;
extern std::array<Polygon*,2048> RenderPolygonRAM; extern std::array<Polygon*,2048> RenderPolygonRAM;
extern u32 RenderNumPolygons; extern u32 RenderNumPolygons;
extern bool AbortFrame;
extern u64 Timestamp; extern u64 Timestamp;
bool Init(); bool Init();