[Mesa-dev] [PATCH 04/17] glsl: Add a pass to lower ir_unop_saturate to clamp(x, 0, 1)

Ian Romanick idr at freedesktop.org
Fri Aug 22 16:38:59 PDT 2014


On 08/18/2014 05:17 AM, Abdiel Janulgue wrote:
> Signed-off-by: Abdiel Janulgue <abdiel.janulgue at linux.intel.com>
> ---
>  src/glsl/ir_optimization.h      |  1 +
>  src/glsl/lower_instructions.cpp | 29 +++++++++++++++++++++++++++++
>  2 files changed, 30 insertions(+)
> 
> diff --git a/src/glsl/ir_optimization.h b/src/glsl/ir_optimization.h
> index b83c225..1c6f72b 100644
> --- a/src/glsl/ir_optimization.h
> +++ b/src/glsl/ir_optimization.h
> @@ -40,6 +40,7 @@
>  #define LDEXP_TO_ARITH     0x100
>  #define CARRY_TO_ARITH     0x200
>  #define BORROW_TO_ARITH    0x400
> +#define SAT_TO_CLAMP       0x800
>  
>  /**
>   * \see class lower_packing_builtins_visitor
> diff --git a/src/glsl/lower_instructions.cpp b/src/glsl/lower_instructions.cpp
> index 176070c..6842853 100644
> --- a/src/glsl/lower_instructions.cpp
> +++ b/src/glsl/lower_instructions.cpp
> @@ -41,6 +41,7 @@
>   * - BITFIELD_INSERT_TO_BFM_BFI
>   * - CARRY_TO_ARITH
>   * - BORROW_TO_ARITH
> + * - SAT_TO_CLAMP
>   *
>   * SUB_TO_ADD_NEG:
>   * ---------------
> @@ -104,6 +105,10 @@
>   * ----------------
>   * Converts ir_borrow into (x < y).
>   *
> + * SAT_TO_CLAMP:
> + * -------------
> + * Converts ir_unop_saturate into min(max(x, 0.0), 1.0)
> + *
>   */
>  
>  #include "main/core.h" /* for M_LOG2E */
> @@ -139,6 +144,7 @@ private:
>     void ldexp_to_arith(ir_expression *);
>     void carry_to_arith(ir_expression *);
>     void borrow_to_arith(ir_expression *);
> +   void sat_to_clamp(ir_expression *);
>  };
>  
>  } /* anonymous namespace */
> @@ -484,6 +490,24 @@ lower_instructions_visitor::borrow_to_arith(ir_expression *ir)
>     this->progress = true;
>  }
>  
> +void
> +lower_instructions_visitor::sat_to_clamp(ir_expression *ir)
> +{
> +   /* Translates
> +    *   ir_unop_saturate x
> +    * into
> +    *   ir_binop_min (ir_binop_max(x, 0.0), 1.0)
> +    */

I infer from this code that ir_unop_sat can only operate on
floating-point values.  If this is the case, you should also add checks
to ir_validate for this condition.

> +
> +   ir->operation = ir_binop_min;
> +   ir->operands[0] = new(ir) ir_expression(ir_binop_max, ir->operands[0]->type,
> +                                           ir->operands[0],
> +                                           new(ir) ir_constant(0.0f));
> +   ir->operands[1] = new(ir) ir_constant(1.0f);
> +
> +   this->progress = true;
> +}
> +
>  ir_visitor_status
>  lower_instructions_visitor::visit_leave(ir_expression *ir)
>  {
> @@ -540,6 +564,11 @@ lower_instructions_visitor::visit_leave(ir_expression *ir)
>           borrow_to_arith(ir);
>        break;
>  
> +   case ir_unop_saturate:
> +      if (lowering(SAT_TO_CLAMP))
> +         sat_to_clamp(ir);
> +      break;
> +
>     default:
>        return visit_continue;
>     }
> 



More information about the mesa-dev mailing list