Commit 0ae9ca12a8 put source modifiers out of the bitcast operations by adding a MOV operation that would handle them separately. It missed the case of ceil though, which negates both its source and destination operands.
Fixes the following 42 dEQP tests: dEQP-GLES3.functional.shaders.builtin_functions.common.ceil.*_vertex dEQP-GLES3.functional.shaders.builtin_functions.common.ceil.*_fragment dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil._*vertex.* dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil._*fragment.* --- src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 12 ++++++++---- src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index b4f8f37..4526b75 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -889,10 +889,14 @@ fs_visitor::visit(ir_expression *ir) case ir_unop_trunc: emit(RNDZ(this->result, op[0])); break; - case ir_unop_ceil: - op[0].negate = !op[0].negate; - emit(RNDD(this->result, op[0])); - this->result.negate = true; + case ir_unop_ceil: { + fs_reg tmp = fs_reg(this, ir->type); + op[0].negate = !op[0].negate; + emit(MOV(tmp, op[0])); + emit(RNDD(tmp, tmp)); + tmp.negate = true; + emit(MOV(this->result, tmp)); + } break; case ir_unop_floor: emit(RNDD(this->result, op[0])); diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 73fff75..7c4a3e1 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -1649,10 +1649,14 @@ vec4_visitor::visit(ir_expression *ir) case ir_unop_trunc: emit(RNDZ(result_dst, op[0])); break; - case ir_unop_ceil: - op[0].negate = !op[0].negate; - inst = emit(RNDD(result_dst, op[0])); - this->result.negate = true; + case ir_unop_ceil: { + src_reg tmp = src_reg(this, ir->type); + op[0].negate = !op[0].negate; + emit(MOV(dst_reg(tmp), op[0])); + emit(RNDD(dst_reg(tmp), tmp)); + tmp.negate = true; + emit(MOV(result_dst, tmp)); + } break; case ir_unop_floor: inst = emit(RNDD(result_dst, op[0])); -- 1.9.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev