]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programcompiler.cpp
Remove useless declarations of main() from shaders
[libs/gl.git] / source / programcompiler.cpp
index 14c9d3d3ced42958e539e7ef27a6623f297e41cb..0d61c6853c737a75bac34212114077e1b691286c 100644 (file)
@@ -1229,8 +1229,7 @@ void ProgramCompiler::UnusedVariableLocator::apply(Stage &s)
                if(!i->second.referenced)
                {
                        unused_nodes.insert(i->first);
-                       for(vector<Node *>::iterator j=i->second.assignments.begin(); j!=i->second.assignments.end(); ++j)
-                               unused_nodes.insert(*j);
+                       clear_assignments(i->second, true);
                }
        }
        variables.pop_back();
@@ -1282,11 +1281,21 @@ void ProgramCompiler::UnusedVariableLocator::record_assignment(VariableDeclarati
 {
        VariableInfo &var_info = variables.back()[&var];
        if(!self_ref)
-               var_info.assignments.clear();
+               clear_assignments(var_info, true);
        var_info.assignments.push_back(&node);
        var_info.conditionally_assigned = false;
 }
 
+void ProgramCompiler::UnusedVariableLocator::clear_assignments(VariableInfo &var_info, bool mark_unused)
+{
+       if(mark_unused)
+       {
+               for(vector<Node *>::iterator i=var_info.assignments.begin(); i!=var_info.assignments.end(); ++i)
+                       unused_nodes.insert(*i);
+       }
+       var_info.assignments.clear();
+}
+
 void ProgramCompiler::UnusedVariableLocator::visit(ExpressionStatement &expr)
 {
        assignment = 0;
@@ -1337,6 +1346,8 @@ void ProgramCompiler::UnusedVariableLocator::visit(FunctionDeclaration &func)
        BlockVariableMap &block_variables = variables.back();
        for(BlockVariableMap::iterator i=block_variables.begin(); i!=block_variables.end(); ++i)
                i->second.conditionally_assigned = true;
+       for(vector<RefPtr<VariableDeclaration> >::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i)
+               block_variables[i->get()].referenced = true;
        merge_down_variables();
 }
 
@@ -1350,8 +1361,7 @@ void ProgramCompiler::UnusedVariableLocator::merge_down_variables()
                {
                        if(!i->second.referenced)
                                unused_nodes.insert(i->first);
-                       for(vector<Node *>::iterator j=i->second.assignments.begin(); j!=i->second.assignments.end(); ++j)
-                               unused_nodes.insert(*j);
+                       clear_assignments(i->second, true);
                        continue;
                }
 
@@ -1360,11 +1370,9 @@ void ProgramCompiler::UnusedVariableLocator::merge_down_variables()
                        parent_variables.insert(*i);
                else
                {
-                       if(!i->second.conditionally_assigned)
-                       {
-                               j->second.assignments.clear();
-                               j->second.conditionally_assigned = true;
-                       }
+                       if(i->second.referenced || !i->second.conditionally_assigned)
+                               clear_assignments(j->second, !i->second.referenced);
+                       j->second.conditionally_assigned = i->second.conditionally_assigned;
                        j->second.referenced |= i->second.referenced;
                        j->second.assignments.insert(j->second.assignments.end(), i->second.assignments.begin(), i->second.assignments.end());
                }
@@ -1439,7 +1447,7 @@ void ProgramCompiler::UnusedFunctionLocator::visit(FunctionDeclaration &func)
 {
        TraversingVisitor::visit(func);
 
-       if(func.name!="main" && !used_definitions.count(&func))
+       if((func.name!="main" || func.body.body.empty()) && !used_definitions.count(&func))
                unused_nodes.insert(&func);
 }