X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=7bbe14da382b6dbd54fb23ce113187f7e8616de3;hb=ff8a0248f1a3c0c1f48f670867bc9106c898c55b;hp=f4d1680bccfbe76d1dd3ddb4829390fdee123f95;hpb=7a16308e72aef363727b21348779673edf8e5c07;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index f4d1680b..7bbe14da 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -43,10 +43,11 @@ FunctionInliner::FunctionInliner(): extract_result(0) { } -FunctionInliner::FunctionInliner(const set &in): - inlineable(in), - extract_result(0) -{ } +void FunctionInliner::apply(Stage &stage) +{ + inlineable = InlineableFunctionLocator().apply(stage); + visit(stage.content); +} void FunctionInliner::visit_and_inline(RefPtr &ptr) { @@ -202,14 +203,14 @@ void ConstantConditionEliminator::visit(Iteration &iter) } -UnusedVariableLocator::VariableInfo::VariableInfo(): +UnusedVariableRemover::VariableInfo::VariableInfo(): local(false), conditionally_assigned(false), referenced(false) { } -UnusedVariableLocator::UnusedVariableLocator(): +UnusedVariableRemover::UnusedVariableRemover(): aggregate(0), assignment(0), assignment_target(false), @@ -217,14 +218,14 @@ UnusedVariableLocator::UnusedVariableLocator(): global_scope(true) { } -void UnusedVariableLocator::apply(Stage &s) +bool UnusedVariableRemover::apply(Stage &stage) { variables.push_back(BlockVariableMap()); - StageVisitor::apply(s); + visit(stage.content); BlockVariableMap &global_variables = variables.back(); for(BlockVariableMap::iterator i=global_variables.begin(); i!=global_variables.end(); ++i) { - if(i->first->interface=="out" && (s.type==Stage::FRAGMENT || i->first->linked_declaration || !i->first->name.compare(0, 3, "gl_"))) + if(i->first->interface=="out" && (stage.type==Stage::FRAGMENT || i->first->linked_declaration || !i->first->name.compare(0, 3, "gl_"))) continue; if(!i->second.referenced) { @@ -233,9 +234,13 @@ void UnusedVariableLocator::apply(Stage &s) } } variables.pop_back(); + + NodeRemover().apply(stage, unused_nodes); + + return !unused_nodes.empty(); } -void UnusedVariableLocator::visit(VariableReference &var) +void UnusedVariableRemover::visit(VariableReference &var) { map::iterator i = aggregates.find(var.declaration); if(i!=aggregates.end()) @@ -249,13 +254,13 @@ void UnusedVariableLocator::visit(VariableReference &var) } } -void UnusedVariableLocator::visit(MemberAccess &memacc) +void UnusedVariableRemover::visit(MemberAccess &memacc) { TraversingVisitor::visit(memacc); unused_nodes.erase(memacc.declaration); } -void UnusedVariableLocator::visit(BinaryExpression &binary) +void UnusedVariableRemover::visit(BinaryExpression &binary) { if(binary.oper=="[") { @@ -269,7 +274,7 @@ void UnusedVariableLocator::visit(BinaryExpression &binary) TraversingVisitor::visit(binary); } -void UnusedVariableLocator::visit(Assignment &assign) +void UnusedVariableRemover::visit(Assignment &assign) { { assign_to_subscript = false; @@ -280,7 +285,7 @@ void UnusedVariableLocator::visit(Assignment &assign) assignment = &assign; } -void UnusedVariableLocator::record_assignment(VariableDeclaration &var, Node &node, bool chained) +void UnusedVariableRemover::record_assignment(VariableDeclaration &var, Node &node, bool chained) { VariableInfo &var_info = variables.back()[&var]; if(!chained) @@ -289,7 +294,7 @@ void UnusedVariableLocator::record_assignment(VariableDeclaration &var, Node &no var_info.conditionally_assigned = false; } -void UnusedVariableLocator::clear_assignments(VariableInfo &var_info, bool mark_unused) +void UnusedVariableRemover::clear_assignments(VariableInfo &var_info, bool mark_unused) { if(mark_unused) { @@ -299,7 +304,7 @@ void UnusedVariableLocator::clear_assignments(VariableInfo &var_info, bool mark_ var_info.assignments.clear(); } -void UnusedVariableLocator::visit(ExpressionStatement &expr) +void UnusedVariableRemover::visit(ExpressionStatement &expr) { assignment = 0; TraversingVisitor::visit(expr); @@ -307,14 +312,14 @@ void UnusedVariableLocator::visit(ExpressionStatement &expr) record_assignment(*assignment->target_declaration, expr, (assignment->self_referencing || assign_to_subscript)); } -void UnusedVariableLocator::visit(StructDeclaration &strct) +void UnusedVariableRemover::visit(StructDeclaration &strct) { SetForScope set(aggregate, &strct); unused_nodes.insert(&strct); TraversingVisitor::visit(strct); } -void UnusedVariableLocator::visit(VariableDeclaration &var) +void UnusedVariableRemover::visit(VariableDeclaration &var) { if(aggregate) aggregates[&var] = aggregate; @@ -328,14 +333,14 @@ void UnusedVariableLocator::visit(VariableDeclaration &var) TraversingVisitor::visit(var); } -void UnusedVariableLocator::visit(InterfaceBlock &iface) +void UnusedVariableRemover::visit(InterfaceBlock &iface) { SetForScope set(aggregate, &iface); unused_nodes.insert(&iface); TraversingVisitor::visit(iface); } -void UnusedVariableLocator::visit(FunctionDeclaration &func) +void UnusedVariableRemover::visit(FunctionDeclaration &func) { variables.push_back(BlockVariableMap()); @@ -354,7 +359,7 @@ void UnusedVariableLocator::visit(FunctionDeclaration &func) merge_down_variables(); } -void UnusedVariableLocator::merge_down_variables() +void UnusedVariableRemover::merge_down_variables() { BlockVariableMap &parent_variables = variables[variables.size()-2]; BlockVariableMap &block_variables = variables.back(); @@ -383,7 +388,7 @@ void UnusedVariableLocator::merge_down_variables() variables.pop_back(); } -void UnusedVariableLocator::visit(Conditional &cond) +void UnusedVariableRemover::visit(Conditional &cond) { cond.condition->visit(*this); variables.push_back(BlockVariableMap()); @@ -416,7 +421,7 @@ void UnusedVariableLocator::visit(Conditional &cond) merge_down_variables(); } -void UnusedVariableLocator::visit(Iteration &iter) +void UnusedVariableRemover::visit(Iteration &iter) { variables.push_back(BlockVariableMap()); TraversingVisitor::visit(iter); @@ -430,7 +435,14 @@ void UnusedVariableLocator::visit(Iteration &iter) } -void UnusedFunctionLocator::visit(FunctionCall &call) +bool UnusedFunctionRemover::apply(Stage &stage) +{ + visit(stage.content); + NodeRemover().apply(stage, unused_nodes); + return !unused_nodes.empty(); +} + +void UnusedFunctionRemover::visit(FunctionCall &call) { TraversingVisitor::visit(call); @@ -439,7 +451,7 @@ void UnusedFunctionLocator::visit(FunctionCall &call) used_definitions.insert(call.declaration->definition); } -void UnusedFunctionLocator::visit(FunctionDeclaration &func) +void UnusedFunctionRemover::visit(FunctionDeclaration &func) { TraversingVisitor::visit(func);