]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Rewrite syntax tree modifications
[libs/gl.git] / source / glsl / optimize.cpp
index 7bbe14da382b6dbd54fb23ce113187f7e8616de3..208e17a39b49e6fe1fd92f10b31e65808e77068b 100644 (file)
@@ -125,13 +125,25 @@ void FunctionInliner::visit(Return &ret)
 
 ConstantConditionEliminator::ConstantConditionEliminator():
        scope_level(0),
+       current_block(0),
        record_only(false)
 { }
 
+void ConstantConditionEliminator::apply(Stage &stage)
+{
+       visit(stage.content);
+       NodeRemover().apply(stage, nodes_to_remove);
+}
+
 void ConstantConditionEliminator::visit(Block &block)
 {
        SetForScope<unsigned> set(scope_level, scope_level+1);
-       BlockModifier::visit(block);
+       SetForScope<Block *> set_block(current_block, &block);
+       for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
+       {
+               insert_point = i;
+               (*i)->visit(*this);
+       }
 
        for(map<string, VariableDeclaration *>::const_iterator i=block.variables.begin(); i!=block.variables.end(); ++i)
                variable_values.erase(i->second);
@@ -163,7 +175,9 @@ void ConstantConditionEliminator::visit(Conditional &cond)
                cond.condition->visit(eval);
                if(eval.is_result_valid())
                {
-                       flatten_block(eval.get_result() ? cond.body : cond.else_body);
+                       Block &block = (eval.get_result() ? cond.body : cond.else_body);
+                       current_block->body.splice(insert_point, block.body);
+                       nodes_to_remove.insert(&cond);
                        return;
                }
        }
@@ -185,7 +199,7 @@ void ConstantConditionEliminator::visit(Iteration &iter)
                        iter.condition->visit(eval);
                        if(eval.is_result_valid() && !eval.get_result())
                        {
-                               remove_node = true;
+                               nodes_to_remove.insert(&iter);
                                return;
                        }
                }