From 9bd8f1079a0cb9b4cd6da557a684819b2cd45c1f Mon Sep 17 00:00:00 2001 From: smea Date: Tue, 11 Mar 2014 22:50:07 +0100 Subject: [PATCH] SHDR : DVLE_SendConstants && SHDR_UseProgram --- libctru/include/ctr/SHDR.h | 2 ++ libctru/source/SHDR.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/libctru/include/ctr/SHDR.h b/libctru/include/ctr/SHDR.h index e819c3d..34400bd 100644 --- a/libctru/include/ctr/SHDR.h +++ b/libctru/include/ctr/SHDR.h @@ -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 diff --git a/libctru/source/SHDR.c b/libctru/source/SHDR.c index e04d5d3..b644f8e 100644 --- a/libctru/source/SHDR.c +++ b/libctru/source/SHDR.c @@ -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;iconstTableSize;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) {