r300/compiler: Implement KILP opcode.

Signed-off-by: Marek Olšák <maraeo@gmail.com>
This commit is contained in:
Tom Stellard 2010-07-05 13:01:17 -07:00 committed by Marek Olšák
parent 88b6abfba5
commit ce929d8210
6 changed files with 43 additions and 1 deletions

View file

@ -71,7 +71,7 @@ static unsigned translate_opcode(unsigned opcode)
case TGSI_OPCODE_COS: return RC_OPCODE_COS;
case TGSI_OPCODE_DDX: return RC_OPCODE_DDX;
case TGSI_OPCODE_DDY: return RC_OPCODE_DDY;
/* case TGSI_OPCODE_KILP: return RC_OPCODE_KILP; */
case TGSI_OPCODE_KILP: return RC_OPCODE_KILP;
/* case TGSI_OPCODE_PK2H: return RC_OPCODE_PK2H; */
/* case TGSI_OPCODE_PK2US: return RC_OPCODE_PK2US; */
/* case TGSI_OPCODE_PK4B: return RC_OPCODE_PK4B; */

View file

@ -101,6 +101,10 @@ void r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c)
rewrite_depth_out(c);
/* This transformation needs to be done before any of the IF
* instructions are modified. */
radeonTransformKILP(&c->Base);
debug_program_log(c, "before compilation");
if (c->Base.is_r500){

View file

@ -399,6 +399,10 @@ struct rc_opcode_info rc_opcodes[MAX_RC_OPCODE] = {
{
.Opcode = RC_OPCODE_BEGIN_TEX,
.Name = "BEGIN_TEX"
},
{
.Opcode = RC_OPCODE_KILP,
.Name = "KILP",
}
};

View file

@ -199,6 +199,9 @@ typedef enum {
* can run simultaneously. */
RC_OPCODE_BEGIN_TEX,
/** Stop execution of the shader (GLSL discard) */
RC_OPCODE_KILP,
MAX_RC_OPCODE
} rc_opcode;

View file

@ -973,3 +973,32 @@ int radeonTransformDeriv(struct radeon_compiler* c,
return 1;
}
/**
* IF Temp[0].x -\
* KILP - > KIL -abs(Temp[0].x)
* ENDIF -/
*
* This needs to be done in its own pass, because it modifies the instructions
* before and after KILP.
*/
void radeonTransformKILP(struct radeon_compiler * c)
{
struct rc_instruction * inst;
for (inst = c->Program.Instructions.Next;
inst != &c->Program.Instructions; inst = inst->Next) {
if (inst->U.I.Opcode != RC_OPCODE_KILP
|| inst->Prev->U.I.Opcode != RC_OPCODE_IF
|| inst->Next->U.I.Opcode != RC_OPCODE_ENDIF) {
continue;
}
inst->U.I.Opcode = RC_OPCODE_KIL;
inst->U.I.SrcReg[0] = negate(absolute(inst->Prev->U.I.SrcReg[0]));
/* Remove IF */
rc_remove_instruction(inst->Prev);
/* Remove ENDIF */
rc_remove_instruction(inst->Next);
}
}

View file

@ -60,4 +60,6 @@ int radeonTransformDeriv(
struct rc_instruction * inst,
void*);
void radeonTransformKILP(struct radeon_compiler * c);
#endif /* __RADEON_PROGRAM_ALU_H_ */