On 08/18/2014 05:17 AM, Abdiel Janulgue wrote: > Signed-off-by: Abdiel Janulgue <abdiel.janul...@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; > } > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev