X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=1ebb87c5c2ea23360c33917104745273de6d8da0;hb=bd8816692056230c36504dcccd76c6946dff47b1;hp=7bbe14da382b6dbd54fb23ce113187f7e8616de3;hpb=ff8a0248f1a3c0c1f48f670867bc9106c898c55b;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 7bbe14da..1ebb87c5 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -46,7 +46,7 @@ FunctionInliner::FunctionInliner(): void FunctionInliner::apply(Stage &stage) { inlineable = InlineableFunctionLocator().apply(stage); - visit(stage.content); + stage.content.visit(*this); } void FunctionInliner::visit_and_inline(RefPtr &ptr) @@ -124,14 +124,23 @@ void FunctionInliner::visit(Return &ret) ConstantConditionEliminator::ConstantConditionEliminator(): - scope_level(0), record_only(false) { } +void ConstantConditionEliminator::apply(Stage &stage) +{ + stage.content.visit(*this); + 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); @@ -151,7 +160,7 @@ void ConstantConditionEliminator::visit(Assignment &assign) void ConstantConditionEliminator::visit(VariableDeclaration &var) { - if(var.constant || scope_level>1) + if((var.constant || current_block->parent) && var.init_expression) variable_values[&var] = var.init_expression.get(); } @@ -163,7 +172,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 +196,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; } } @@ -214,14 +225,13 @@ UnusedVariableRemover::UnusedVariableRemover(): aggregate(0), assignment(0), assignment_target(false), - assign_to_subscript(false), - global_scope(true) + assign_to_subscript(false) { } bool UnusedVariableRemover::apply(Stage &stage) { variables.push_back(BlockVariableMap()); - visit(stage.content); + stage.content.visit(*this); BlockVariableMap &global_variables = variables.back(); for(BlockVariableMap::iterator i=global_variables.begin(); i!=global_variables.end(); ++i) { @@ -254,6 +264,11 @@ void UnusedVariableRemover::visit(VariableReference &var) } } +void UnusedVariableRemover::visit(InterfaceBlockReference &iface) +{ + unused_nodes.erase(iface.declaration); +} + void UnusedVariableRemover::visit(MemberAccess &memacc) { TraversingVisitor::visit(memacc); @@ -344,12 +359,9 @@ void UnusedVariableRemover::visit(FunctionDeclaration &func) { variables.push_back(BlockVariableMap()); - { - SetForScope set(global_scope, false); - for(NodeArray::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i) - (*i)->visit(*this); - func.body.visit(*this); - } + for(NodeArray::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i) + (*i)->visit(*this); + func.body.visit(*this); BlockVariableMap &block_variables = variables.back(); for(BlockVariableMap::iterator i=block_variables.begin(); i!=block_variables.end(); ++i) @@ -437,7 +449,7 @@ void UnusedVariableRemover::visit(Iteration &iter) bool UnusedFunctionRemover::apply(Stage &stage) { - visit(stage.content); + stage.content.visit(*this); NodeRemover().apply(stage, unused_nodes); return !unused_nodes.empty(); }