diff options
author | Chris Forbes <[email protected]> | 2013-11-10 09:15:13 +1300 |
---|---|---|
committer | Chris Forbes <[email protected]> | 2013-11-10 16:57:07 +1300 |
commit | 5442c0eae3a639d0c9daf447cdfecdbafb475658 (patch) | |
tree | c49982eea0b008cb7068d26dec0ab2eff0939f6a | |
parent | d257350949440539cb4c3c20349da7f1d5afb693 (diff) |
i965: convert brw_lower_offset_array_visitor to ir_rvalue_visitor
Previously, we would bogusly replace the entire statement containing the
ir_texture node with an ir_dereference_variable.
Correct this to just replace the ir_texture node itself as intended.
Signed-off-by: Chris Forbes <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_lower_offset_array.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_lower_offset_array.cpp b/src/mesa/drivers/dri/i965/brw_lower_offset_array.cpp index 19e1efe950d..91c002ed568 100644 --- a/src/mesa/drivers/dri/i965/brw_lower_offset_array.cpp +++ b/src/mesa/drivers/dri/i965/brw_lower_offset_array.cpp @@ -34,26 +34,31 @@ #include "glsl/glsl_types.h" #include "glsl/ir.h" #include "glsl/ir_builder.h" +#include "glsl/ir_rvalue_visitor.h" using namespace ir_builder; -class brw_lower_offset_array_visitor : public ir_hierarchical_visitor { +class brw_lower_offset_array_visitor : public ir_rvalue_visitor { public: brw_lower_offset_array_visitor() { progress = false; } - ir_visitor_status visit_leave(ir_texture *ir); + void handle_rvalue(ir_rvalue **rv); bool progress; }; -ir_visitor_status -brw_lower_offset_array_visitor::visit_leave(ir_texture *ir) +void +brw_lower_offset_array_visitor::handle_rvalue(ir_rvalue **rv) { + if (*rv == NULL || (*rv)->ir_type != ir_type_texture) + return; + + ir_texture *ir = (ir_texture *) *rv; if (ir->op != ir_tg4 || !ir->offset || !ir->offset->type->is_array()) - return visit_continue; + return; void *mem_ctx = ralloc_parent(ir); @@ -68,10 +73,9 @@ brw_lower_offset_array_visitor::visit_leave(ir_texture *ir) base_ir->insert_before(assign(var, swizzle_w(tex), 1 << i)); } - base_ir->replace_with(new (mem_ctx) ir_dereference_variable(var)); + *rv = new (mem_ctx) ir_dereference_variable(var); progress = true; - return visit_continue; } extern "C" { |