On 10/14/2013 01:36 AM, Chris Forbes wrote: > ir_txf expects an ivec* coordinate, and may be larger than ivec2; > shuffle things around so that this will work. > > Signed-off-by: Chris Forbes <chr...@ijw.co.nz> > --- > .../dri/i965/brw_lower_unnormalized_offset.cpp | 51 > ++++++++++++++++++---- > 1 file changed, 42 insertions(+), 9 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 733c289..9106726 100644 > --- a/src/mesa/drivers/dri/i965/brw_lower_unnormalized_offset.cpp > +++ b/src/mesa/drivers/dri/i965/brw_lower_unnormalized_offset.cpp > @@ -50,20 +50,53 @@ 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; > > + if (ir->op == ir_tg4) { > + if (ir->sampler->type->sampler_dimensionality != GLSL_SAMPLER_DIM_RECT) > + return visit_continue; > + } > + else if (ir->op != ir_txf) {
Style nit: } else if (ir->op != ir_txf) { > + return visit_continue; > + } > + > void *mem_ctx = ralloc_parent(ir); > > - ir->coordinate = new (mem_ctx) ir_expression( > - ir_binop_add, > - ir->coordinate, > - new (mem_ctx) ir_expression( > - ir_unop_i2f, > - ir->offset)); > - ir->offset = NULL; > + if (ir->op == ir_txf) { > + ir_variable *var = new (mem_ctx) ir_variable( > + ir->coordinate->type, "coordinate", ir_var_auto); > + base_ir->insert_before(var); > > + ir_assignment *assign = new (mem_ctx) ir_assignment( > + new (mem_ctx) ir_dereference_variable(var), > + ir->coordinate, > + NULL); > + base_ir->insert_before(assign); > + > + assign = new (mem_ctx) ir_assignment( > + new (mem_ctx) ir_dereference_variable(var), > + new (mem_ctx) ir_expression( > + ir_binop_add, > + new (mem_ctx) ir_swizzle( > + new (mem_ctx) ir_dereference_variable(var), > + 0, 1, 2, 3, ir->offset->type->vector_elements), > + ir->offset), > + NULL); > + assign->write_mask = (1 << ir->offset->type->vector_elements) - 1; > + base_ir->insert_before(assign); > + > + ir->coordinate = new (mem_ctx) ir_dereference_variable(var); > + } else { > + ir->coordinate = new (mem_ctx) ir_expression( > + ir_binop_add, > + ir->coordinate, > + new (mem_ctx) ir_expression( > + ir_unop_i2f, > + ir->offset)); > + } 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); ir_assignment *assign = assign(var, ir->coordinate); base_ir->insert_before(assign); assign = assign(var, add(swizzle_for_size(var, ir->offset->type->vector_elements), ir->offset)); base_ir->insert_before(assign); ir->coordinate = new(mem_ctx) ir_dereference_variable(var); } else { ir->coordinate = add(ir->coordinate, i2f(ir->offset)); } So much easier :) With that changed, this series is: Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> > + > + ir->offset = NULL; > > progress = true; > return visit_continue; > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev