[Mesa-dev] [PATCH] r300/compiler: Implement KILP opcode.
Marek Olšák
maraeo at gmail.com
Mon Jul 5 16:34:32 PDT 2010
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 <tstellar at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20100706/1804579f/attachment-0001.html>
More information about the mesa-dev
mailing list