X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=2215f8335cd06a23ea71e2c381cb1776362b81cd;hb=30465dd3b9f55ec42c4b19c3c2077eede7237a26;hp=208e17a39b49e6fe1fd92f10b31e65808e77068b;hpb=ab5f2e6f1ddd35f8f117460530d76c0ba0c9bc87;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 208e17a3..2215f833 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -14,7 +14,7 @@ InlineableFunctionLocator::InlineableFunctionLocator(): void InlineableFunctionLocator::visit(FunctionCall &call) { FunctionDeclaration *def = call.declaration; - if(def && def->definition!=def) + if(def) def = def->definition; if(def) @@ -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) @@ -95,7 +95,7 @@ void FunctionInliner::visit(FunctionCall &call) visit_and_inline(*i); FunctionDeclaration *def = call.declaration; - if(def && def->definition!=def) + if(def) def = def->definition; if(def && inlineable.count(def)) @@ -124,20 +124,17 @@ void FunctionInliner::visit(Return &ret) ConstantConditionEliminator::ConstantConditionEliminator(): - scope_level(0), - current_block(0), record_only(false) { } void ConstantConditionEliminator::apply(Stage &stage) { - visit(stage.content); + stage.content.visit(*this); NodeRemover().apply(stage, nodes_to_remove); } void ConstantConditionEliminator::visit(Block &block) { - SetForScope set(scope_level, scope_level+1); SetForScope set_block(current_block, &block); for(NodeList::iterator i=block.body.begin(); i!=block.body.end(); ++i) { @@ -163,7 +160,13 @@ void ConstantConditionEliminator::visit(Assignment &assign) void ConstantConditionEliminator::visit(VariableDeclaration &var) { - if(var.constant || scope_level>1) + bool constant = var.constant; + if(constant && var.layout) + { + for(vector::const_iterator i=var.layout->qualifiers.begin(); (constant && i!=var.layout->qualifiers.end()); ++i) + constant = (i->name!="constant_id"); + } + if((constant || current_block->parent) && var.init_expression) variable_values[&var] = var.init_expression.get(); } @@ -228,14 +231,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) { @@ -263,11 +265,16 @@ void UnusedVariableRemover::visit(VariableReference &var) if(var.declaration && !assignment_target) { VariableInfo &var_info = variables.back()[var.declaration]; - var_info.assignments.clear(); + clear_assignments(var_info, false); var_info.referenced = true; } } +void UnusedVariableRemover::visit(InterfaceBlockReference &iface) +{ + unused_nodes.erase(iface.declaration); +} + void UnusedVariableRemover::visit(MemberAccess &memacc) { TraversingVisitor::visit(memacc); @@ -358,12 +365,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) @@ -443,7 +447,7 @@ void UnusedVariableRemover::visit(Iteration &iter) BlockVariableMap &block_variables = variables.back(); for(BlockVariableMap::iterator i=block_variables.begin(); i!=block_variables.end(); ++i) if(!i->second.local && i->second.referenced) - i->second.assignments.clear(); + clear_assignments(i->second, false); merge_down_variables(); } @@ -451,7 +455,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(); }