From a79caf0bb9c41f7718f587f75bf43f212c332118 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sat, 12 Jan 2013 17:53:23 +0100 Subject: [PATCH] Handle vcount like jpscp. sceDisplayWaitVblank shouldn't wait if already in vblank (while WaitVBlankStart does). --- Core/HLE/sceDisplay.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index bf7f514014..da1b19d658 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -284,12 +284,12 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { #ifndef _WIN32 coreState = CORE_NEXTFRAME; #endif + vCount++; } void hleLeaveVblank(u64 userdata, int cyclesLate) { isVblank = 0; DEBUG_LOG(HLE,"Leave VBlank %i", (int)userdata - 1); - vCount++; hCount = 0; CoreTiming::ScheduleEvent(msToCycles(frameMs - vblankMs) - cyclesLate, enterVblankEvent, userdata); } @@ -366,9 +366,13 @@ void sceDisplayWaitVblankStart() { } void sceDisplayWaitVblank() { - DEBUG_LOG(HLE,"sceDisplayWaitVblank()"); - vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread())); - __KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, false); + if (!isVblank) { + DEBUG_LOG(HLE,"sceDisplayWaitVblank()"); + vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread())); + __KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, false); + } else { + DEBUG_LOG(HLE,"sceDisplayWaitVblank() - not waiting since in vBlank"); + } } void sceDisplayWaitVblankStartMulti() { @@ -378,9 +382,13 @@ void sceDisplayWaitVblankStartMulti() { } void sceDisplayWaitVblankCB() { - DEBUG_LOG(HLE,"sceDisplayWaitVblankCB()"); - vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread())); - __KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, true); + if (!isVblank) { + DEBUG_LOG(HLE,"sceDisplayWaitVblankCB()"); + vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread())); + __KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, true); + } else { + DEBUG_LOG(HLE,"sceDisplayWaitVblank() - not waiting since in vBlank"); + } } void sceDisplayWaitVblankStartCB() { @@ -414,7 +422,7 @@ void sceDisplayGetCurrentHcount() { void sceDisplayGetAccumulatedHcount() { // Just do an estimate - u32 accumHCount = CoreTiming::GetTicks() / (222000000 / 60 / 272); + u32 accumHCount = CoreTiming::GetTicks() / (CoreTiming::GetClockFrequencyMHz() * 1000000 / 60 / 272); DEBUG_LOG(HLE,"%i=sceDisplayGetAccumulatedHcount()", accumHCount); RETURN(accumHCount); }