[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