glsl: Add a pass to lower ir_unop_saturate to clamp(x, 0, 1)

Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Abdiel Janulgue
2014-06-12 14:59:30 -07:00
parent 4c0ccfc5b3
commit 8935c12937
2 changed files with 30 additions and 0 deletions

View File

@@ -40,6 +40,7 @@
#define LDEXP_TO_ARITH 0x100 #define LDEXP_TO_ARITH 0x100
#define CARRY_TO_ARITH 0x200 #define CARRY_TO_ARITH 0x200
#define BORROW_TO_ARITH 0x400 #define BORROW_TO_ARITH 0x400
#define SAT_TO_CLAMP 0x800
/** /**
* \see class lower_packing_builtins_visitor * \see class lower_packing_builtins_visitor

View File

@@ -41,6 +41,7 @@
* - BITFIELD_INSERT_TO_BFM_BFI * - BITFIELD_INSERT_TO_BFM_BFI
* - CARRY_TO_ARITH * - CARRY_TO_ARITH
* - BORROW_TO_ARITH * - BORROW_TO_ARITH
* - SAT_TO_CLAMP
* *
* SUB_TO_ADD_NEG: * SUB_TO_ADD_NEG:
* --------------- * ---------------
@@ -104,6 +105,10 @@
* ---------------- * ----------------
* Converts ir_borrow into (x < y). * 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 */ #include "main/core.h" /* for M_LOG2E */
@@ -139,6 +144,7 @@ private:
void ldexp_to_arith(ir_expression *); void ldexp_to_arith(ir_expression *);
void carry_to_arith(ir_expression *); void carry_to_arith(ir_expression *);
void borrow_to_arith(ir_expression *); void borrow_to_arith(ir_expression *);
void sat_to_clamp(ir_expression *);
}; };
} /* anonymous namespace */ } /* anonymous namespace */
@@ -484,6 +490,24 @@ lower_instructions_visitor::borrow_to_arith(ir_expression *ir)
this->progress = true; 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)
*/
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 ir_visitor_status
lower_instructions_visitor::visit_leave(ir_expression *ir) lower_instructions_visitor::visit_leave(ir_expression *ir)
{ {
@@ -540,6 +564,11 @@ lower_instructions_visitor::visit_leave(ir_expression *ir)
borrow_to_arith(ir); borrow_to_arith(ir);
break; break;
case ir_unop_saturate:
if (lowering(SAT_TO_CLAMP))
sat_to_clamp(ir);
break;
default: default:
return visit_continue; return visit_continue;
} }