static void psp_free(void *data) { psp1_video_t *psp = (psp1_video_t*)data; if(!(psp) || !(psp->main_dList)) return; sceDisplayWaitVblankStart(); sceGuDisplay(GU_FALSE); sceGuTerm(); if (psp->main_dList) free(psp->main_dList); if (psp->frame_dList) free(psp->frame_dList); if (psp->frame_coords) free(TO_CACHED_PTR(psp->frame_coords)); if (psp->menu.frame_coords) free(TO_CACHED_PTR(psp->menu.frame_coords)); if (psp->menu.dList) free(psp->menu.dList); if (psp->menu.frame) free(psp->menu.frame); free(data); sceKernelDisableSubIntr(PSP_VBLANK_INT, 0); sceKernelReleaseSubIntrHandler(PSP_VBLANK_INT,0); }
void checkVblankInterruptHandler() { int counter = 0, last_counter = 0; int results[3], n; //pspDebugScreenInit(); pspDebugScreenPrintf("Starting...\n"); printf("Starting...\n"); sceKernelRegisterSubIntrHandler(PSP_VBLANK_INT, 0, vblank_handler_counter, &counter); sceKernelDelayThread(80000); results[0] = counter; printf("NotEnabled: Counter:%s\n", (counter == 0) ? "zero" : "non-zero"); // 0. Not enabled yet. sceKernelEnableSubIntr(PSP_VBLANK_INT, 0); sceKernelDelayThread(160000); results[1] = counter; printf("Enabled (GreaterThan2): Counter:%s\n", (counter >= 2) ? "greater" : "no greater"); // n. Already enabled. sceKernelReleaseSubIntrHandler(PSP_VBLANK_INT, 0); last_counter = counter; sceKernelDelayThread(80000); results[2] = counter; printf("Disabled (NotChangedAfterDisabled): %s\n", (last_counter != counter) ? "changed" : "not changed"); // n. Disabled. for (n = 0; n < 3; n++) { //printf("Output %d:%d\n", n, results[n]); pspDebugScreenPrintf("%d\n", results[n]); } }
/*------------------------------------------------------------------------------*/ void TranceAsyncOff( void ) { if ( IndexUseNow == -1 ){ return; } sceKernelDisableSubIntr( 30, IndexUseNow ); sceKernelReleaseSubIntrHandler( 30, IndexUseNow ); IndexUseNow = -1; }
void basicUsage() { int value = 7; sema = sceKernelCreateSema("semaphore", 0, 0, 255, NULL); mainThreadId = sceKernelGetThreadId(); //int cb = sceKernelCreateCallback("vblankCallback", vblankCallback, NULL); sceKernelRegisterSubIntrHandler(PSP_DISPLAY_SUBINT, 0, vblankCallback, &value); printf("beforeEnableVblankCallback\n"); sceKernelEnableSubIntr(PSP_DISPLAY_SUBINT, 0); printf("afterEnableVblankCallback\n"); sceKernelWaitSemaCB(sema, 1, NULL); //while (!vblankCalled) { sceKernelDelayThread(1000); } if (called) { printf("vblankCallback(%d):%d\n", *(int *)&value, (vblankCalledThread == mainThreadId)); } sceKernelReleaseSubIntrHandler(PSP_DISPLAY_SUBINT, 0); //sceDisplayWaitVblank(); printf("ended\n"); }
void checkDispatchInterrupt() { dispatchCheckpoint("Interrupts while dispatch disabled:"); sceKernelRegisterSubIntrHandler(PSP_VBLANK_INT, 0, &vblankCallback, NULL); sceKernelEnableSubIntr(PSP_VBLANK_INT, 0); ++ignoreResched; int state = sceKernelSuspendDispatchThread(); int base = sceDisplayGetVcount(); int i, j; for (i = 0; i < 1000; ++i) { if (sceDisplayGetVcount() > base + 3) { break; } for (j = 0; j < 10000; ++j) continue; } dispatchCheckpoint("vblanks=%d", sceDisplayGetVcount() - base); sceKernelResumeDispatchThread(state); --ignoreResched; base = sceDisplayGetVcount(); for (i = 0; i < 1000; ++i) { if (sceDisplayGetVcount() > base + 3) { break; } for (j = 0; j < 10000; ++j) continue; } dispatchCheckpoint("vblanks=%d", sceDisplayGetVcount() - base); sceKernelDisableSubIntr(PSP_VBLANK_INT, 0); sceKernelReleaseSubIntrHandler(PSP_VBLANK_INT, 0); flushschedf(); }
void suspendUsage() { int counter; sceKernelRegisterSubIntrHandler(PSP_VBLANK_INT, 0, vblank_counter, &counter); counter = 0; sceKernelEnableSubIntr(PSP_VBLANK_INT, 0); int flag = sceKernelCpuSuspendIntr(); sceKernelDelayThread(300000); sceKernelCpuResumeIntr(flag); sceKernelDisableSubIntr(PSP_VBLANK_INT, 0); printf("Interrupts suspended: %d\n", counter); counter = 0; sceKernelRegisterSubIntrHandler(PSP_VBLANK_INT, 0, vblank_counter, &counter); sceKernelEnableSubIntr(PSP_VBLANK_INT, 0); sceKernelDelayThread(300000); sceKernelDisableSubIntr(PSP_VBLANK_INT, 0); sceKernelReleaseSubIntrHandler(PSP_VBLANK_INT, 0); printf("Interrupts resumed: %d\n", counter); }
void sceGeUnsetCallback(u32 cbID) { DEBUG_LOG(HLE,"sceGeUnsetCallback(cbid=%08x)", cbID); sceKernelReleaseSubIntrHandler(PSP_GE_INTR, PSP_GE_SUBINTR_FINISH); sceKernelReleaseSubIntrHandler(PSP_GE_INTR, PSP_GE_SUBINTR_SIGNAL); }
extern "C" int main(int argc, char *argv[]) { int result; sceKernelRegisterSubIntrHandler(30, 1, (void *)&handler, (void *)0xDEADBEEF); checkpointNext("sceKernelEnableSubIntr:"); result = sceKernelEnableSubIntr(70, 1); checkpoint(" Invalid intr: %08x", result); result = sceKernelEnableSubIntr(30, 70); checkpoint(" Invalid subintr: %08x", result); result = sceKernelEnableSubIntr(30, 1); checkpoint(" Registered: %08x", result); result = sceKernelEnableSubIntr(30, 1); checkpoint(" Twice: %08x", result); result = sceKernelEnableSubIntr(30, 3); checkpoint(" Unregistered: %08x", result); sceKernelDisableSubIntr(30, 2); sceKernelDisableSubIntr(30, 1); checkpointNext("Interrupts run when enabled:"); checkpoint(" With handler first:"); result = sceKernelEnableSubIntr(30, 1); sceKernelDelayThread(17000); sceKernelDisableSubIntr(30, 1); checkpoint(" With handler after:"); result = sceKernelEnableSubIntr(30, 2); sceKernelRegisterSubIntrHandler(30, 2, (void *)&handler, (void *)0xDEADBEEF); sceKernelDelayThread(17000); sceKernelDisableSubIntr(30, 2); sceKernelReleaseSubIntrHandler(30, 2); checkpoint(" Without handler:"); result = sceKernelEnableSubIntr(30, 3); sceKernelDelayThread(17000); sceKernelDisableSubIntr(30, 3); checkpoint(" Released while enabled:"); sceKernelRegisterSubIntrHandler(30, 4, (void *)&handler, (void *)0xDEADBEEF); result = sceKernelEnableSubIntr(30, 4); sceKernelReleaseSubIntrHandler(30, 4); sceKernelRegisterSubIntrHandler(30, 4, (void *)&handler, (void *)0xDEADBEEF); sceKernelDelayThread(17000); sceKernelDisableSubIntr(30, 4); sceKernelReleaseSubIntrHandler(30, 4); checkpointNext("sceKernelDisableSubIntr:"); result = sceKernelDisableSubIntr(70, 1); checkpoint(" Invalid intr: %08x", result); result = sceKernelDisableSubIntr(30, 70); checkpoint(" Invalid subintr: %08x", result); sceKernelEnableSubIntr(30, 1); result = sceKernelDisableSubIntr(30, 1); checkpoint(" Registered: %08x", result); result = sceKernelDisableSubIntr(30, 1); checkpoint(" Twice: %08x", result); result = sceKernelDisableSubIntr(30, 3); checkpoint(" Unregistered: %08x", result); sceKernelReleaseSubIntrHandler(30, 1); return 0; }