]> Chaos Git - corbenik/ctrulib.git/commitdiff
GSP : critical fix in GSPGPU_submitGxCommand
authorsmea <smealum@gmail.com>
Wed, 19 Mar 2014 22:23:53 +0000 (23:23 +0100)
committersmea <smealum@gmail.com>
Wed, 19 Mar 2014 22:23:53 +0000 (23:23 +0100)
GX : updated GX_SetMemoryFill
GPU : various crap

libctru/include/ctr/GX.h
libctru/source/GPU.c
libctru/source/GSP.c
libctru/source/GX.c

index 45e3e3cea313834252599146667244a805dd63ff..ad9e9412027f78cd7527ea486cd8cc9d5ffb2626 100644 (file)
@@ -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);
index 6c8ca5dde0468281a230db7b55b5d8750a8249ce..f066e3f317a53616023b94ef5b235ac6c6393cb9 100644 (file)
@@ -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);
index 8e59b0d92d77e59e739b94171f8f9c2d16a719fa..c71e1079441adae0e9a1b1f0c5a15a2bb8d80d6e 100644 (file)
@@ -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);
index 1767b1f050175156fdc89884efce45dd8e3654a3..4af70e334b3985d34150a7c7d20c0c5033beff7a 100644 (file)
@@ -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);