From 06de9f8ff15559dffddf26d1969d35e74fbf253f Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 13 Oct 2013 00:02:55 +1300 Subject: [PATCH] i965: Generalize coord+offset lowering pass for ir_txf ir_txf expects an ivec* coordinate, and may be larger than ivec2; shuffle things around so that this will work. V2: Fix style nits, use ir_builder Signed-off-by: Chris Forbes Reviewed-by: Kenneth Graunke --- .../i965/brw_lower_unnormalized_offset.cpp | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_lower_unnormalized_offset.cpp b/src/mesa/drivers/dri/i965/brw_lower_unnormalized_offset.cpp index 0581e0539ae..df4fe4be463 100644 --- a/src/mesa/drivers/dri/i965/brw_lower_unnormalized_offset.cpp +++ b/src/mesa/drivers/dri/i965/brw_lower_unnormalized_offset.cpp @@ -52,11 +52,34 @@ public: ir_visitor_status brw_lower_unnormalized_offset_visitor::visit_leave(ir_texture *ir) { - if (ir->sampler->type->sampler_dimensionality != GLSL_SAMPLER_DIM_RECT || - !ir->offset || ir->op != ir_tg4) + if (!ir->offset) return visit_continue; - ir->coordinate = add(ir->coordinate, i2f(ir->offset)); + if (ir->op == ir_tg4) { + if (ir->sampler->type->sampler_dimensionality != GLSL_SAMPLER_DIM_RECT) + return visit_continue; + } + else if (ir->op != ir_txf) { + return visit_continue; + } + + void *mem_ctx = ralloc_parent(ir); + + if (ir->op == ir_txf) { + ir_variable *var = new(mem_ctx) ir_variable(ir->coordinate->type, + "coordinate", + ir_var_temporary); + base_ir->insert_before(var); + base_ir->insert_before(assign(var, ir->coordinate)); + base_ir->insert_before(assign(var, + add(swizzle_for_size(var, ir->offset->type->vector_elements), ir->offset), + (1 << ir->offset->type->vector_elements) - 1)); + + ir->coordinate = new(mem_ctx) ir_dereference_variable(var); + } else { + ir->coordinate = add(ir->coordinate, i2f(ir->offset)); + } + ir->offset = NULL; progress = true;