mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-02-26 08:55:58 +00:00
Check if vblank waits were released before waking.
This commit is contained in:
parent
5f29bb7f93
commit
7f1a6154b2
@ -50,7 +50,8 @@ struct WaitVBlankInfo
|
|||||||
WaitVBlankInfo(u32 tid) : threadID(tid), vcountUnblock(1) {}
|
WaitVBlankInfo(u32 tid) : threadID(tid), vcountUnblock(1) {}
|
||||||
WaitVBlankInfo(u32 tid, int vcount) : threadID(tid), vcountUnblock(vcount) {}
|
WaitVBlankInfo(u32 tid, int vcount) : threadID(tid), vcountUnblock(vcount) {}
|
||||||
u32 threadID;
|
u32 threadID;
|
||||||
int vcountUnblock; // what was this for again?
|
// Number of vcounts to block for.
|
||||||
|
int vcountUnblock;
|
||||||
|
|
||||||
void DoState(PointerWrap &p)
|
void DoState(PointerWrap &p)
|
||||||
{
|
{
|
||||||
@ -424,9 +425,14 @@ void hleEnterVblank(u64 userdata, int cyclesLate) {
|
|||||||
__DisplayFireVblank();
|
__DisplayFireVblank();
|
||||||
|
|
||||||
// Wake up threads waiting for VBlank
|
// Wake up threads waiting for VBlank
|
||||||
|
u32 error;
|
||||||
for (size_t i = 0; i < vblankWaitingThreads.size(); i++) {
|
for (size_t i = 0; i < vblankWaitingThreads.size(); i++) {
|
||||||
if (--vblankWaitingThreads[i].vcountUnblock == 0) {
|
if (--vblankWaitingThreads[i].vcountUnblock == 0) {
|
||||||
|
// Only wake it if it wasn't already released by someone else.
|
||||||
|
SceUID waitID = __KernelGetWaitID(vblankWaitingThreads[i].threadID, WAITTYPE_VBLANK, error);
|
||||||
|
if (waitID == 1) {
|
||||||
__KernelResumeThreadFromWait(vblankWaitingThreads[i].threadID, 0);
|
__KernelResumeThreadFromWait(vblankWaitingThreads[i].threadID, 0);
|
||||||
|
}
|
||||||
vblankWaitingThreads.erase(vblankWaitingThreads.begin() + i--);
|
vblankWaitingThreads.erase(vblankWaitingThreads.begin() + i--);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -611,7 +617,7 @@ u32 sceDisplayGetFramebuf(u32 topaddrPtr, u32 linesizePtr, u32 pixelFormatPtr, i
|
|||||||
u32 sceDisplayWaitVblankStart() {
|
u32 sceDisplayWaitVblankStart() {
|
||||||
VERBOSE_LOG(HLE,"sceDisplayWaitVblankStart()");
|
VERBOSE_LOG(HLE,"sceDisplayWaitVblankStart()");
|
||||||
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread()));
|
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread()));
|
||||||
__KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, false, "vblank start waited");
|
__KernelWaitCurThread(WAITTYPE_VBLANK, 1, 0, 0, false, "vblank start waited");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -619,7 +625,7 @@ u32 sceDisplayWaitVblank() {
|
|||||||
if (!isVblank) {
|
if (!isVblank) {
|
||||||
VERBOSE_LOG(HLE,"sceDisplayWaitVblank()");
|
VERBOSE_LOG(HLE,"sceDisplayWaitVblank()");
|
||||||
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread()));
|
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread()));
|
||||||
__KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, false, "vblank waited");
|
__KernelWaitCurThread(WAITTYPE_VBLANK, 1, 0, 0, false, "vblank waited");
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
DEBUG_LOG(HLE,"sceDisplayWaitVblank() - not waiting since in vBlank");
|
DEBUG_LOG(HLE,"sceDisplayWaitVblank() - not waiting since in vBlank");
|
||||||
@ -639,7 +645,7 @@ u32 sceDisplayWaitVblankStartMulti(int vblanks) {
|
|||||||
if (__IsInInterrupt())
|
if (__IsInInterrupt())
|
||||||
return SCE_KERNEL_ERROR_ILLEGAL_CONTEXT;
|
return SCE_KERNEL_ERROR_ILLEGAL_CONTEXT;
|
||||||
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread(), vblanks));
|
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread(), vblanks));
|
||||||
__KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, false, "vblank start multi waited");
|
__KernelWaitCurThread(WAITTYPE_VBLANK, 1, 0, 0, false, "vblank start multi waited");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -647,7 +653,7 @@ u32 sceDisplayWaitVblankCB() {
|
|||||||
if (!isVblank) {
|
if (!isVblank) {
|
||||||
VERBOSE_LOG(HLE,"sceDisplayWaitVblankCB()");
|
VERBOSE_LOG(HLE,"sceDisplayWaitVblankCB()");
|
||||||
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread()));
|
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread()));
|
||||||
__KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, true, "vblank waited");
|
__KernelWaitCurThread(WAITTYPE_VBLANK, 1, 0, 0, true, "vblank waited");
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
DEBUG_LOG(HLE,"sceDisplayWaitVblank() - not waiting since in vBlank");
|
DEBUG_LOG(HLE,"sceDisplayWaitVblank() - not waiting since in vBlank");
|
||||||
@ -659,7 +665,7 @@ u32 sceDisplayWaitVblankCB() {
|
|||||||
u32 sceDisplayWaitVblankStartCB() {
|
u32 sceDisplayWaitVblankStartCB() {
|
||||||
VERBOSE_LOG(HLE,"sceDisplayWaitVblankStartCB()");
|
VERBOSE_LOG(HLE,"sceDisplayWaitVblankStartCB()");
|
||||||
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread()));
|
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread()));
|
||||||
__KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, true, "vblank start waited");
|
__KernelWaitCurThread(WAITTYPE_VBLANK, 1, 0, 0, true, "vblank start waited");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -674,7 +680,7 @@ u32 sceDisplayWaitVblankStartMultiCB(int vblanks) {
|
|||||||
if (__IsInInterrupt())
|
if (__IsInInterrupt())
|
||||||
return SCE_KERNEL_ERROR_ILLEGAL_CONTEXT;
|
return SCE_KERNEL_ERROR_ILLEGAL_CONTEXT;
|
||||||
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread(), vblanks));
|
vblankWaitingThreads.push_back(WaitVBlankInfo(__KernelGetCurThread(), vblanks));
|
||||||
__KernelWaitCurThread(WAITTYPE_VBLANK, 0, 0, 0, true, "vblank start multi waited");
|
__KernelWaitCurThread(WAITTYPE_VBLANK, 1, 0, 0, true, "vblank start multi waited");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user