CSPspEmu.Hle.Modules.display.sceDisplay._waitVblankCB C# (CSharp) Method

_waitVblankCB() private method

private _waitVblankCB ( CpuThreadState CpuThreadState, bool HandleCallbacks, int CycleCount, bool Start ) : int
CpuThreadState CSPspEmu.Core.Cpu.CpuThreadState
HandleCallbacks bool
CycleCount int
Start bool
return int
        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;
        }