X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=inline;f=source%2Fglsl%2Foptimize.cpp;h=208e17a39b49e6fe1fd92f10b31e65808e77068b;hb=ab5f2e6f1ddd35f8f117460530d76c0ba0c9bc87;hp=7bbe14da382b6dbd54fb23ce113187f7e8616de3;hpb=947bb7477205c038aa1804b84452cddd2108550a;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 7bbe14da..208e17a3 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -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 set(scope_level, scope_level+1); - BlockModifier::visit(block); + SetForScope set_block(current_block, &block); + for(NodeList::iterator i=block.body.begin(); i!=block.body.end(); ++i) + { + insert_point = i; + (*i)->visit(*this); + } for(map::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; } }