aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2018-11-24 04:27:27 +0100
committerStapleButter <thetotalworm@gmail.com>2018-11-24 04:27:27 +0100
commit391c8d43b02fe459d12338d462a0c50f0d9e0232 (patch)
tree5dfab96a56ae495390f24b5ba5ebe7ebb757282d /src
parent7b48ce5b75150f9e0d8b1f0c35d244d65d36ee6c (diff)
drain GX pipelines when there's nothing else running. fixes some weird bugs, apparently.
Diffstat (limited to 'src')
-rw-r--r--src/GPU3D.cpp33
1 files changed, 22 insertions, 11 deletions
diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp
index d1753f0..bdf53a5 100644
--- a/src/GPU3D.cpp
+++ b/src/GPU3D.cpp
@@ -1663,9 +1663,6 @@ void ExecuteCommand()
ExecParamCount = 0;
- if (CycleCount > 0)
- GXStat |= (1<<27);
-
switch (entry.Command)
{
case 0x10: // matrix mode
@@ -2180,6 +2177,9 @@ void ExecuteCommand()
break;
}
}
+
+ if (CycleCount > 0)
+ GXStat |= (1<<27);
}
s32 CyclesToRunFor()
@@ -2188,11 +2188,28 @@ s32 CyclesToRunFor()
return CycleCount;
}
+void FinishWork(s32 cycles)
+{
+ AddCycles(cycles);
+ if (NormalPipeline)
+ NormalPipeline -= std::min(NormalPipeline, cycles);
+
+ CycleCount = 0;
+
+ if (VertexPipeline || NormalPipeline || PolygonPipeline)
+ return;
+
+ GXStat &= ~(1<<27);
+
+ if (NumPushPopCommands == 0) GXStat &= ~(1<<14);
+ if (NumTestCommands == 0) GXStat &= ~(1<<0);
+}
+
void Run(s32 cycles)
{
if (FlushRequest)
return;
- if (CycleCount <= 0 && CmdPIPE->IsEmpty())
+ if (CmdPIPE->IsEmpty() && !(GXStat & (1<<27)))
return;
CycleCount -= cycles;
@@ -2210,13 +2227,7 @@ void Run(s32 cycles)
if (CycleCount <= 0 && CmdPIPE->IsEmpty())
{
- // todo: advance remaining pipeline shit here
-
- CycleCount = 0;
- GXStat &= ~(1<<27);
-
- if (NumPushPopCommands == 0) GXStat &= ~(1<<14);
- if (NumTestCommands == 0) GXStat &= ~(1<<0);
+ if (GXStat & (1<<27)) FinishWork(-CycleCount);
}
}