GSPEVENT_PPF,
GSPEVENT_P3D,
GSPEVENT_DMA,
- GSPEVENT_count, // used to know how many events there are
+
+ GSPEVENT_MAX, // used to know how many events there are
} GSP_Event;
Result gspInit();
Result gspInitEventHandler(Handle gspEvent, vu8* gspSharedMem, u8 gspThreadId);
void gspExitEventHandler();
-void gspWaitForEvent(GSP_Event id);
-#define gspWaitForPSC0() gspWaitForEvent(GSPEVENT_PSC0)
-#define gspWaitForPSC1() gspWaitForEvent(GSPEVENT_PSC1)
+void gspWaitForEvent(GSP_Event id, bool nextEvent);
+#define gspWaitForPSC0() gspWaitForEvent(GSPEVENT_PSC0, false)
+#define gspWaitForPSC1() gspWaitForEvent(GSPEVENT_PSC1, false)
#define gspWaitForVBlank() gspWaitForVBlank0()
-#define gspWaitForVBlank0() gspWaitForEvent(GSPEVENT_VBlank0)
-#define gspWaitForVBlank1() gspWaitForEvent(GSPEVENT_VBlank1)
-#define gspWaitForPPF() gspWaitForEvent(GSPEVENT_PPF)
-#define gspWaitForP3D() gspWaitForEvent(GSPEVENT_P3D)
-#define gspWaitForDMA() gspWaitForEvent(GSPEVENT_DMA)
+#define gspWaitForVBlank0() gspWaitForEvent(GSPEVENT_VBlank0, true)
+#define gspWaitForVBlank1() gspWaitForEvent(GSPEVENT_VBlank1, true)
+#define gspWaitForPPF() gspWaitForEvent(GSPEVENT_PPF, false)
+#define gspWaitForP3D() gspWaitForEvent(GSPEVENT_P3D, false)
+#define gspWaitForDMA() gspWaitForEvent(GSPEVENT_DMA, false)
Result GSPGPU_AcquireRight(Handle *handle, u8 flags);
Result GSPGPU_ReleaseRight(Handle *handle);
#define GSP_EVENT_STACK_SIZE 0x1000
Handle gspGpuHandle=0;
-Handle gspEvents[GSPEVENT_count];
+Handle gspEvents[GSPEVENT_MAX];
u64 gspEventStack[GSP_EVENT_STACK_SIZE/sizeof(u64)]; //u64 so that it's 8-byte aligned
volatile bool gspRunEvents;
Handle gspEventThread;
{
// Create events
int i;
- for (i = 0; i < GSPEVENT_count; i ++)
+ for (i = 0; i < GSPEVENT_MAX; i ++)
{
Result rc = svcCreateEvent(&gspEvents[i], 0);
if (rc != 0)
// Free events
int i;
- for (i = 0; i < GSPEVENT_count; i ++)
+ for (i = 0; i < GSPEVENT_MAX; i ++)
svcCloseHandle(gspEvents[i]);
}
-void gspWaitForEvent(GSP_Event id)
+void gspWaitForEvent(GSP_Event id, bool nextEvent)
{
- svcClearEvent(gspEvents[id]);
+ if (nextEvent)
+ svcClearEvent(gspEvents[id]);
svcWaitSynchronization(gspEvents[id], U64_MAX);
+ if (!nextEvent)
+ svcClearEvent(gspEvents[id]);
}
void gspEventThreadMain(u32 arg)
int curEvt = gspEventData[0xC + cur];
cur --;
if (cur < 0) cur += 0x34;
- if (curEvt >= GSPEVENT_count) continue;
+ if (curEvt >= GSPEVENT_MAX) continue;
svcSignalEvent(gspEvents[curEvt]);
}