glsl: Don't constant-fold in a constant in place of a function outval.
authorEric Anholt <eric@anholt.net>
Mon, 23 Aug 2010 01:26:42 +0000 (18:26 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 23 Aug 2010 01:34:46 +0000 (18:34 -0700)
src/glsl/ir_constant_folding.cpp

index 90135b5807a15f5562f293f22069e5dd7dc7b09f..5d770938529e73367b49dde89255ed35b2f3d475 100644 (file)
@@ -49,6 +49,7 @@ public:
    }
 
    virtual ir_visitor_status visit_enter(ir_assignment *ir);
+   virtual ir_visitor_status visit_enter(ir_call *ir);
 
    virtual void handle_rvalue(ir_rvalue **rvalue);
 
@@ -100,6 +101,27 @@ ir_constant_folding_visitor::visit_enter(ir_assignment *ir)
    return visit_continue_with_parent;
 }
 
+ir_visitor_status
+ir_constant_folding_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 *sig_param = (ir_variable *)sig_iter.get();
+
+      if (sig_param->mode == ir_var_in) {
+        ir_rvalue *new_param = param_rval;
+
+        handle_rvalue(&new_param);
+        if (new_param != param_rval) {
+           param_rval->replace_with(new_param);
+        }
+      }
+   }
+
+   return visit_continue_with_parent;
+}
+
 bool
 do_constant_folding(exec_list *instructions)
 {