]> Chaos Git - corbenik/ctrulib.git/commitdiff
SHDR : DVLE_SendConstants && SHDR_UseProgram
authorsmea <smealum@gmail.com>
Tue, 11 Mar 2014 21:50:07 +0000 (22:50 +0100)
committersmea <smealum@gmail.com>
Tue, 11 Mar 2014 21:50:07 +0000 (22:50 +0100)
libctru/include/ctr/SHDR.h
libctru/source/SHDR.c

index e819c3dd79c2f1609c59c7a6b2b3fa527e8095e0..34400bdad68196e10cf8fb1436890593a2629142 100644 (file)
@@ -49,11 +49,13 @@ typedef struct{
 
 
 DVLB_s* SHDR_ParseSHBIN(u32* shbinData, u32 shbinSize);
+void SHDR_UseProgram(DVLB_s* dvlb, u8 id);
 void SHDR_FreeDVLB(DVLB_s* dvlb);
 
 void DVLP_SendCode(DVLP_s* dvlp);
 void DVLP_SendOpDesc(DVLP_s* dvlp);
 
 void DVLE_SendOutmap(DVLE_s* dvle);
+void DVLE_SendConstants(DVLE_s* dvle);
 
 #endif
index e04d5d35244f6fa256ffbdb3ade28ea349230c4d..b644f8e427b8356717da8dfa1b9688c9bc5160fe 100644 (file)
@@ -117,6 +117,43 @@ void DVLE_SendOutmap(DVLE_s* dvle)
        GPUCMD_Add(0x800F0050, param, 0x00000007);
 }
 
+void DVLE_SendConstants(DVLE_s* dvle)
+{
+       if(!dvle)return;
+
+       u32 param[4];
+       u32 rev[3];
+       u8* rev8=(u8*)rev;
+
+       int i;
+       DVLE_constEntry_s* cnst=dvle->constTableData;
+       for(i=0;i<dvle->constTableSize;i++,cnst++)
+       {
+               memcpy(&rev8[0], &cnst->data[0], 3);
+               memcpy(&rev8[3], &cnst->data[1], 3);
+               memcpy(&rev8[6], &cnst->data[2], 3);
+               memcpy(&rev8[9], &cnst->data[3], 3);
+
+               param[0x0]=(cnst->header>>16)&0xFF;
+               param[0x1]=rev[2];
+               param[0x2]=rev[1];
+               param[0x3]=rev[0];
+
+               GPUCMD_Add(0x800F02C0, param, 0x00000004);
+       }
+}
+
+void SHDR_UseProgram(DVLB_s* dvlb, u8 id)
+{
+       if(!dvlb || id>dvlb->numDVLE)return;
+       DVLE_s* dvle=&dvlb->DVLE[id];
+
+       DVLP_SendCode(&dvlb->DVLP);
+       DVLP_SendOpDesc(&dvlb->DVLP);
+       DVLE_SendOutmap(dvle);
+       DVLE_SendConstants(dvle);
+}
+
 //TODO
 void SHDR_FreeDVLB(DVLB_s* dvlb)
 {