[Mesa-dev] [PATCH 02/23] i965/fs: Optimize (gl_FrontFacing ? x : y) where x and y are ±1.0.

Abdiel Janulgue abdiel.janulgue at linux.intel.com
Thu Mar 26 02:11:01 PDT 2015


On 03/20/2015 10:58 PM, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> This is like Matt's earlier patch, but it enables the optimization for
> ir_triop_csel.
>
> There are no shader-db changes now, but this prevents a large number of
> regressions from a later commit (glsl: Optimize certain if-statements to
> ir_triop_csel).
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> Cc: Abdiel Janulgue <abdiel.janulgue at intel.com>


The refactor looks good to me.

Patch 1 and 2 are:

Reviewed-by: Abdiel Janulgue <abdiel.janulgue at linux.intel.com>

> ---
>   src/mesa/drivers/dri/i965/brw_fs.h           |  1 +
>   src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 34 ++++++++++++++++++++++++++++
>   2 files changed, 35 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
> index 8317831..c63f7db 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -313,6 +313,7 @@ public:
>      bool try_emit_mad(ir_expression *ir);
>      bool try_replace_with_sel();
>      bool try_opt_frontfacing_ternary(ir_if *ir);
> +   bool try_opt_frontfacing_ternary(ir_expression *ir);
>      bool opt_peephole_sel();
>      bool opt_peephole_predicated_break();
>      bool opt_saturate_propagation();
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index 3388098..2f1d49c 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -708,6 +708,9 @@ fs_visitor::visit(ir_expression *ir)
>         break;
>
>      case ir_triop_csel:
> +      if (try_opt_frontfacing_ternary(ir))
> +         return;
> +
>         ir->operands[1]->accept(this);
>         op[1] = this->result;
>         ir->operands[2]->accept(this);
> @@ -2900,6 +2903,37 @@ fs_visitor::try_opt_frontfacing_ternary(ir_if *ir)
>      return false;
>   }
>
> +bool
> +fs_visitor::try_opt_frontfacing_ternary(ir_expression *ir)
> +{
> +   if (ir->operation != ir_triop_csel)
> +      return false;
> +
> +   ir_dereference_variable *deref = ir->operands[0]->as_dereference_variable();
> +   if (!deref || strcmp(deref->var->name, "gl_FrontFacing") != 0)
> +      return false;
> +
> +   ir_constant *then_rhs = ir->operands[1]->as_constant();
> +   ir_constant *else_rhs = ir->operands[2]->as_constant();
> +
> +   if (!then_rhs || !else_rhs)
> +      return false;
> +
> +   if (ir->type->base_type != GLSL_TYPE_FLOAT)
> +      return false;
> +
> +   if ((then_rhs->is_one() && else_rhs->is_negative_one()) ||
> +       (else_rhs->is_one() && then_rhs->is_negative_one())) {
> +      fs_reg dst = vgrf(glsl_type::int_type);
> +      this->result = dst;
> +
> +      emit_frontfacing_to_float_one_neg_one(this, dst, then_rhs, else_rhs);
> +      return true;
> +   }
> +
> +   return false;
> +}
> +
>   /**
>    * Try to replace IF/MOV/ELSE/MOV/ENDIF with SEL.
>    *
>


More information about the mesa-dev mailing list