GSPGPU_WriteHWRegs(NULL, 0x400478, ®Data, 4);
}
-void copyBuffer()
-{
- //copy topleft FB
- u8 copiedBuffer=currentBuffer^1;
- u8* bufAdr=&gspHeap[0x46500*copiedBuffer];
- GSPGPU_FlushDataCache(NULL, bufAdr, 0x46500);
-
- GX_RequestDma(gxCmdBuf, (u32*)bufAdr, (u32*)topLeftFramebuffers[copiedBuffer], 0x46500);
-}
-
-s32 pcCos(u16 v)
-{
- return costable[v&0x1FF];
-}
-
-u32 cnt;
-
-void renderEffect()
-{
- u8* bufAdr=&gspHeap[0x46500*currentBuffer];
-
- int i, j;
- for(i=1;i<400;i++)
- {
- for(j=1;j<240;j++)
- {
- u32 v=(j+i*240)*3;
- bufAdr[v]=(pcCos(i+cnt)+4096)/32;
- bufAdr[v+1]=(pcCos(j-256+cnt)+4096)/64;
- bufAdr[v+2]=(pcCos(i+128-cnt)+4096)/32;
- }
- }
- cnt++;
-}
+u32 gpuCmd[0x100];
+u32 gpuCmdSize=0x100;
int main()
{
if(status==APP_RUNNING)
{
u32 PAD=hidSharedMem[7];
+ GPU_SetCommandBuffer(gpuCmd, gpuCmdSize, 0);
u32 regData=PAD|0x01000000;
GSPGPU_WriteHWRegs(NULL, 0x202A04, ®Data, 4);
- renderEffect();
+ GPU_RunCommandBuffer(gxCmdBuf);
+
swapBuffers();
- copyBuffer();
}
svc_sleepThread(16666666);
}
#define GPU_H
void GPU_Init(Handle *gsphandle);
+void GPU_SetCommandBuffer(u32* adr, u32 size, u32 offset);
+void GPU_RunCommandBuffer(u32* gxbuf);
+void GPU_AddCommand(u32* cmd, u32 length);
#endif
#include <ctr/GSP.h>
#include <ctr/svc.h>
-#define APT_HANDLER_STACKSIZE (0x10000)
+#define APT_HANDLER_STACKSIZE (0x1000)
NS_APPID currentAppId;
0x1EF00498, 0x18300000,
0x1EF00478, 0x18300000};
+u32* gpuCmdBuf;
+u32 gpuCmdBufSize;
+u32 gpuCmdBufOffset;
+
Result writeRegisterValues(Handle* handle, u32* table, u32 num)
{
if(!table || !num)return -1;
data=0x10501;
GSPGPU_WriteHWRegs(gsphandle, GSP_REBASE_REG(0x1EF00474), &data, 4);
+
+ gpuCmdBuf=NULL;
+ gpuCmdBufSize=0;
+ gpuCmdBufOffset=0;
+}
+
+void GPU_SetCommandBuffer(u32* adr, u32 size, u32 offset)
+{
+ gpuCmdBuf=adr;
+ gpuCmdBufSize=size;
+ gpuCmdBufOffset=offset;
+}
+
+void GPU_RunCommandBuffer(u32* gxbuf)
+{
+ GX_SetCommandList_Last(gxbuf, gpuCmdBuf, gpuCmdBufOffset*4, 0x3);
+}
+
+void GPU_AddCommand(u32* cmd, u32 length)
+{
+ if(!cmd || !gpuCmdBuf || gpuCmdBufOffset+length>gpuCmdBufSize)return;
+
+ memcpy(&gpuCmdBuf[gpuCmdBufOffset], cmd, length*4);
+ gpuCmdBufOffset+=length;
}
gxCommand[0]=0x01; //CommandID
gxCommand[1]=(u32)buf0a; //buf0 address
gxCommand[2]=(u32)buf0s; //buf0 size
- gxCommand[3]=flags&1;
+ gxCommand[3]=flags&1; //written to GSP module state
gxCommand[4]=gxCommand[5]=gxCommand[6]=0x0;
- gxCommand[7]=(flags>>1)&1;
+ gxCommand[7]=(flags>>1)&1; //when non-zero, call svcFlushProcessDataCache() with the specified buffer
return GSPGPU_submitGxCommand(gxbuf, gxCommand, NULL);
}