make FIFO size static whene possible

This commit is contained in:
RSDuck
2020-12-30 23:37:46 +01:00
parent 162a0f4fb6
commit fa4363ede6
9 changed files with 409 additions and 367 deletions

View File

@ -147,10 +147,10 @@ typedef union
} CmdFIFOEntry;
FIFO<CmdFIFOEntry>* CmdFIFO;
FIFO<CmdFIFOEntry>* CmdPIPE;
FIFO<CmdFIFOEntry, 256> CmdFIFO;
FIFO<CmdFIFOEntry, 4> CmdPIPE;
FIFO<CmdFIFOEntry>* CmdStallQueue;
FIFO<CmdFIFOEntry, 64> CmdStallQueue;
u32 NumCommands, CurCommand, ParamCount, TotalParams;
@ -277,20 +277,11 @@ u32 FlushAttributes;
bool Init()
{
CmdFIFO = new FIFO<CmdFIFOEntry>(256);
CmdPIPE = new FIFO<CmdFIFOEntry>(4);
CmdStallQueue = new FIFO<CmdFIFOEntry>(64);
return true;
}
void DeInit()
{
delete CmdFIFO;
delete CmdPIPE;
delete CmdStallQueue;
}
void ResetRenderingState()
@ -314,10 +305,10 @@ void ResetRenderingState()
void Reset()
{
CmdFIFO->Clear();
CmdPIPE->Clear();
CmdFIFO.Clear();
CmdPIPE.Clear();
CmdStallQueue->Clear();
CmdStallQueue.Clear();
NumCommands = 0;
CurCommand = 0;
@ -395,8 +386,8 @@ void DoSavestate(Savestate* file)
{
file->Section("GP3D");
CmdFIFO->DoSavestate(file);
CmdPIPE->DoSavestate(file);
CmdFIFO.DoSavestate(file);
CmdPIPE.DoSavestate(file);
file->Var32(&NumCommands);
file->Var32(&CurCommand);
@ -593,7 +584,9 @@ void DoSavestate(Savestate* file)
}
}
CmdStallQueue->DoSavestate(file);
// probably not worth storing the vblank-latched Renderxxxxxx variables
CmdStallQueue.DoSavestate(file);
file->Var32((u32*)&VertexPipeline);
file->Var32((u32*)&NormalPipeline);
file->Var32((u32*)&PolygonPipeline);
@ -1731,24 +1724,24 @@ void VecTest(u32* params)
void CmdFIFOWrite(CmdFIFOEntry& entry)
{
if (CmdFIFO->IsEmpty() && !CmdPIPE->IsFull())
if (CmdFIFO.IsEmpty() && !CmdPIPE.IsFull())
{
CmdPIPE->Write(entry);
CmdPIPE.Write(entry);
}
else
{
if (CmdFIFO->IsFull())
if (CmdFIFO.IsFull())
{
// store it to the stall queue. stall the system.
// worst case is if a STMxx opcode causes this, which is why our stall queue
// has 64 entries. this is less complicated than trying to make STMxx stall-able.
CmdStallQueue->Write(entry);
CmdStallQueue.Write(entry);
NDS::GXFIFOStall();
return;
}
CmdFIFO->Write(entry);
CmdFIFO.Write(entry);
}
GXStat |= (1<<27);
@ -1767,27 +1760,27 @@ void CmdFIFOWrite(CmdFIFOEntry& entry)
CmdFIFOEntry CmdFIFORead()
{
CmdFIFOEntry ret = CmdPIPE->Read();
CmdFIFOEntry ret = CmdPIPE.Read();
if (CmdPIPE->Level() <= 2)
if (CmdPIPE.Level() <= 2)
{
if (!CmdFIFO->IsEmpty())
CmdPIPE->Write(CmdFIFO->Read());
if (!CmdFIFO->IsEmpty())
CmdPIPE->Write(CmdFIFO->Read());
if (!CmdFIFO.IsEmpty())
CmdPIPE.Write(CmdFIFO.Read());
if (!CmdFIFO.IsEmpty())
CmdPIPE.Write(CmdFIFO.Read());
// empty stall queue if needed
// CmdFIFO should not be full at this point.
if (!CmdStallQueue->IsEmpty())
if (!CmdStallQueue.IsEmpty())
{
while (!CmdStallQueue->IsEmpty())
while (!CmdStallQueue.IsEmpty())
{
if (CmdFIFO->IsFull()) break;
CmdFIFOEntry entry = CmdStallQueue->Read();
if (CmdFIFO.IsFull()) break;
CmdFIFOEntry entry = CmdStallQueue.Read();
CmdFIFOWrite(entry);
}
if (CmdStallQueue->IsEmpty())
if (CmdStallQueue.IsEmpty())
NDS::GXFIFOUnstall();
}
@ -2451,7 +2444,7 @@ void FinishWork(s32 cycles)
void Run()
{
if (!GeometryEnabled || FlushRequest ||
(CmdPIPE->IsEmpty() && !(GXStat & (1<<27))))
(CmdPIPE.IsEmpty() && !(GXStat & (1<<27))))
{
Timestamp = NDS::ARM9Timestamp >> NDS::ARM9ClockShift;
return;
@ -2463,7 +2456,7 @@ void Run()
if (CycleCount <= 0)
{
while (CycleCount <= 0 && !CmdPIPE->IsEmpty())
while (CycleCount <= 0 && !CmdPIPE.IsEmpty())
{
if (NumPushPopCommands == 0) GXStat &= ~(1<<14);
if (NumTestCommands == 0) GXStat &= ~(1<<0);
@ -2472,7 +2465,7 @@ void Run()
}
}
if (CycleCount <= 0 && CmdPIPE->IsEmpty())
if (CycleCount <= 0 && CmdPIPE.IsEmpty())
{
if (GXStat & (1<<27)) FinishWork(-CycleCount);
else CycleCount = 0;
@ -2488,8 +2481,8 @@ void CheckFIFOIRQ()
bool irq = false;
switch (GXStat >> 30)
{
case 1: irq = (CmdFIFO->Level() < 128); break;
case 2: irq = CmdFIFO->IsEmpty(); break;
case 1: irq = (CmdFIFO.Level() < 128); break;
case 2: irq = CmdFIFO.IsEmpty(); break;
}
if (irq) NDS::SetIRQ(0, NDS::IRQ_GXFIFO);
@ -2498,7 +2491,7 @@ void CheckFIFOIRQ()
void CheckFIFODMA()
{
if (CmdFIFO->Level() < 128)
if (CmdFIFO.Level() < 128)
NDS::CheckDMAs(0, 0x07);
}
@ -2705,7 +2698,7 @@ u8 Read8(u32 addr)
{
Run();
u32 fifolevel = CmdFIFO->Level();
u32 fifolevel = CmdFIFO.Level();
return fifolevel & 0xFF;
}
@ -2713,7 +2706,7 @@ u8 Read8(u32 addr)
{
Run();
u32 fifolevel = CmdFIFO->Level();
u32 fifolevel = CmdFIFO.Level();
return ((GXStat >> 24) & 0xFF) |
(fifolevel >> 8) |
@ -2748,7 +2741,7 @@ u16 Read16(u32 addr)
{
Run();
u32 fifolevel = CmdFIFO->Level();
u32 fifolevel = CmdFIFO.Level();
return (GXStat >> 16) |
fifolevel |
@ -2784,7 +2777,7 @@ u32 Read32(u32 addr)
{
Run();
u32 fifolevel = CmdFIFO->Level();
u32 fifolevel = CmdFIFO.Level();
return GXStat |
((PosMatrixStackPointer & 0x1F) << 8) |