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 <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Chris Forbes 2013-11-10 09:15:13 +13:00
parent d257350949
commit 5442c0eae3
1 changed files with 11 additions and 7 deletions

View File

@ -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" {