Don't listsync until after the signal handler.

This commit is contained in:
Unknown W. Brackets 2013-04-06 08:19:54 -07:00
parent e98845f71d
commit 77311a121d
5 changed files with 22 additions and 15 deletions

View File

@ -54,7 +54,7 @@ public:
return false;
}
gpu->InterruptStart();
gpu->InterruptStart(intrdata.listid);
u32 cmd = Memory::ReadUnchecked_U32(intrdata.pc - 4) >> 24;
int subintr = dl->subIntrBase | (cmd == GE_CMD_FINISH ? PSP_GE_SUBINTR_FINISH : PSP_GE_SUBINTR_SIGNAL);
@ -74,7 +74,7 @@ public:
}
ge_pending_cb.pop_front();
gpu->InterruptEnd();
gpu->InterruptEnd(intrdata.listid);
WARN_LOG(HLE, "Ignoring interrupt for display list %d, already been released.", intrdata.listid);
return false;
@ -109,7 +109,7 @@ public:
dl->signal = PSP_GE_SIGNAL_NONE;
gpu->InterruptEnd();
gpu->InterruptEnd(intrdata.listid);
}
};

View File

@ -441,9 +441,6 @@ bool GPUCommon::ProcessDLQueue()
}
else
{
l.shouldWait = false;
__KernelTriggerWait(WAITTYPE_GELISTSYNC, *iter, 0, "GeListSync");
//At the end, we can remove it from the queue and continue
dlQueue.erase(iter);
//this invalidated the iterator, let's fix it
@ -589,8 +586,10 @@ void GPUCommon::ExecuteOp(u32 op, u32 diff) {
currentList->state = PSP_GE_DL_STATE_COMPLETED;
gpuState = GPUSTATE_DONE;
currentList->subIntrToken = prev & 0xFFFF;
if (interruptsEnabled_)
__GeTriggerInterrupt(currentList->id, currentList->pc);
if (!interruptsEnabled_ || !__GeTriggerInterrupt(currentList->id, currentList->pc)) {
currentList->shouldWait = false;
__KernelTriggerWait(WAITTYPE_GELISTSYNC, currentList->id, 0, "GeListSync", true);
}
break;
default:
DEBUG_LOG(G3D,"Ah, not finished: %06x", prev & 0xFFFFFF);
@ -626,13 +625,21 @@ void GPUCommon::DoState(PointerWrap &p) {
p.DoMarker("GPUCommon");
}
void GPUCommon::InterruptStart()
void GPUCommon::InterruptStart(int listid)
{
interruptRunning = true;
}
void GPUCommon::InterruptEnd()
void GPUCommon::InterruptEnd(int listid)
{
interruptRunning = false;
isbreak = false;
DisplayList &dl = dls[listid];
// TODO: Unless the signal handler could change it?
if (dl.state == PSP_GE_DL_STATE_COMPLETED) {
dl.shouldWait = false;
__KernelTriggerWait(WAITTYPE_GELISTSYNC, listid, 0, "GeListSync", true);
}
ProcessDLQueue();
}

View File

@ -8,8 +8,8 @@ public:
GPUCommon();
virtual ~GPUCommon() {}
virtual void InterruptStart();
virtual void InterruptEnd();
virtual void InterruptStart(int listid);
virtual void InterruptEnd(int listid);
virtual void EnableInterrupts(bool enable) {
interruptsEnabled_ = enable;
}

View File

@ -145,8 +145,8 @@ public:
virtual u32 Continue() = 0;
virtual u32 Break(int mode) = 0;
virtual void InterruptStart() = 0;
virtual void InterruptEnd() = 0;
virtual void InterruptStart(int listid) = 0;
virtual void InterruptEnd(int listid) = 0;
virtual void PreExecuteOp(u32 op, u32 diff) = 0;
virtual void ExecuteOp(u32 op, u32 diff) = 0;

2
native

@ -1 +1 @@
Subproject commit 7ebbe209043808982b227a4971f3d26a1d5cd419
Subproject commit 8e06b06d7efb3299d8c6139651d99616273d6aa7