The backend will have to do a message send, so we want to keep these in one piece, just like texture ops.
Signed-off-by: Chris Forbes <chr...@ijw.co.nz> --- .../dri/i965/brw_fs_channel_expressions.cpp | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp b/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp index e154441..931eb24 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp @@ -75,6 +75,18 @@ channel_expressions_predicate(ir_instruction *ir) if (!expr) return false; + switch (expr->operation) { + /* these opcodes need to act on the whole vector, + * just like texturing. + */ + case ir_unop_interpolate_at_centroid: + case ir_binop_interpolate_at_offset: + case ir_binop_interpolate_at_sample: + return false; + default: + break; + } + for (i = 0; i < expr->get_num_operands(); i++) { if (expr->operands[i]->type->is_vector()) return true; @@ -153,6 +165,16 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir) if (!found_vector) return visit_continue; + switch (expr->operation) { + case ir_unop_interpolate_at_centroid: + case ir_binop_interpolate_at_offset: + case ir_binop_interpolate_at_sample: + return visit_continue; + + default: + break; + } + /* Store the expression operands in temps so we can use them * multiple times. */ @@ -420,6 +442,12 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir) case ir_binop_pack_half_2x16_split: assert(!"not reached: expression operates on scalars only"); break; + + case ir_unop_interpolate_at_centroid: + case ir_binop_interpolate_at_offset: + case ir_binop_interpolate_at_sample: + assert(!"not reached: these are not split"); + break; } ir->remove(); -- 1.8.4.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev