shaderProgram: manage GPUREG_SH_OUTATTR_MODE/CLOCK

This commit is contained in:
fincs 2015-12-01 13:22:34 +01:00
parent f7798302ea
commit f052d22ceb
3 changed files with 41 additions and 4 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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;i<dvle->outTableSize;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<<dvle->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;
}