From d5ac7a7cb0955f5cc07b968a5837fa7dfa680665 Mon Sep 17 00:00:00 2001 From: smea Date: Sun, 24 Aug 2014 21:01:21 -0700 Subject: [PATCH] minor GSP adjustments --- libctru/include/3ds/GSP.h | 9 ++ libctru/source/services/gsp.c | 178 +++++++++++++++++----------------- 2 files changed, 98 insertions(+), 89 deletions(-) diff --git a/libctru/include/3ds/GSP.h b/libctru/include/3ds/GSP.h index b0c3410..faf2ca8 100644 --- a/libctru/include/3ds/GSP.h +++ b/libctru/include/3ds/GSP.h @@ -14,6 +14,15 @@ typedef struct u32 unk;//"?" } GSP_FramebufferInfo; +typedef enum +{ + GSP_RGBA8_OES=0, + GSP_BGR8_OES=1, + GSP_RGB565_OES=2, + GSP_RGB5_A1_OES=3, + GSP_RGBA4_OES=4 +}GSP_FramebufferFormats; + typedef struct//See this for GSP_CaptureInfoEntry and GSP_CaptureInfo: http://3dbrew.org/wiki/GSPGPU:ImportDisplayCaptureInfo { u32 *framebuf0_vaddr; diff --git a/libctru/source/services/gsp.c b/libctru/source/services/gsp.c index fcdb272..1e96a90 100644 --- a/libctru/source/services/gsp.c +++ b/libctru/source/services/gsp.c @@ -101,28 +101,18 @@ void gspEventThreadMain(u32 arg) svcExitThread(); } -Result GSPGPU_AcquireRight(Handle* handle, u8 flags) +Result GSPGPU_WriteHWRegs(Handle* handle, u32 regAddr, u32* data, u8 size) { if(!handle)handle=&gspGpuHandle; - u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0x160042; //request header code - cmdbuf[1]=flags; - cmdbuf[2]=0x0; - cmdbuf[3]=0xffff8001; - - Result ret=0; - if((ret=svcSendSyncRequest(*handle)))return ret; - - return cmdbuf[1]; -} + if(size>0x80 || !data)return -1; -Result GSPGPU_ReleaseRight(Handle* handle) -{ - if(!handle)handle=&gspGpuHandle; - u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0x170000; //request header code + cmdbuf[0]=0x00010082; //request header code + cmdbuf[1]=regAddr; + cmdbuf[2]=size; + cmdbuf[3]=(size<<14)|2; + cmdbuf[4]=(u32)data; Result ret=0; if((ret=svcSendSyncRequest(*handle)))return ret; @@ -130,32 +120,20 @@ Result GSPGPU_ReleaseRight(Handle* handle) return cmdbuf[1]; } -Result GSPGPU_ImportDisplayCaptureInfo(Handle* handle, GSP_CaptureInfo *captureinfo) +Result GSPGPU_WriteHWRegsWithMask(Handle* handle, u32 regAddr, u32* data, u8 datasize, u32* maskdata, u8 masksize) { if(!handle)handle=&gspGpuHandle; - u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0x00180000; //request header code - - Result ret=0; - if((ret=svcSendSyncRequest(*handle)))return ret; - - ret = cmdbuf[1]; - - if(ret==0) - { - memcpy(captureinfo, &cmdbuf[2], 0x20); - } - - return ret; -} + if(datasize>0x80 || !data)return -1; -Result GSPGPU_SaveVramSysArea(Handle* handle) -{ - if(!handle)handle=&gspGpuHandle; - u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0x00190000; //request header code + cmdbuf[0]=0x00020084; //request header code + cmdbuf[1]=regAddr; + cmdbuf[2]=datasize; + cmdbuf[3]=(datasize<<14)|2; + cmdbuf[4]=(u32)data; + cmdbuf[5]=(masksize<<14)|0x402; + cmdbuf[6]=(u32)maskdata; Result ret=0; if((ret=svcSendSyncRequest(*handle)))return ret; @@ -163,26 +141,18 @@ Result GSPGPU_SaveVramSysArea(Handle* handle) return cmdbuf[1]; } -Result GSPGPU_RestoreVramSysArea(Handle* handle) +Result GSPGPU_ReadHWRegs(Handle* handle, u32 regAddr, u32* data, u8 size) { if(!handle)handle=&gspGpuHandle; - u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0x001A0000; //request header code - - Result ret=0; - if((ret=svcSendSyncRequest(*handle)))return ret; - - return cmdbuf[1]; -} + if(size>0x80 || !data)return -1; -Result GSPGPU_SetLcdForceBlack(Handle* handle, u8 flags) -{ - if(!handle)handle=&gspGpuHandle; - u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0xB0040; //request header code - cmdbuf[1]=flags; + cmdbuf[0]=0x00040080; //request header code + cmdbuf[1]=regAddr; + cmdbuf[2]=size; + cmdbuf[0x40]=(size<<14)|2; + cmdbuf[0x40+1]=(u32)data; Result ret=0; if((ret=svcSendSyncRequest(*handle)))return ret; @@ -211,7 +181,7 @@ Result GSPGPU_FlushDataCache(Handle* handle, u8* adr, u32 size) if(!handle)handle=&gspGpuHandle; u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0x80082; //request header code + cmdbuf[0]=0x00080082; //request header code cmdbuf[1]=(u32)adr; cmdbuf[2]=size; cmdbuf[3]=0x0; @@ -241,18 +211,13 @@ Result GSPGPU_InvalidateDataCache(Handle* handle, u8* adr, u32 size) return cmdbuf[1]; } -Result GSPGPU_WriteHWRegs(Handle* handle, u32 regAddr, u32* data, u8 size) +Result GSPGPU_SetLcdForceBlack(Handle* handle, u8 flags) { if(!handle)handle=&gspGpuHandle; - if(size>0x80 || !data)return -1; - u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0x10082; //request header code - cmdbuf[1]=regAddr; - cmdbuf[2]=size; - cmdbuf[3]=(size<<14)|2; - cmdbuf[4]=(u32)data; + cmdbuf[0]=0x000B0040; //request header code + cmdbuf[1]=flags; Result ret=0; if((ret=svcSendSyncRequest(*handle)))return ret; @@ -260,20 +225,12 @@ Result GSPGPU_WriteHWRegs(Handle* handle, u32 regAddr, u32* data, u8 size) return cmdbuf[1]; } -Result GSPGPU_WriteHWRegsWithMask(Handle* handle, u32 regAddr, u32* data, u8 datasize, u32* maskdata, u8 masksize) +Result GSPGPU_TriggerCmdReqQueue(Handle* handle) { if(!handle)handle=&gspGpuHandle; - if(datasize>0x80 || !data)return -1; - u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0x20084; //request header code - cmdbuf[1]=regAddr; - cmdbuf[2]=datasize; - cmdbuf[3]=(datasize<<14)|2; - cmdbuf[4]=(u32)data; - cmdbuf[5]=(masksize<<14)|0x402; - cmdbuf[6]=(u32)maskdata; + cmdbuf[0]=0x000C0000; //request header code Result ret=0; if((ret=svcSendSyncRequest(*handle)))return ret; @@ -281,63 +238,106 @@ Result GSPGPU_WriteHWRegsWithMask(Handle* handle, u32 regAddr, u32* data, u8 dat return cmdbuf[1]; } -Result GSPGPU_ReadHWRegs(Handle* handle, u32 regAddr, u32* data, u8 size) +Result GSPGPU_RegisterInterruptRelayQueue(Handle* handle, Handle eventHandle, u32 flags, Handle* outMemHandle, u8* threadID) { if(!handle)handle=&gspGpuHandle; - if(size>0x80 || !data)return -1; - u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0x40080; //request header code - cmdbuf[1]=regAddr; - cmdbuf[2]=size; - cmdbuf[0x40]=(size<<14)|2; - cmdbuf[0x40+1]=(u32)data; + cmdbuf[0]=0x00130042; //request header code + cmdbuf[1]=flags; + cmdbuf[2]=0x0; + cmdbuf[3]=eventHandle; Result ret=0; if((ret=svcSendSyncRequest(*handle)))return ret; + if(threadID)*threadID=cmdbuf[2]; + if(outMemHandle)*outMemHandle=cmdbuf[4]; + return cmdbuf[1]; } -Result GSPGPU_RegisterInterruptRelayQueue(Handle* handle, Handle eventHandle, u32 flags, Handle* outMemHandle, u8* threadID) +Result GSPGPU_UnregisterInterruptRelayQueue(Handle* handle) +{ + if(!handle)handle=&gspGpuHandle; + + u32* cmdbuf=getThreadCommandBuffer(); + cmdbuf[0]=0x00140000; //request header code + + Result ret=0; + if((ret=svcSendSyncRequest(*handle)))return ret; + + return cmdbuf[1]; +} + +Result GSPGPU_AcquireRight(Handle* handle, u8 flags) { if(!handle)handle=&gspGpuHandle; u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0x130042; //request header code + cmdbuf[0]=0x160042; //request header code cmdbuf[1]=flags; cmdbuf[2]=0x0; - cmdbuf[3]=eventHandle; + cmdbuf[3]=0xffff8001; Result ret=0; if((ret=svcSendSyncRequest(*handle)))return ret; - if(threadID)*threadID=cmdbuf[2]; - if(outMemHandle)*outMemHandle=cmdbuf[4]; + return cmdbuf[1]; +} + +Result GSPGPU_ReleaseRight(Handle* handle) +{ + if(!handle)handle=&gspGpuHandle; + u32* cmdbuf=getThreadCommandBuffer(); + cmdbuf[0]=0x170000; //request header code + + Result ret=0; + if((ret=svcSendSyncRequest(*handle)))return ret; + return cmdbuf[1]; } -Result GSPGPU_UnregisterInterruptRelayQueue(Handle* handle) +Result GSPGPU_ImportDisplayCaptureInfo(Handle* handle, GSP_CaptureInfo *captureinfo) { if(!handle)handle=&gspGpuHandle; u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0x00140000; //request header code + cmdbuf[0]=0x00180000; //request header code Result ret=0; if((ret=svcSendSyncRequest(*handle)))return ret; + + ret = cmdbuf[1]; + + if(ret==0) + { + memcpy(captureinfo, &cmdbuf[2], 0x20); + } + + return ret; +} + +Result GSPGPU_SaveVramSysArea(Handle* handle) +{ + if(!handle)handle=&gspGpuHandle; + u32* cmdbuf=getThreadCommandBuffer(); + cmdbuf[0]=0x00190000; //request header code + + Result ret=0; + if((ret=svcSendSyncRequest(*handle)))return ret; + return cmdbuf[1]; } -Result GSPGPU_TriggerCmdReqQueue(Handle* handle) +Result GSPGPU_RestoreVramSysArea(Handle* handle) { if(!handle)handle=&gspGpuHandle; u32* cmdbuf=getThreadCommandBuffer(); - cmdbuf[0]=0xC0000; //request header code + cmdbuf[0]=0x001A0000; //request header code Result ret=0; if((ret=svcSendSyncRequest(*handle)))return ret; -- 2.39.5