From cb29c1ce4b50879fb9879e13b94385cb757af4c6 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 17 Dec 2012 20:14:06 +0100 Subject: [PATCH] Don't use __KernelTriggerWait in sceDisplay --- Core/HLE/sceDisplay.cpp | 15 ++++++++++++--- Core/HLE/sceKernelThread.h | 4 +++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index c1938e3f86..451e100a42 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -85,8 +85,9 @@ enum { struct WaitVBlankInfo { + WaitVBlankInfo(u32 tid) : threadID(tid), vcountUnblock(0) {} u32 threadID; - int vcountUnblock; + int vcountUnblock; // what was this for again? }; std::vector vblankWaitingThreads; @@ -144,7 +145,10 @@ void hleEnterVblank(u64 userdata, int cyclesLate) __DisplayFireVblank(); // Wake up threads waiting for VBlank - __KernelTriggerWait(WAITTYPE_VBLANK, 0, true); + for (int i = 0; i < vblankWaitingThreads.size(); i++) { + __KernelResumeThreadFromWait(vblankWaitingThreads[i].threadID, 0); + } + vblankWaitingThreads.clear(); // Trigger VBlank interrupt handlers. __TriggerInterrupt(PSP_VBLANK_INTR); @@ -201,7 +205,6 @@ void hleEnterVblank(u64 userdata, int cyclesLate) gpuStats.resetFrame(); } - host->EndFrame(); #ifdef _WIN32 @@ -318,36 +321,42 @@ u32 sceDisplayGetFramebuf(u32 topaddrPtr, u32 linesizePtr, u32 pixelFormatPtr, i void sceDisplayWaitVblankStart() { DEBUG_LOG(HLE,"sceDisplayWaitVblankStart()"); + vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread())); __KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, false); } void sceDisplayWaitVblank() { DEBUG_LOG(HLE,"sceDisplayWaitVblank()"); + vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread())); __KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, false); } void sceDisplayWaitVblankStartMulti() { DEBUG_LOG(HLE,"sceDisplayWaitVblankStartMulti()"); + vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread())); __KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, false); } void sceDisplayWaitVblankCB() { DEBUG_LOG(HLE,"sceDisplayWaitVblankCB()"); + vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread())); __KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, true); } void sceDisplayWaitVblankStartCB() { DEBUG_LOG(HLE,"sceDisplayWaitVblankStartCB()"); + vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread())); __KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, true); } void sceDisplayWaitVblankStartMultiCB() { DEBUG_LOG(HLE,"sceDisplayWaitVblankStartMultiCB()"); + vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread())); __KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, true); } diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index 30998ea4ad..bf9a3631a5 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -104,7 +104,9 @@ SceUID __KernelGetCurThread(); void __KernelSaveContext(ThreadContext *ctx); void __KernelLoadContext(ThreadContext *ctx); -// TODO: Replace this with __KernelResumeThread over time as it's misguided. +// TODO: Replace this with __KernelResumeThreadFromWait over time as it's misguided. +// It's better that each subsystem keeps track of the list of waiting threads +// and resumes them manually one by one using __KernelResumeThreadFromWait. bool __KernelTriggerWait(WaitType type, int id, bool dontSwitch = false); bool __KernelTriggerWait(WaitType type, int id, int retVal, bool dontSwitch); u32 __KernelResumeThreadFromWait(SceUID threadID); // can return an error value