[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