shaderProgram: manage GPUREG_SH_OUTATTR_MODE/CLOCK
This commit is contained in:
parent
f7798302ea
commit
f052d22ceb
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user