]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Remove unused type declarations from GLSL during optimization
[libs/gl.git] / source / glsl / optimize.cpp
index a999a654db84ac8ac072ef7fb817d5107643a584..88a323992636b0642d05d4134ee81d68bdebce9c 100644 (file)
@@ -289,11 +289,15 @@ void FunctionInliner::visit(Conditional &cond)
 
 void FunctionInliner::visit(Iteration &iter)
 {
-       SetForScope<Block *> set_block(current_block, &iter.body);
+       /* Visit the initialization statement before entering the loop body so the
+       inlined statements get inserted outside. */
        if(iter.init_statement)
                iter.init_statement->visit(*this);
-       /* Skip the condition and loop expression parts because they're executed on
-       every iteration of the loop */
+
+       SetForScope<Block *> set_block(current_block, &iter.body);
+       /* Skip the condition and loop expression parts because they're not properly
+       inside the body block.  Inlining anything into them will require a more
+       comprehensive transformation. */
        iter.body.visit(*this);
 }
 
@@ -618,6 +622,38 @@ UnusedVariableRemover::VariableInfo::VariableInfo():
 { }
 
 
+bool UnusedTypeRemover::apply(Stage &stage)
+{
+       stage.content.visit(*this);
+       NodeRemover().apply(stage, unused_nodes);
+       return !unused_nodes.empty();
+}
+
+void UnusedTypeRemover::visit(BasicTypeDeclaration &type)
+{
+       if(type.base_type)
+               unused_nodes.erase(type.base_type);
+       unused_nodes.insert(&type);
+}
+
+void UnusedTypeRemover::visit(ImageTypeDeclaration &type)
+{
+       if(type.base_type)
+               unused_nodes.erase(type.base_type);
+       unused_nodes.insert(&type);
+}
+
+void UnusedTypeRemover::visit(StructDeclaration &strct)
+{
+       unused_nodes.insert(&strct);
+}
+
+void UnusedTypeRemover::visit(VariableDeclaration &var)
+{
+       unused_nodes.erase(var.type_declaration);
+}
+
+
 UnusedVariableRemover::UnusedVariableRemover():
        aggregate(0),
        r_assignment(0),
@@ -674,7 +710,8 @@ void UnusedVariableRemover::visit(InterfaceBlockReference &iface)
 
 void UnusedVariableRemover::visit(MemberAccess &memacc)
 {
-       r_assign_to_subfield = true;
+       if(assignment_target)
+               r_assign_to_subfield = true;
        TraversingVisitor::visit(memacc);
        unused_nodes.erase(memacc.declaration);
 }
@@ -755,7 +792,6 @@ void UnusedVariableRemover::visit(ExpressionStatement &expr)
 void UnusedVariableRemover::visit(StructDeclaration &strct)
 {
        SetForScope<Node *> set(aggregate, &strct);
-       unused_nodes.insert(&strct);
        TraversingVisitor::visit(strct);
 }
 
@@ -769,7 +805,6 @@ void UnusedVariableRemover::visit(VariableDeclaration &var)
                if(var.init_expression)
                        record_assignment(var, *var.init_expression, false);
        }
-       unused_nodes.erase(var.type_declaration);
        TraversingVisitor::visit(var);
 }