From 0761e6db1e6da459f5460fee7aea11e6bad66d4d Mon Sep 17 00:00:00 2001 From: smea Date: Sun, 9 Mar 2014 16:38:55 +0100 Subject: [PATCH] GPU : GPU_SetUniform --- libctru/include/ctr/GPU.h | 2 ++ libctru/include/ctr/SHDR.h | 9 +++++++ libctru/source/GPU.c | 8 +++++++ libctru/source/SHDR.c | 48 +++++++++++++++++++------------------- 4 files changed, 43 insertions(+), 24 deletions(-) diff --git a/libctru/include/ctr/GPU.h b/libctru/include/ctr/GPU.h index 7c9efb8..511b9a5 100644 --- a/libctru/include/ctr/GPU.h +++ b/libctru/include/ctr/GPU.h @@ -9,4 +9,6 @@ void GPUCMD_Add(u32 cmd, u32* param, u32 paramlength); void GPUCMD_AddSingleParam(u32 cmd, u32 param); void GPUCMD_Finalize(); +void GPU_SetUniform(u32 startreg, u32* data, u32 numreg); + #endif diff --git a/libctru/include/ctr/SHDR.h b/libctru/include/ctr/SHDR.h index e0712e0..e713036 100644 --- a/libctru/include/ctr/SHDR.h +++ b/libctru/include/ctr/SHDR.h @@ -47,4 +47,13 @@ typedef struct{ DVLE_s* DVLE; }DVLB_s; + +DVLB_s* SHDR_ParseSHBIN(u32* shbinData, u32 shbinSize); +void SHDR_FreeDVLB(DVLB_s* dvlb); + +void DVLP_SendCode(DVLP_s* dvlp); +void DVLP_SendOpDesc(DVLP_s* dvlp); + +void DVLE_SendOutmap(DVLE_s* dvle); + #endif diff --git a/libctru/source/GPU.c b/libctru/source/GPU.c index 09ec10e..3a51e68 100644 --- a/libctru/source/GPU.c +++ b/libctru/source/GPU.c @@ -69,3 +69,11 @@ void GPUCMD_Finalize() GPUCMD_AddSingleParam(0x000F0110, 0x00000001); GPUCMD_AddSingleParam(0x000F0010, 0x12345678); } + +void GPU_SetUniform(u32 startreg, u32* data, u32 numreg) +{ + if(!data)return; + + GPUCMD_AddSingleParam(0x000F02C0, 0x80000000|startreg); + GPUCMD_Add(0x000F02C1, data, numreg*4); +} diff --git a/libctru/source/SHDR.c b/libctru/source/SHDR.c index 9955380..60e5a0b 100644 --- a/libctru/source/SHDR.c +++ b/libctru/source/SHDR.c @@ -15,35 +15,35 @@ DVLB_s* SHDR_ParseSHBIN(u32* shbinData, u32 shbinSize) DVLB_s* ret=malloc(sizeof(DVLB_s)); if(!ret)goto exit; - //parse DVLB - ret->numDVLE=shbinData[1]; - ret->DVLE=malloc(sizeof(DVLE_s)*ret->numDVLE); - if(!ret->DVLE)goto clean1; + // //parse DVLB + // ret->numDVLE=shbinData[1]; + // ret->DVLE=malloc(sizeof(DVLE_s)*ret->numDVLE); + // if(!ret->DVLE)goto clean1; - //parse DVLP - u32* dvlpData=&shbinData[2+ret->numDVLE]; - ret->DVLP.codeSize=dvlpData[3]; - ret->DVLP.codeData=&dvlpData[dvlpData[2]/4]; - ret->DVLP.opdescSize=dvlpData[5]; - ret->DVLP.opcdescData=&dvlpData[dvlpData[4]/4]; + // //parse DVLP + // u32* dvlpData=&shbinData[2+ret->numDVLE]; + // ret->DVLP.codeSize=dvlpData[3]; + // ret->DVLP.codeData=&dvlpData[dvlpData[2]/4]; + // ret->DVLP.opdescSize=dvlpData[5]; + // ret->DVLP.opcdescData=&dvlpData[dvlpData[4]/4]; - //parse DVLE - int i; - for(i=0;inumDVLE;i++) - { - DVLE_s* dvle=&ret->DVLE[i]; - u32* dvleData=&shbinData[shbinData[2+i]/4]; + // //parse DVLE + // int i; + // for(i=0;inumDVLE;i++) + // { + // DVLE_s* dvle=&ret->DVLE[i]; + // u32* dvleData=&shbinData[shbinData[2+i]/4]; - dvle->type=(dvleData[1]>>16)&0xFF; - dvle->mainOffset=dvleData[2]; - dvle->endmainOffset=dvleData[3]; + // dvle->type=(dvleData[1]>>16)&0xFF; + // dvle->mainOffset=dvleData[2]; + // dvle->endmainOffset=dvleData[3]; - dvle->constTableSize=dvleData[7]; - dvle->constTableData=(DVLE_constEntry_s*)&dvleData[dvleData[6]/4]; + // dvle->constTableSize=dvleData[7]; + // dvle->constTableData=(DVLE_constEntry_s*)&dvleData[dvleData[6]/4]; - dvle->outTableSize=dvleData[11]; - dvle->outTableData=(DVLE_outEntry_s*)&dvleData[dvleData[10]/4]; - } + // dvle->outTableSize=dvleData[11]; + // dvle->outTableData=(DVLE_outEntry_s*)&dvleData[dvleData[10]/4]; + // } clean1: free(ret);