]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Assign a result type to all expressions
[libs/gl.git] / source / glsl / optimize.cpp
index 137bd94343190f275eebbaa877dfa554b4785a50..1aad8d1b311adcecf27904b8e29efb49892d98a6 100644 (file)
@@ -622,6 +622,68 @@ UnusedVariableRemover::VariableInfo::VariableInfo():
 { }
 
 
+bool UnusedTypeRemover::apply(Stage &stage)
+{
+       stage.content.visit(*this);
+       NodeRemover().apply(stage, unused_nodes);
+       return !unused_nodes.empty();
+}
+
+void UnusedTypeRemover::visit(Literal &literal)
+{
+       unused_nodes.erase(literal.type);
+}
+
+void UnusedTypeRemover::visit(UnaryExpression &unary)
+{
+       unused_nodes.erase(unary.type);
+       TraversingVisitor::visit(unary);
+}
+
+void UnusedTypeRemover::visit(BinaryExpression &binary)
+{
+       unused_nodes.erase(binary.type);
+       TraversingVisitor::visit(binary);
+}
+
+void UnusedTypeRemover::visit(FunctionCall &call)
+{
+       unused_nodes.erase(call.type);
+       TraversingVisitor::visit(call);
+}
+
+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);
+       TraversingVisitor::visit(strct);
+}
+
+void UnusedTypeRemover::visit(VariableDeclaration &var)
+{
+       unused_nodes.erase(var.type_declaration);
+}
+
+void UnusedTypeRemover::visit(FunctionDeclaration &func)
+{
+       unused_nodes.erase(func.return_type_declaration);
+       TraversingVisitor::visit(func);
+}
+
+
 UnusedVariableRemover::UnusedVariableRemover():
        aggregate(0),
        r_assignment(0),
@@ -760,7 +822,6 @@ void UnusedVariableRemover::visit(ExpressionStatement &expr)
 void UnusedVariableRemover::visit(StructDeclaration &strct)
 {
        SetForScope<Node *> set(aggregate, &strct);
-       unused_nodes.insert(&strct);
        TraversingVisitor::visit(strct);
 }
 
@@ -774,7 +835,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);
 }