diff options
Diffstat (limited to 'GPU3D.cpp')
-rw-r--r-- | GPU3D.cpp | 32 |
1 files changed, 15 insertions, 17 deletions
@@ -848,7 +848,6 @@ void CmdFIFOWrite(CmdFIFOEntry& entry) if (CmdFIFO->IsEmpty() && !CmdPIPE->IsFull()) { CmdPIPE->Write(entry); - GXStat |= (1<<27); } else { @@ -890,24 +889,19 @@ void ExecuteCommand() { CmdFIFOEntry entry = CmdFIFORead(); - //printf("FIFO: %02X %08X\n", entry.Command, entry.Param); + //printf("FIFO: processing %02X %08X. Levels: FIFO=%d, PIPE=%d\n", entry.Command, entry.Param, CmdFIFO->Level(), CmdPIPE->Level()); ExecParams[ExecParamCount] = entry.Param; ExecParamCount++; - //if ((entry.Command&0xF0)==0x10) - // printf("MATRIX CMD %02X %08X\n", entry.Command, entry.Param); - if (ExecParamCount >= CmdNumParams[entry.Command]) { CycleCount += CmdNumCycles[entry.Command]; ExecParamCount = 0; GXStat &= ~(1<<14); - //if (CycleCount > 0) - // GXStat |= (1<<27); - - //printf("3D CMD %02X\n", entry.Command); + if (CycleCount > 0) + GXStat |= (1<<27); switch (entry.Command) { @@ -1268,6 +1262,10 @@ void Run(s32 cycles) { if (FlushRequest) return; + if (CycleCount <= 0 && CmdPIPE->IsEmpty()) + return; + + CycleCount -= cycles; if (CycleCount <= 0) { @@ -1275,12 +1273,10 @@ void Run(s32 cycles) ExecuteCommand(); } - CycleCount -= cycles; - if (CycleCount <= 0 && CmdPIPE->IsEmpty()) { CycleCount = 0; - GXStat &= ~(1<<27); + GXStat &= ~((1<<27)|(1<<14)); } } @@ -1318,7 +1314,6 @@ void VBlank() NumPolygons = 0; FlushRequest = 0; - GXStat &= ~(1<<27); } } @@ -1410,10 +1405,13 @@ void Write32(u32 addr, u32 val) for (;;) { - CmdFIFOEntry entry; - entry.Command = CurCommand & 0xFF; - entry.Param = val; - CmdFIFOWrite(entry); + if ((CurCommand & 0xFF) || (NumCommands == 4)) + { + CmdFIFOEntry entry; + entry.Command = CurCommand & 0xFF; + entry.Param = val; + CmdFIFOWrite(entry); + } if (ParamCount >= TotalParams) { |