diff --git a/gpu/source/test.vsh b/gpu/source/test.vsh deleted file mode 100644 index e674bcd..0000000 --- a/gpu/source/test.vsh +++ /dev/null @@ -1,43 +0,0 @@ -; setup constants - .const 5, 0.0, 1.0, 2.0, 3.0 - -; setup outmap - .out o0, result.position - .out o1, result.color - .out o2, result.texcoord0 - .out o3, result.texcoord1 - .out o4, result.texcoord2 - -; setup uniform map (not required) - .uniform 0x10, 0x13, mdlvMtx - .uniform 0x14, 0x17, projMtx - -;code - main: - ; result.pos = mdlvMtx * in.pos - dp4 d40, d40, d00 (0x0) - dp4 d40, d41, d00 (0x1) - dp4 d40, d42, d00 (0x2) - mov d40, d25 (0x4) - ; result.pos = projMtx * in.pos - dp4 d00, d44, d40 (0x0) - dp4 d00, d45, d40 (0x1) - dp4 d00, d46, d40 (0x2) - dp4 d00, d47, d40 (0x3) - ; result.color = in.pos - mov d04, d25 (0x5) - ; result.texcoord = const - mov d08, d25 (0x5) - mov d0C, d25 (0x5) - mov d10, d25 (0x5) - flush - end - endmain: - -;operand descriptors - .opdesc x___, xyzw, xyzw ; 0x0 - .opdesc _y__, xyzw, xyzw ; 0x1 - .opdesc __z_, xyzw, xyzw ; 0x2 - .opdesc ___w, xyzw, xyzw ; 0x3 - .opdesc ___w, yyyy, xyzw ; 0x4 - .opdesc xyzw, xyzw, xyzw ; 0x5 diff --git a/libctru/source/SHDR.c b/libctru/source/SHDR.c index 60e5a0b..1b04e76 100644 --- a/libctru/source/SHDR.c +++ b/libctru/source/SHDR.c @@ -15,42 +15,55 @@ 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]; + } + goto exit; clean1: free(ret); exit: return ret; } +//hm +static inline minu8(u8 a, u8 b) +{ + if(acodeSize;i+=0x80)GPUCMD_Add(0x000F02CC, &dvlp->codeData[i], ((dvlp->codeSize-i)<0x80)?(dvlp->codeSize-i):0x80); + // for(i=0;icodeSize;i+=0x80)GPUCMD_Add(0x000F02CC, &dvlp->codeData[i], ((dvlp->codeSize-i)<0x80)?(dvlp->codeSize-i):0x80); + for(i=0;icodeSize;i+=0x80)GPUCMD_Add(0x000F02CC, &dvlp->codeData[i], maxu8(minu8(dvlp->codeSize-i,0x80),0x37)); //not sure why, but anything smaller than 0x37 seems to break stuff atm... GPUCMD_AddSingleParam(0x000F02BF, 0x00000001); } @@ -69,17 +83,24 @@ void DVLP_SendOpDesc(DVLP_s* dvlp) GPUCMD_AddSingleParam(0x000F02D5, 0x00000000); - GPUCMD_Add(0x000F02D6, dvlp->opcdescData, dvlp->opdescSize); + u32 param[0x20]; + + int i; + //TODO : should probably preprocess this + for(i=0;iopdescSize;i++)param[i]=dvlp->opcdescData[i*2]; + + GPUCMD_Add(0x000F02D6, param, dvlp->opdescSize); } void DVLE_SendOutmap(DVLE_s* dvle) { if(!dvle)return; - u32 param[0x8]={0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F, - 0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F}; + u32 param[0x7]={0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F, + 0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F}; int i; + //TODO : should probably preprocess this for(i=0;ioutTableSize;i++) { u32* out=¶m[dvle->outTableData[i].regID];