private int _waitVblankCB(CpuThreadState CpuThreadState, bool HandleCallbacks, int CycleCount, bool Start)
{
if (CycleCount <= 0)
{
throw(new SceKernelException(SceKernelErrors.ERROR_INVALID_VALUE));
}
int Wait = 1;
//if (DisplayConfig.VerticalSynchronization && (Start || !PspDisplay.IsVblank))
if (DisplayConfig.VerticalSynchronization)
{
ThreadManager.Current.SetWaitAndPrepareWakeUp(HleThread.WaitType.Display, "sceDisplayWaitVblankStart", null, (WakeUp) =>
{
Action Next = null;
Action WakeUpRemoveCallback = () =>
{
PspDisplay.VBlankCallback -= Next;
WakeUp();
};
Next = () =>
{
if (!Start && PspDisplay.IsVblank)
{
WakeUpRemoveCallback();
}
else
{
//CycleCount--;
if (CycleCount-- <= 0)
{
Wait = 0;
WakeUpRemoveCallback();
}
}
};
PspDisplay.VBlankCallback += Next;
Next();
}, HandleCallbacks: HandleCallbacks);
}
return Wait;
}