]> Chaos Git - corbenik/ctrulib.git/commitdiff
Added GSPGPU code for SetBufferSwap and InvalidateDataCache.
authoryellows8 <yellowstar6@gmail.com>
Wed, 23 Apr 2014 00:18:21 +0000 (20:18 -0400)
committeryellows8 <yellowstar6@gmail.com>
Wed, 23 Apr 2014 00:18:21 +0000 (20:18 -0400)
libctru/include/ctr/GSP.h
libctru/source/GSP.c

index b38bd23767ce5bedb0d9fb84218fa703c2d95640..3b16f2eff6306c4b67f805548b1fc2958f6e0392 100644 (file)
@@ -3,13 +3,26 @@
 
 #define GSP_REBASE_REG(r) ((r)-0x1EB00000)
 
+typedef struct
+{
+       u32 active_framebuf;//"0=first, 1=second"
+       u32 *framebuf0_vaddr;//"Framebuffer virtual address, for the main screen this is the 3D left framebuffer"
+       u32 *framebuf1_vaddr;//"For the main screen: 3D right framebuffer address"
+       u32 framebuf_widthbytesize;//"Value for 0x1EF00X90, controls framebuffer width"
+       u32 format;//"Framebuffer format, this u16 is written to the low u16 for LCD register 0x1EF00X70."
+       u32 framebuf_dispselect;//"Value for 0x1EF00X78, controls which framebuffer is displayed"
+       u32 unk;//"?"
+} GSP_FramebufferInfo;
+
 Result gspInit();
 void gspExit();
 
 Result GSPGPU_AcquireRight(Handle *handle, u8 flags);
 Result GSPGPU_ReleaseRight(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);
index c71e1079441adae0e9a1b1f0c5a15a2bb8d80d6e..ea557eb198cda101830b707c1dd6c66fe4ad24dd 100644 (file)
@@ -61,6 +61,22 @@ Result GSPGPU_SetLcdForceBlack(Handle* handle, u8 flags)
        return cmdbuf[1];
 }
 
+Result GSPGPU_SetBufferSwap(Handle* handle, 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=svc_sendSyncRequest(*handle)))return ret;
+
+       return cmdbuf[1];
+}
+
 Result GSPGPU_FlushDataCache(Handle* handle, u8* adr, u32 size)
 {
        if(!handle)handle=&gspGpuHandle;
@@ -78,6 +94,24 @@ Result GSPGPU_FlushDataCache(Handle* handle, u8* adr, u32 size)
        return cmdbuf[1];
 }
 
+Result GSPGPU_InvalidateDataCache(Handle* handle, u8 *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=svc_sendSyncRequest(*handle)))return ret;
+
+       return cmdbuf[1];
+}
+
 Result GSPGPU_WriteHWRegs(Handle* handle, u32 regAddr, u32* data, u8 size)
 {
        if(!handle)handle=&gspGpuHandle;