From 014d9ddead570cb3a5da215ea41d43e35c9950c0 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 7 Oct 2018 14:41:08 -0700 Subject: [PATCH] Display: Resched interrupt before vblank threads. Otherwise, we may first schedule to a woken thread, and then immediately reschedule to the interrupt. Each reschedule costs ticks, and it doesn't look like this should cause two reschedules. Improves #11414, Breath of Fire 3 frame flicker. --- Core/HLE/sceDisplay.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 02bbc1e078..9d8bfe0990 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -645,6 +645,9 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { CoreTiming::ScheduleEvent(msToCycles(vblankMs) - cyclesLate, leaveVblankEvent, vbCount + 1); + // Trigger VBlank interrupt handlers. + __TriggerInterrupt(PSP_INTR_IMMEDIATE | PSP_INTR_ONLY_IF_ENABLED | PSP_INTR_ALWAYS_RESCHED, PSP_VBLANK_INTR, PSP_INTR_SUB_ALL); + // Wake up threads waiting for VBlank u32 error; bool wokeThreads = false; @@ -663,9 +666,6 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { __KernelReSchedule("entered vblank"); } - // Trigger VBlank interrupt handlers. - __TriggerInterrupt(PSP_INTR_IMMEDIATE | PSP_INTR_ONLY_IF_ENABLED | PSP_INTR_ALWAYS_RESCHED, PSP_VBLANK_INTR, PSP_INTR_SUB_ALL); - numVBlanks++; numVBlanksSinceFlip++;