summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Forbes <[email protected]>2013-11-10 09:15:13 +1300
committerChris Forbes <[email protected]>2013-11-10 16:57:07 +1300
commit5442c0eae3a639d0c9daf447cdfecdbafb475658 (patch)
treec49982eea0b008cb7068d26dec0ab2eff0939f6a
parentd257350949440539cb4c3c20349da7f1d5afb693 (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.cpp18
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" {