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 <chrisf@ijw.co.nz> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
72b5e9c42a
commit
06de9f8ff1
|
@ -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;
|
||||
|
||||
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;
|
||||
|
|
Loading…
Reference in New Issue