mirror of
https://github.com/libretro/ppsspp.git
synced 2025-02-23 02:10:29 +00:00
Don't listsync until after the signal handler.
This commit is contained in:
parent
e98845f71d
commit
77311a121d
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
2
native
@ -1 +1 @@
|
||||
Subproject commit 7ebbe209043808982b227a4971f3d26a1d5cd419
|
||||
Subproject commit 8e06b06d7efb3299d8c6139651d99616273d6aa7
|
Loading…
x
Reference in New Issue
Block a user