X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.cpp;h=096a5d84927a062904f92e45b28421a554a0c07e;hb=49717d5554becc07a4fafa4f1cbf85ac6ca13907;hp=55f62ae93e16d954b846fa13262f9108220c2dda;hpb=78cec1556c85db6beb4f3d9f918b5a1f421719ef;p=libs%2Fgl.git diff --git a/source/programcompiler.cpp b/source/programcompiler.cpp index 55f62ae9..096a5d84 100644 --- a/source/programcompiler.cpp +++ b/source/programcompiler.cpp @@ -83,7 +83,7 @@ bool ProgramCompiler::optimize(Stage &stage) remover.to_remove = unused_locator.unused_nodes; remover.apply(stage); - return remover.n_removed; + return !unused_locator.unused_nodes.empty(); } void ProgramCompiler::inject_block(Block &target, const Block &source) @@ -491,8 +491,12 @@ bool ProgramCompiler::InterfaceGenerator::generate_interface(VariableDeclaration iface_var->type = var.type; iface_var->type_declaration = var.type_declaration; iface_var->name = name; - iface_var->array = (var.array || (stage->type==GEOMETRY && iface=="in")); - iface_var->array_size = var.array_size; + if(stage->type==GEOMETRY) + iface_var->array = ((var.array && var.interface!="in") || iface=="in"); + else + iface_var->array = var.array; + if(iface_var->array) + iface_var->array_size = var.array_size; if(iface=="in") iface_var->linked_declaration = &var; iface_declarations[name] = iface_var; @@ -626,6 +630,7 @@ void ProgramCompiler::VariableRenamer::visit(VariableDeclaration &var) ProgramCompiler::UnusedVariableLocator::UnusedVariableLocator(): + aggregate(0), assignment(false), record_target(false), assignment_target(0), @@ -656,6 +661,10 @@ void ProgramCompiler::UnusedVariableLocator::visit(VariableReference &var) if(assignment && var.declaration==assignment_target) self_referencing = true; } + + map::iterator i = aggregates.find(var.declaration); + if(i!=aggregates.end()) + unused_nodes.erase(i->second); } void ProgramCompiler::UnusedVariableLocator::visit(MemberAccess &memacc) @@ -710,50 +719,50 @@ void ProgramCompiler::UnusedVariableLocator::visit(ExpressionStatement &expr) assignment = false; } +void ProgramCompiler::UnusedVariableLocator::visit(StructDeclaration &strct) +{ + SetForScope set(aggregate, &strct); + unused_nodes.insert(&strct); + TraversingVisitor::visit(strct); +} + void ProgramCompiler::UnusedVariableLocator::visit(VariableDeclaration &var) { - unused_nodes.insert(&var); - if(var.init_expression) + if(aggregate) + aggregates[&var] = aggregate; + else { - unused_nodes.insert(&*var.init_expression); - assignments[&var] = &*var.init_expression; + unused_nodes.insert(&var); + if(var.init_expression) + { + unused_nodes.insert(&*var.init_expression); + assignments[&var] = &*var.init_expression; + } } + unused_nodes.erase(var.type_declaration); TraversingVisitor::visit(var); } +void ProgramCompiler::UnusedVariableLocator::visit(InterfaceBlock &iface) +{ + SetForScope set(aggregate, &iface); + unused_nodes.insert(&iface); + TraversingVisitor::visit(iface); +} -ProgramCompiler::NodeRemover::NodeRemover(): - n_removed(0), - immutable_block(false), - remove_block(false) -{ } void ProgramCompiler::NodeRemover::visit(Block &block) { - remove_block = immutable_block; for(list >::iterator i=block.body.begin(); i!=block.body.end(); ) { - bool remove = to_remove.count(&**i); - if(!remove) - remove_block = false; (*i)->visit(*this); - - if(remove ? !immutable_block : remove_block) - { + if(to_remove.count(&**i)) block.body.erase(i++); - ++n_removed; - } else ++i; } } -void ProgramCompiler::NodeRemover::visit(StructDeclaration &strct) -{ - SetFlag set(immutable_block); - TraversingVisitor::visit(strct); -} - void ProgramCompiler::NodeRemover::visit(VariableDeclaration &var) { if(to_remove.count(&var)) @@ -767,11 +776,5 @@ void ProgramCompiler::NodeRemover::visit(VariableDeclaration &var) var.init_expression = 0; } -void ProgramCompiler::NodeRemover::visit(InterfaceBlock &iface) -{ - SetFlag set(immutable_block); - TraversingVisitor::visit(iface); -} - } // namespace GL } // namespace Msp