From 1c2d235c645c3c6aca694d6376fc1e7a0b72074b Mon Sep 17 00:00:00 2001 From: smea Date: Wed, 19 Mar 2014 23:23:53 +0100 Subject: [PATCH] GSP : critical fix in GSPGPU_submitGxCommand GX : updated GX_SetMemoryFill GPU : various crap --- libctru/include/ctr/GX.h | 2 +- libctru/source/GPU.c | 6 ++++-- libctru/source/GSP.c | 2 +- libctru/source/GX.c | 13 +++++++------ 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/libctru/include/ctr/GX.h b/libctru/include/ctr/GX.h index 45e3e3c..ad9e941 100644 --- a/libctru/include/ctr/GX.h +++ b/libctru/include/ctr/GX.h @@ -5,7 +5,7 @@ Result GX_RequestDma(u32* gxbuf, u32* src, u32* dst, u32 length); Result GX_SetCommandList_Last(u32* gxbuf, u32* buf0a, u32 buf0s, u8 flags); -Result GX_SetMemoryFill(u32* gxbuf, u32* buf0a, u32 buf0s, u32 buf0d, u16 width0, u32* buf1a, u32 buf1s, u32 buf1d, u16 width1); +Result GX_SetMemoryFill(u32* gxbuf, u32* buf0a, u32 buf0v, u32* buf0e, u16 width0, u32* buf1a, u32 buf1v, u32* buf1e, u16 width1); Result GX_SetDisplayTransfer(u32* gxbuf, u32* inadr, u32 indim, u32* outadr, u32 outdim, u32 flags); Result GX_SetTextureCopy(u32* gxbuf, u32* inadr, u32 indim, u32* outadr, u32 outdim, u32 size, u32 flags); Result GX_SetCommandList_First(u32* gxbuf, u32* buf0a, u32 buf0s, u32* buf1a, u32 buf1s, u32* buf2a, u32 buf2s); diff --git a/libctru/source/GPU.c b/libctru/source/GPU.c index 6c8ca5d..f066e3f 100644 --- a/libctru/source/GPU.c +++ b/libctru/source/GPU.c @@ -150,6 +150,7 @@ void GPU_Reset(u32* gxbuf, u32* gpuBuf, u32 gpuBufSize) GPUCMD_AddSingleParam(0x000F0112, 0x0000000F); GPUCMD_AddSingleParam(0x000F0114, 0x00000003); GPUCMD_AddSingleParam(0x000F0115, 0x00000003); + GPUCMD_AddSingleParam(0x000F01C5, 0x00000000); for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008); @@ -201,6 +202,7 @@ void GPU_SetUniform(u32 startreg, u32* data, u32 numreg) u32 f32tof24(float f) { + if(!f)return 0; u32 v=*((u32*)&f); u8 s=v>>31; u32 exp=((v>>23)&0xFF)-0x40; @@ -251,8 +253,8 @@ void GPU_SetViewport(u32* depthBuffer, u32* colorBuffer, u32 x, u32 y, u32 w, u3 GPUCMD_Add(0x800F011C, param, 0x00000003); GPUCMD_AddSingleParam(0x000F006E, f116e); - GPUCMD_AddSingleParam(0x000F0116, 0x00000003); //? - GPUCMD_AddSingleParam(0x000F0117, 0x00000002); //? + GPUCMD_AddSingleParam(0x000F0116, 0x00000003); //depth format + GPUCMD_AddSingleParam(0x000F0117, 0x00000002); //color format GPUCMD_AddSingleParam(0x000F011B, 0x00000000); //? param[0x0]=f32tof24(fw/2); diff --git a/libctru/source/GSP.c b/libctru/source/GSP.c index 8e59b0d..c71e107 100644 --- a/libctru/source/GSP.c +++ b/libctru/source/GSP.c @@ -214,7 +214,7 @@ Result GSPGPU_submitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8], Handle* __asm__ ("ldrex %[result], [%[adr]]" : [result] "=r" (cmdBufHeader) : [adr] "r" (sharedGspCmdBuf)); totalCommands=((cmdBufHeader&0xFF00)>>8)+1; - cmdBufHeader=((cmdBufHeader)&0xFFFF00FF)|((totalCommands<<8)|0xFF00); + cmdBufHeader=((cmdBufHeader)&0xFFFF00FF)|((totalCommands<<8)&0xFF00); } if(totalCommands==1)return GSPGPU_TriggerCmdReqQueue(handle); diff --git a/libctru/source/GX.c b/libctru/source/GX.c index 1767b1f..4af70e3 100644 --- a/libctru/source/GX.c +++ b/libctru/source/GX.c @@ -31,16 +31,17 @@ Result GX_SetCommandList_Last(u32* gxbuf, u32* buf0a, u32 buf0s, u8 flags) return GSPGPU_submitGxCommand(gxbuf, gxCommand, NULL); } -Result GX_SetMemoryFill(u32* gxbuf, u32* buf0a, u32 buf0s, u32 buf0d, u16 width0, u32* buf1a, u32 buf1s, u32 buf1d, u16 width1) +Result GX_SetMemoryFill(u32* gxbuf, u32* buf0a, u32 buf0v, u32* buf0e, u16 width0, u32* buf1a, u32 buf1v, u32* buf1e, u16 width1) { u32 gxCommand[0x8]; - gxCommand[0]=0x02; //CommandID + // gxCommand[0]=0x02; //CommandID + gxCommand[0]=0x01000102; //CommandID gxCommand[1]=(u32)buf0a; //buf0 address - gxCommand[2]=buf0s; //buf0 size - gxCommand[3]=buf0d; //buf0 data + gxCommand[2]=buf0v; //buf0 value + gxCommand[3]=(u32*)buf0e; //buf0 end addr gxCommand[4]=(u32)buf1a; //buf1 address - gxCommand[5]=buf1s; //buf1 size - gxCommand[6]=buf1d; //buf1 data + gxCommand[5]=buf1v; //buf1 value + gxCommand[6]=(u32*)buf1e; //buf1 end addr gxCommand[7]=(width0)|(width1<<16); return GSPGPU_submitGxCommand(gxbuf, gxCommand, NULL);