If the interrupt is not run, don't flip gpuState.

Technically this is a hack, hopefully can remove it soon.
This commit is contained in:
Unknown W. Brackets 2013-04-06 02:25:17 -07:00
parent c57954a72e
commit c0f20c2fdd
3 changed files with 6 additions and 5 deletions

View File

@ -134,19 +134,20 @@ void __GeShutdown()
}
void __GeTriggerInterrupt(int listid, u32 pc)
bool __GeTriggerInterrupt(int listid, u32 pc)
{
// ClaDun X2 does not expect sceGeListEnqueue to reschedule (which it does not on the PSP.)
// Once PPSSPP's GPU uses cycles, we can remove this check.
DisplayList* dl = gpu->getList(listid);
if (dl != NULL && dl->subIntrBase < 0)
return;
return false;
GeInterruptData intrdata;
intrdata.listid = listid;
intrdata.pc = pc;
ge_pending_cb.push_back(intrdata);
__TriggerInterrupt(PSP_INTR_HLE, PSP_GE_INTR, PSP_INTR_SUB_NONE);
return true;
}
bool __GeHasPendingInterrupt()

View File

@ -39,7 +39,7 @@ void Register_sceGe_user();
void __GeInit();
void __GeDoState(PointerWrap &p);
void __GeShutdown();
void __GeTriggerInterrupt(int listid, u32 pc);
bool __GeTriggerInterrupt(int listid, u32 pc);
bool __GeHasPendingInterrupt();

View File

@ -572,8 +572,8 @@ void GPUCommon::ExecuteOp(u32 op, u32 diff) {
break;
}
if (interruptsEnabled_) {
gpuState = GPUSTATE_INTERRUPT;
__GeTriggerInterrupt(currentList->id, currentList->pc);
if (__GeTriggerInterrupt(currentList->id, currentList->pc))
gpuState = GPUSTATE_INTERRUPT;
}
}
break;