From: Ian Romanick Date: Wed, 25 Feb 2015 01:57:18 +0000 (-0500) Subject: i965/vs: Add missing resolve_bool_comparison calls on GEN4 and GEN5 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e76a8dc8ed8af9ea9c99ff4f84948fa834317ee9;p=mesa.git i965/vs: Add missing resolve_bool_comparison calls on GEN4 and GEN5 The ir_unop_any problem was discovered by some later optimization passes that generate ir_triop_csel. I was also able to reproduce it by modifying the gl-2.0-vertexattribpointer vertex shader to generate its result using color = mix(vec4(0, 1, 0, 0), vec4(1, 0, 0, 0), bvec4(any(greaterThan(diff, vec4(tolerance))))); instead of an if-statement. This also required using #version 130 and MESA_GLSL_VERSION_OVERRIDE=130. I have not nominated this for stable releases because I don't think there's any way to trigger the problem without GLSL 1.30 or optimizations that don't exist in stable. Signed-off-by: Ian Romanick Reviewed-by: Abdiel Janulgue --- diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 5bf9e1bcf12..195c6f5dae7 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -1555,6 +1555,11 @@ vec4_visitor::visit(ir_expression *ir) } case ir_binop_all_equal: + if (brw->gen <= 5) { + resolve_bool_comparison(ir->operands[0], &op[0]); + resolve_bool_comparison(ir->operands[1], &op[1]); + } + /* "==" operator producing a scalar boolean. */ if (ir->operands[0]->type->is_vector() || ir->operands[1]->type->is_vector()) { @@ -1567,6 +1572,11 @@ vec4_visitor::visit(ir_expression *ir) } break; case ir_binop_any_nequal: + if (brw->gen <= 5) { + resolve_bool_comparison(ir->operands[0], &op[0]); + resolve_bool_comparison(ir->operands[1], &op[1]); + } + /* "!=" operator producing a scalar boolean. */ if (ir->operands[0]->type->is_vector() || ir->operands[1]->type->is_vector()) { @@ -1581,6 +1591,9 @@ vec4_visitor::visit(ir_expression *ir) break; case ir_unop_any: + if (brw->gen <= 5) { + resolve_bool_comparison(ir->operands[0], &op[0]); + } emit(CMP(dst_null_d(), op[0], src_reg(0), BRW_CONDITIONAL_NZ)); emit(MOV(result_dst, src_reg(0)));