1. There are trailing whitespaces. 2. I would rather use Negate(Abs(cond)) in case we get negative numbers there.
-Marek On Mon, Jul 5, 2010 at 10:01 PM, Tom Stellard <tstel...@gmail.com> wrote: > --- > src/gallium/drivers/r300/r300_tgsi_to_rc.c | 2 +- > src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c | 4 ++ > .../drivers/dri/r300/compiler/radeon_opcodes.c | 4 ++ > .../drivers/dri/r300/compiler/radeon_opcodes.h | 3 ++ > .../drivers/dri/r300/compiler/radeon_program_alu.c | 30 > ++++++++++++++++++++ > .../drivers/dri/r300/compiler/radeon_program_alu.h | 2 + > 6 files changed, 44 insertions(+), 1 deletions(-) > > diff --git a/src/gallium/drivers/r300/r300_tgsi_to_rc.c > b/src/gallium/drivers/r300/r300_tgsi_to_rc.c > index 5394e04..d31cf7e 100644 > --- a/src/gallium/drivers/r300/r300_tgsi_to_rc.c > +++ b/src/gallium/drivers/r300/r300_tgsi_to_rc.c > @@ -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; */ > diff --git a/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c > b/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c > index b53571a..32a369b 100644 > --- a/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c > +++ b/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c > @@ -100,6 +100,10 @@ void r3xx_compile_fragment_program(struct > r300_fragment_program_compiler* c) > struct emulate_loop_state loop_state; > > 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"); > > diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c > b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c > index 128745a..04f234f 100644 > --- a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c > +++ b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c > @@ -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", > } > }; > > diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.h > b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.h > index e103ce5..8b9fa07 100644 > --- a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.h > +++ b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.h > @@ -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; > > diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c > b/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c > index c922d3d..78c2d99 100644 > --- a/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c > +++ b/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c > @@ -973,3 +973,33 @@ int radeonTransformDeriv(struct radeon_compiler* c, > > return 1; > } > + > +/** > + * IF Temp[0].x -\ > + * KILP - > KIL -Temp[0].x > + * ENDIF -/ > + * > + * This needs to be done in its own pass, because it modifies the > instructions > + * before and after KILP. > + */ > +int radeonTransformKILP(struct radeon_compiler * c) > +{ > + struct rc_instruction * inst; > + for(inst = c->Program.Instructions.Next; > + inst != &c->Program.Instructions; inst = > inst->Next){ > + > + struct rc_instruction * inst_cond; > + 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(inst->Prev->U.I.SrcReg[0]); > + > + /* Remove IF */ > + rc_remove_instruction(inst->Prev); > + /* Remove ENDIF */ > + rc_remove_instruction(inst->Next); > + } > +} > diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.h > b/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.h > index 77d4444..4aa084f 100644 > --- a/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.h > +++ b/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.h > @@ -60,4 +60,6 @@ int radeonTransformDeriv( > struct rc_instruction * inst, > void*); > > +int radeonTransformKILP(struct radeon_compiler * c); > + > #endif /* __RADEON_PROGRAM_ALU_H_ */ > -- > 1.7.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev