*
* @note You should always call @ref gfxExit once done to free the memory and services
*/
-void gfxInitDefault();
+void gfxInitDefault(void);
/**
* @brief Initializes the LCD framebuffers
*
* Just call it when you're done.
*/
-void gfxExit();
+void gfxExit(void);
///@}
///@name Control
* Use this if the data within your framebuffers changes a lot and that you want to make sure everything was updated correctly.
* This shouldn't be needed and has a significant overhead.
*/
-void gfxFlushBuffers();
+void gfxFlushBuffers(void);
/**
* @brief Swaps the buffers and sets the gsp state
* LCD rendering should start as soon as the gsp state is set.
* When using the GPU, call @ref gfxSwapBuffers instead.
*/
-void gfxSwapBuffers();
+void gfxSwapBuffers(void);
/**
* @brief Swaps the framebuffers
* This is the version to be used with the GPU since the GPU will use the gsp shared memory,
* so the gsp state mustn't be set directly by the user.
*/
-void gfxSwapBuffersGpu();
+void gfxSwapBuffersGpu(void);
///@}
GSPEVENT_MAX, // used to know how many events there are
} GSP_Event;
-Result gspInit();
-void gspExit();
+Result gspInit(void);
+void gspExit(void);
Result gspInitEventHandler(Handle gspEvent, vu8* gspSharedMem, u8 gspThreadId);
-void gspExitEventHandler();
+void gspExitEventHandler(void);
void gspWaitForEvent(GSP_Event id, bool nextEvent);
#define gspWaitForPSC0() gspWaitForEvent(GSPEVENT_PSC0, false)
#define gspWaitForPSC1() gspWaitForEvent(GSPEVENT_PSC1, 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);
-Result GSPGPU_ImportDisplayCaptureInfo(Handle* handle, GSP_CaptureInfo *captureinfo);
-Result GSPGPU_SaveVramSysArea(Handle* handle);
-Result GSPGPU_RestoreVramSysArea(Handle* handle);
-Result GSPGPU_SetLcdForceBlack(Handle *handle, u8 flags);
-Result GSPGPU_SetBufferSwap(Handle* handle, u32 screenid, GSP_FramebufferInfo *framebufinfo);
-Result GSPGPU_FlushDataCache(Handle *handle, u8* adr, u32 size);
-Result GSPGPU_InvalidateDataCache(Handle* handle, u8* adr, u32 size);
-Result GSPGPU_WriteHWRegs(Handle *handle, u32 regAddr, u32* data, u8 size);
-Result GSPGPU_WriteHWRegsWithMask(Handle* handle, u32 regAddr, u32* data, u8 datasize, u32* maskdata, u8 masksize);
-Result GSPGPU_ReadHWRegs(Handle *handle, u32 regAddr, u32* data, u8 size);
-Result GSPGPU_RegisterInterruptRelayQueue(Handle *handle, Handle eventHandle, u32 flags, Handle* outMemHandle, u8* threadID);
-Result GSPGPU_UnregisterInterruptRelayQueue(Handle* handle);
-Result GSPGPU_TriggerCmdReqQueue(Handle *handle);
-Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8], Handle* handle);
+Result GSPGPU_AcquireRight(u8 flags);
+Result GSPGPU_ReleaseRight(void);
+Result GSPGPU_ImportDisplayCaptureInfo(GSP_CaptureInfo *captureinfo);
+Result GSPGPU_SaveVramSysArea(void);
+Result GSPGPU_RestoreVramSysArea(void);
+Result GSPGPU_SetLcdForceBlack(u8 flags);
+Result GSPGPU_SetBufferSwap(u32 screenid, GSP_FramebufferInfo *framebufinfo);
+Result GSPGPU_FlushDataCache(const void* adr, u32 size);
+Result GSPGPU_InvalidateDataCache(const void* adr, u32 size);
+Result GSPGPU_WriteHWRegs(u32 regAddr, u32* data, u8 size);
+Result GSPGPU_WriteHWRegsWithMask(u32 regAddr, u32* data, u8 datasize, u32* maskdata, u8 masksize);
+Result GSPGPU_ReadHWRegs(u32 regAddr, u32* data, u8 size);
+Result GSPGPU_RegisterInterruptRelayQueue(Handle eventHandle, u32 flags, Handle* outMemHandle, u8* threadID);
+Result GSPGPU_UnregisterInterruptRelayQueue(void);
+Result GSPGPU_TriggerCmdReqQueue(void);
+Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8]);
return botFormat;
}
-void gfxSetDoubleBuffering( gfxScreen_t screen, bool doubleBuffering) {
+void gfxSetDoubleBuffering(gfxScreen_t screen, bool doubleBuffering) {
doubleBuf[screen] = doubleBuffering ? 1 : 0; // make sure they're the integer values '1' and '0'
}
gfxSharedMemory=(u8*)0x10002000;
- GSPGPU_AcquireRight(NULL, 0x0);
+ GSPGPU_AcquireRight(0x0);
//setup our gsp shared mem section
svcCreateEvent(&gspEvent, 0x0);
- GSPGPU_RegisterInterruptRelayQueue(NULL, gspEvent, 0x1, &gspSharedMemHandle, &gfxThreadID);
+ GSPGPU_RegisterInterruptRelayQueue(gspEvent, 0x1, &gspSharedMemHandle, &gfxThreadID);
svcMapMemoryBlock(gspSharedMemHandle, (u32)gfxSharedMemory, 0x3, 0x10000000);
// default gspHeap configuration :
gspInitEventHandler(gspEvent, (vu8*)gfxSharedMemory, gfxThreadID);
gspWaitForVBlank();
- GSPGPU_SetLcdForceBlack(NULL, 0x0);
+ GSPGPU_SetLcdForceBlack(0x0);
}
-void gfxInitDefault() {
+void gfxInitDefault(void) {
gfxInit(GSP_BGR8_OES,GSP_BGR8_OES,false);
}
-void gfxExit()
+void gfxExit(void)
{
- if (screenFree == NULL ) return;
+ if (screenFree == NULL) return;
// Exit event handler
gspExitEventHandler();
//unmap GSP shared mem
svcUnmapMemoryBlock(gspSharedMemHandle, 0x10002000);
- GSPGPU_UnregisterInterruptRelayQueue(NULL);
+ GSPGPU_UnregisterInterruptRelayQueue();
svcCloseHandle(gspSharedMemHandle);
svcCloseHandle(gspEvent);
- GSPGPU_ReleaseRight(NULL);
+ GSPGPU_ReleaseRight();
gspExit();
}
}
-void gfxFlushBuffers()
+void gfxFlushBuffers(void)
{
u32 topSize = 400 * 240 * __get_bytes_per_pixel(gfxGetScreenFormat(GFX_TOP));
u32 bottomSize = 320 * 240 * __get_bytes_per_pixel(gfxGetScreenFormat(GFX_BOTTOM));
- GSPGPU_FlushDataCache(NULL, gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL), topSize);
- if(enable3d)GSPGPU_FlushDataCache(NULL, gfxGetFramebuffer(GFX_TOP, GFX_RIGHT, NULL, NULL), topSize);
- GSPGPU_FlushDataCache(NULL, gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL), bottomSize);
+ GSPGPU_FlushDataCache(gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL), topSize);
+ if(enable3d)GSPGPU_FlushDataCache(gfxGetFramebuffer(GFX_TOP, GFX_RIGHT, NULL, NULL), topSize);
+ GSPGPU_FlushDataCache(gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL), bottomSize);
}
-void gfxSwapBuffers()
+void gfxSwapBuffers(void)
{
currentBuffer[0]^=doubleBuf[0];
currentBuffer[1]^=doubleBuf[1];
gfxSetFramebufferInfo(GFX_TOP, currentBuffer[0]);
gfxSetFramebufferInfo(GFX_BOTTOM, currentBuffer[1]);
- GSPGPU_SetBufferSwap(NULL, GFX_TOP, &topFramebufferInfo);
- GSPGPU_SetBufferSwap(NULL, GFX_BOTTOM, &bottomFramebufferInfo);
+ GSPGPU_SetBufferSwap(GFX_TOP, &topFramebufferInfo);
+ GSPGPU_SetBufferSwap(GFX_BOTTOM, &bottomFramebufferInfo);
}
-void gfxSwapBuffersGpu()
+void gfxSwapBuffersGpu(void)
{
currentBuffer[0]^=doubleBuf[0];
currentBuffer[1]^=doubleBuf[1];
gxCommand[3]=length; //size
gxCommand[4]=gxCommand[5]=gxCommand[6]=gxCommand[7]=0x0;
- return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand, NULL);
+ return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand);
}
Result GX_SetCommandList_Last(u32* buf0a, u32 buf0s, u8 flags)
gxCommand[4]=gxCommand[5]=gxCommand[6]=0x0;
gxCommand[7]=(flags>>1)&1; //when non-zero, call svcFlushProcessDataCache() with the specified buffer
- return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand, NULL);
+ return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand);
}
Result GX_SetMemoryFill(u32* buf0a, u32 buf0v, u32* buf0e, u16 control0, u32* buf1a, u32 buf1v, u32* buf1e, u16 control1)
gxCommand[6]=(u32)buf1e; //buf1 end addr
gxCommand[7]=(control0)|(control1<<16);
- return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand, NULL);
+ return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand);
}
// Flags, for applications this is 0x1001000 for the main screen, and 0x1000 for the sub screen.
gxCommand[5]=flags;
gxCommand[6]=gxCommand[7]=0x0;
- return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand, NULL);
+ return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand);
}
Result GX_SetTextureCopy(u32* inadr, u32 indim, u32* outadr, u32 outdim, u32 size, u32 flags)
gxCommand[6]=flags;
gxCommand[7]=0x0;
- return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand, NULL);
+ return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand);
}
Result GX_SetCommandList_First(u32* buf0a, u32 buf0s, u32* buf1a, u32 buf1s, u32* buf2a, u32 buf2s)
gxCommand[6]=(u32)buf2s; //buf2 size
gxCommand[7]=0x0;
- return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand, NULL);
+ return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand);
}
memset(&gspcapinfo, 0, sizeof(GSP_CaptureInfo));
// Get display-capture info from GSP.
- GSPGPU_ImportDisplayCaptureInfo(NULL, &gspcapinfo);
+ GSPGPU_ImportDisplayCaptureInfo(&gspcapinfo);
// Fill in display-capture info for NS.
if(gspcapinfo.screencapture[0].framebuf0_vaddr != gspcapinfo.screencapture[0].framebuf1_vaddr)ns_capinfo[1] = 1;
aptCloseSession();
// Save Vram
- GSPGPU_SaveVramSysArea(NULL);
+ GSPGPU_SaveVramSysArea();
// Capture screen.
memset(__ns_capinfo, 0, 0x20);
aptCloseSession();
// Release GSP module.
- GSPGPU_ReleaseRight(NULL);
+ GSPGPU_ReleaseRight();
// Jump to menu!
aptOpenSession();
{
aptAppletUtility_Exit_RetToApp(1);
- GSPGPU_AcquireRight(NULL, 0x0);
- GSPGPU_RestoreVramSysArea(NULL);
+ GSPGPU_AcquireRight(0x0);
+ GSPGPU_RestoreVramSysArea();
svcClearEvent(aptStatusEvent);
aptSetStatus(APP_RUNNING);
case APTSIGNAL_WAKEUP:
if(aptGetStatus() == APP_SLEEPMODE)
{
- if(aptStatusBeforeSleep == APP_RUNNING)GSPGPU_SetLcdForceBlack(NULL, 0);
+ if(aptStatusBeforeSleep == APP_RUNNING)GSPGPU_SetLcdForceBlack(0);
// Restore old aptStatus.
aptSetStatus(aptStatusBeforeSleep);
case 0xB: // Just returned from menu.
if (aptStatusMutex)
{
- GSPGPU_AcquireRight(NULL, 0x0);
- GSPGPU_RestoreVramSysArea(NULL);
+ GSPGPU_AcquireRight(0x0);
+ GSPGPU_RestoreVramSysArea();
aptAppletUtility_Exit_RetToApp(0);
aptSetStatus(APP_RUNNING);
} else
aptSetStatus(APP_SUSPENDED);
// Save Vram
- GSPGPU_SaveVramSysArea(NULL);
+ GSPGPU_SaveVramSysArea();
// Capture screen.
memset(__ns_capinfo, 0, 0x20);
aptCloseSession();
// Release GSP module.
- GSPGPU_ReleaseRight(NULL);
+ GSPGPU_ReleaseRight();
return 0;
}
static void gspEventThreadMain(void *arg);
-
-Result gspInit()
+Result gspInit(void)
{
return srvGetServiceHandle(&gspGpuHandle, "gsp::Gpu");
}
-void gspExit()
+void gspExit(void)
{
if(gspGpuHandle)svcCloseHandle(gspGpuHandle);
}
return svcCreateThread(&gspEventThread, gspEventThreadMain, 0x0, (u32*)((char*)gspEventStack + sizeof(gspEventStack)), 0x31, 0xfffffffe);
}
-void gspExitEventHandler()
+void gspExitEventHandler(void)
{
// Stop event thread
gspRunEvents = false;
svcExitThread();
}
-Result GSPGPU_WriteHWRegs(Handle* handle, u32 regAddr, u32* data, u8 size)
+Result GSPGPU_WriteHWRegs(u32 regAddr, u32* data, u8 size)
{
- if(!handle)handle=&gspGpuHandle;
-
if(size>0x80 || !data)return -1;
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[4]=(u32)data;
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_WriteHWRegsWithMask(Handle* handle, u32 regAddr, u32* data, u8 datasize, u32* maskdata, u8 masksize)
+Result GSPGPU_WriteHWRegsWithMask(u32 regAddr, u32* data, u8 datasize, u32* maskdata, u8 masksize)
{
- if(!handle)handle=&gspGpuHandle;
-
if(datasize>0x80 || !data)return -1;
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[6]=(u32)maskdata;
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_ReadHWRegs(Handle* handle, u32 regAddr, u32* data, u8 size)
+Result GSPGPU_ReadHWRegs(u32 regAddr, u32* data, u8 size)
{
- if(!handle)handle=&gspGpuHandle;
-
if(size>0x80 || !data)return -1;
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0x40+1]=(u32)data;
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_SetBufferSwap(Handle* handle, u32 screenid, GSP_FramebufferInfo *framebufinfo)
+Result GSPGPU_SetBufferSwap(u32 screenid, GSP_FramebufferInfo *framebufinfo)
{
- Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
- if(!handle)handle=&gspGpuHandle;
-
cmdbuf[0] = 0x00050200;
cmdbuf[1] = screenid;
memcpy(&cmdbuf[2], framebufinfo, sizeof(GSP_FramebufferInfo));
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ Result ret=0;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_FlushDataCache(Handle* handle, u8* adr, u32 size)
+Result GSPGPU_FlushDataCache(const void* adr, u32 size)
{
- if(!handle)handle=&gspGpuHandle;
-
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00080082; //request header code
cmdbuf[1]=(u32)adr;
cmdbuf[4]=0xffff8001;
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_InvalidateDataCache(Handle* handle, u8* adr, u32 size)
+Result GSPGPU_InvalidateDataCache(const void* adr, u32 size)
{
- Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
- if(!handle)handle=&gspGpuHandle;
-
cmdbuf[0] = 0x00090082;
cmdbuf[1] = (u32)adr;
cmdbuf[2] = size;
cmdbuf[3] = 0;
cmdbuf[4] = 0xFFFF8001;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ Result ret=0;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_SetLcdForceBlack(Handle* handle, u8 flags)
+Result GSPGPU_SetLcdForceBlack(u8 flags)
{
- if(!handle)handle=&gspGpuHandle;
-
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x000B0040; //request header code
cmdbuf[1]=flags;
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_TriggerCmdReqQueue(Handle* handle)
+Result GSPGPU_TriggerCmdReqQueue(void)
{
- if(!handle)handle=&gspGpuHandle;
-
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x000C0000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_RegisterInterruptRelayQueue(Handle* handle, Handle eventHandle, u32 flags, Handle* outMemHandle, u8* threadID)
+Result GSPGPU_RegisterInterruptRelayQueue(Handle eventHandle, u32 flags, Handle* outMemHandle, u8* threadID)
{
- if(!handle)handle=&gspGpuHandle;
-
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00130042; //request header code
cmdbuf[1]=flags;
cmdbuf[3]=eventHandle;
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
if(threadID)*threadID=cmdbuf[2];
if(outMemHandle)*outMemHandle=cmdbuf[4];
return cmdbuf[1];
}
-Result GSPGPU_UnregisterInterruptRelayQueue(Handle* handle)
+Result GSPGPU_UnregisterInterruptRelayQueue(void)
{
- if(!handle)handle=&gspGpuHandle;
-
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00140000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_AcquireRight(Handle* handle, u8 flags)
+Result GSPGPU_AcquireRight(u8 flags)
{
- if(!handle)handle=&gspGpuHandle;
-
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x160042; //request header code
cmdbuf[1]=flags;
cmdbuf[3]=0xffff8001;
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_ReleaseRight(Handle* handle)
+Result GSPGPU_ReleaseRight(void)
{
- if(!handle)handle=&gspGpuHandle;
-
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x170000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_ImportDisplayCaptureInfo(Handle* handle, GSP_CaptureInfo *captureinfo)
+Result GSPGPU_ImportDisplayCaptureInfo(GSP_CaptureInfo *captureinfo)
{
- if(!handle)handle=&gspGpuHandle;
-
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00180000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
ret = cmdbuf[1];
return ret;
}
-Result GSPGPU_SaveVramSysArea(Handle* handle)
+Result GSPGPU_SaveVramSysArea(void)
{
- if(!handle)handle=&gspGpuHandle;
-
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00190000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
-Result GSPGPU_RestoreVramSysArea(Handle* handle)
+Result GSPGPU_RestoreVramSysArea(void)
{
- if(!handle)handle=&gspGpuHandle;
-
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x001A0000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(*handle)))return ret;
+ if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
//essentially : get commandIndex and totalCommands, calculate offset of new command, copy command and update totalCommands
//use LDREX/STREX because this data may also be accessed by the GSP module and we don't want to break stuff
//(mostly, we could overwrite the buffer header with wrong data and make the GSP module reexecute old commands)
-Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8], Handle* handle)
+Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8])
{
if(!sharedGspCmdBuf || !gxCommand)return -1;
cmdBufHeader=((cmdBufHeader)&0xFFFF00FF)|((totalCommands<<8)&0xFF00);
}
- if(totalCommands==1)return GSPGPU_TriggerCmdReqQueue(handle);
+ if(totalCommands==1)return GSPGPU_TriggerCmdReqQueue();
return 0;
}