diff options
Diffstat (limited to 'src/mesa/program/ir_to_mesa.cpp')
-rw-r--r-- | src/mesa/program/ir_to_mesa.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index 35a68562001..c5b67ad706a 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -1067,10 +1067,20 @@ ir_to_mesa_visitor::visit(ir_expression *ir) emit(ir, OPCODE_SLT, result_dst, op[0], op[1]); break; case ir_binop_greater: - emit(ir, OPCODE_SGT, result_dst, op[0], op[1]); + /* Negating the operands (as opposed to switching the order of the + * operands) produces the correct result when both are +/-Inf. + */ + op[0].negate = ~op[0].negate; + op[1].negate = ~op[1].negate; + emit(ir, OPCODE_SLT, result_dst, op[0], op[1]); break; case ir_binop_lequal: - emit(ir, OPCODE_SLE, result_dst, op[0], op[1]); + /* Negating the operands (as opposed to switching the order of the + * operands) produces the correct result when both are +/-Inf. + */ + op[0].negate = ~op[0].negate; + op[1].negate = ~op[1].negate; + emit(ir, OPCODE_SGE, result_dst, op[0], op[1]); break; case ir_binop_gequal: emit(ir, OPCODE_SGE, result_dst, op[0], op[1]); |