From f052d22cebe743f2dc0f90708fbf62a130d2e303 Mon Sep 17 00:00:00 2001 From: fincs Date: Tue, 1 Dec 2015 13:22:34 +0100 Subject: [PATCH] shaderProgram: manage GPUREG_SH_OUTATTR_MODE/CLOCK --- libctru/include/3ds/gpu/shbin.h | 2 ++ libctru/source/gpu/shaderProgram.c | 8 +++---- libctru/source/gpu/shbin.c | 35 ++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/libctru/include/3ds/gpu/shbin.h b/libctru/include/3ds/gpu/shbin.h index d518fc9..c53b272 100644 --- a/libctru/include/3ds/gpu/shbin.h +++ b/libctru/include/3ds/gpu/shbin.h @@ -76,6 +76,8 @@ typedef struct{ char* symbolTableData; ///< Symbol table data. u8 outmapMask; ///< Output map mask. u32 outmapData[8]; ///< Output map data. + u32 outmapMode; ///< Output map mode. + u32 outmapClock; ///< Output map attribute clock. }DVLE_s; /// DVLB data. diff --git a/libctru/source/gpu/shaderProgram.c b/libctru/source/gpu/shaderProgram.c index 876332b..a891dcb 100644 --- a/libctru/source/gpu/shaderProgram.c +++ b/libctru/source/gpu/shaderProgram.c @@ -220,8 +220,8 @@ Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGs // finish setting up vertex shader alone GPU_SetShaderOutmap((u32*)vshDvle->outmapData); - GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, 0x00000001); // ? - GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, 0x00000703); // ? + GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, vshDvle->outmapMode); + GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, vshDvle->outmapClock); }else{ // setup both vertex and geometry shader const DVLE_s* gshDvle = sp->geometryShader->dvle; @@ -240,8 +240,8 @@ Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGs GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0x08000000|(sp->geoShaderInputStride-1)); GPUCMD_AddIncrementalWrites(GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW, sp->geoShaderInputPermutation, 2); - GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, 0x00000001); // ? - GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, 0x01030703); // ? + GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, gshDvle->outmapMode); + GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, gshDvle->outmapClock); } return 0; diff --git a/libctru/source/gpu/shbin.c b/libctru/source/gpu/shbin.c index d6f66dc..5209c3c 100644 --- a/libctru/source/gpu/shbin.c +++ b/libctru/source/gpu/shbin.c @@ -97,6 +97,8 @@ void DVLE_GenerateOutmap(DVLE_s* dvle) u8 numAttr=0; u8 maxAttr=0; u8 attrMask=0; + u32 attrMode=0; + u32 attrClock=0; for(i=0;ioutTableSize;i++) { @@ -124,10 +126,43 @@ void DVLE_GenerateOutmap(DVLE_s* dvle) } *out=((*out)&~mask)|(val&mask); + switch(dvle->outTableData[i].type) + { + case RESULT_POSITION: + if ((*out & 0xFF0000)==0x020000) + attrClock |= BIT(0); + break; + case RESULT_COLOR: + attrClock |= BIT(1); + break; + case RESULT_TEXCOORD0: + attrMode = 1; + attrClock |= BIT(8); + break; + case RESULT_TEXCOORD1: + attrMode = 1; + attrClock |= BIT(9); + break; + case RESULT_TEXCOORD2: + attrMode = 1; + attrClock |= BIT(10); + break; + case RESULT_TEXCOORD0W: + attrMode = 1; + attrClock |= BIT(16); + break; + case RESULT_NORMALQUAT: + case RESULT_VIEW: + attrClock |= BIT(24); + break; + } + attrMask|=1<outTableData[i].regID; if(dvle->outTableData[i].regID+1>maxAttr)maxAttr=dvle->outTableData[i].regID+1; } dvle->outmapData[0]=numAttr; dvle->outmapMask=attrMask; + dvle->outmapMode=attrMode; + dvle->outmapClock=attrClock; }