From: Ian Romanick <ian.d.roman...@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.roman...@intel.com> Cc: Abdiel Janulgue <abdiel.janul...@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. * -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev