Browse Source

glsl2: Don't mark a variable as constant if it was used as an out param.

tags/mesa-7.9-rc1
Eric Anholt 15 years ago
parent
commit
2927c81ed1
1 changed files with 23 additions and 0 deletions
  1. 23
    0
      src/glsl/ir_constant_variable.cpp

+ 23
- 0
src/glsl/ir_constant_variable.cpp View File

@@ -47,6 +47,7 @@ struct assignment_entry {
class ir_constant_variable_visitor : public ir_hierarchical_visitor {
public:
virtual ir_visitor_status visit_enter(ir_assignment *);
virtual ir_visitor_status visit_enter(ir_call *);

exec_list list;
};
@@ -107,6 +108,28 @@ ir_constant_variable_visitor::visit_enter(ir_assignment *ir)
return visit_continue;
}

ir_visitor_status
ir_constant_variable_visitor::visit_enter(ir_call *ir)
{
exec_list_iterator sig_iter = ir->get_callee()->parameters.iterator();
foreach_iter(exec_list_iterator, iter, *ir) {
ir_rvalue *param_rval = (ir_rvalue *)iter.get();
ir_variable *param = (ir_variable *)sig_iter.get();

if (param->mode == ir_var_out ||
param->mode == ir_var_inout) {
ir_variable *var = param_rval->variable_referenced();
struct assignment_entry *entry;

assert(var);
entry = get_assignment_entry(var, &this->list);
entry->assignment_count++;
}
sig_iter.next();
}
return visit_continue;
}

/**
* Does a copy propagation pass on the code present in the instruction stream.
*/

Loading…
Cancel
Save