bool IsRegisterReadValid( PhaseType phase, int param )
{
bool passed = true; // assume everything will go alright
// if in phase 2 ALU and argument is a source
if ( ( phase == PhaseType.PHASE2ALU ) && ( param > 0 ) )
{
// is source argument a temp register r0 - r5?
if ( ( opParams[ param ].Arg >= Gl.GL_REG_0_ATI ) && ( opParams[ param ].Arg <= Gl.GL_REG_5_ATI ) )
{
int reg_offset = opParams[ param ].Arg - Gl.GL_REG_0_ATI;
// if register was not written to in phase 2 but was in phase 1
if ( ( Phase_RegisterUsage[ reg_offset ].Phase2Write == false ) && Phase_RegisterUsage[ reg_offset ].Phase1Write )
{
// only perform register pass if there are ALU instructions in phase 1
if ( phase1ALU_mi.Count > 0 )
{
// build machine instructions for passing a register from phase 1 to phase 2
// NB: only rgb components of register will get passed
AddMachineInst( PhaseType.PHASE2TEX, (int)MachineInstruction.PassTexCoord );
AddMachineInst( PhaseType.PHASE2TEX, opParams[ param ].Arg ); // dst
AddMachineInst( PhaseType.PHASE2TEX, opParams[ param ].Arg ); // coord
AddMachineInst( PhaseType.PHASE2TEX, Gl.GL_SWIZZLE_STR_ATI ); // swizzle
// mark register as being written to
Phase_RegisterUsage[ reg_offset ].Phase2Write = true;
}
}
// register can not be used because it has not been written to previously
else
{
passed = false;
}
}
}
return passed;
}