From 26933384a7cecd88411ad1206716b92d3d8ca6e3 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 11 Apr 2014 23:49:33 -0700 Subject: [PATCH] Don't mark a list complete too early. This would matter probably mostly if we implemented CONTINUE properly. --- Core/HLE/sceGe.cpp | 6 ++++++ GPU/GPUCommon.cpp | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceGe.cpp b/Core/HLE/sceGe.cpp index cc9965a3d6..6bd25e6e45 100644 --- a/Core/HLE/sceGe.cpp +++ b/Core/HLE/sceGe.cpp @@ -107,6 +107,12 @@ public: } } + // Set the list as complete once the interrupt starts. + // In other words, not before another interrupt finishes. + if (dl->signal != PSP_GE_SIGNAL_HANDLER_PAUSE && cmd == GE_CMD_FINISH) { + dl->state = PSP_GE_DL_STATE_COMPLETED; + } + SubIntrHandler* handler = get(subintr); if (handler != NULL) { diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index 43537ad282..cdbf3d8fd5 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -920,11 +920,11 @@ void GPUCommon::ExecuteOp(u32 op, u32 diff) { default: currentList->subIntrToken = prev & 0xFFFF; - currentList->state = PSP_GE_DL_STATE_COMPLETED; UpdateState(GPUSTATE_DONE); if (currentList->interruptsEnabled && __GeTriggerInterrupt(currentList->id, currentList->pc, startingTicks + cyclesExecuted)) { currentList->pendingInterrupt = true; } else { + currentList->state = PSP_GE_DL_STATE_COMPLETED; currentList->waitTicks = startingTicks + cyclesExecuted; busyTicks = std::max(busyTicks, currentList->waitTicks); __GeTriggerSync(GPU_SYNC_LIST, currentList->id, currentList->waitTicks);