Exemple #1
0
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);
}
Exemple #2
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]);
	}
}
Exemple #3
0
/*------------------------------------------------------------------------------*/
void TranceAsyncOff( void )
{
	if ( IndexUseNow == -1 ){ return; }
	sceKernelDisableSubIntr( 30, IndexUseNow );
	sceKernelReleaseSubIntrHandler( 30, IndexUseNow );
	IndexUseNow = -1;
}
Exemple #4
0
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");
}
Exemple #5
0
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();
}
Exemple #6
0
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);
}
Exemple #7
0
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;
}