]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Mark all expression result types as used
[libs/gl.git] / source / glsl / optimize.cpp
index 43f94e8d4da10422be8a8047c238d9c61b9b6a9a..57182019012b731ba330e7fc38a1e86f1f2eeeaf 100644 (file)
@@ -1,6 +1,7 @@
 #include <msp/core/raii.h>
 #include <msp/strings/format.h>
 #include "optimize.h"
+#include "reflect.h"
 
 using namespace std;
 
@@ -119,17 +120,13 @@ void InlineableFunctionLocator::visit(Return &ret)
 
 InlineContentInjector::InlineContentInjector():
        source_func(0),
-       pass(DEPENDS)
+       pass(REFERENCED)
 { }
 
-const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_func, Block &tgt_blk, const NodeList<Statement>::iterator &ins_pt, FunctionCall &call)
+string InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_func, Block &tgt_blk, const NodeList<Statement>::iterator &ins_pt, FunctionCall &call)
 {
        source_func = call.declaration->definition;
 
-       // Collect all declarations the inlined function depends on.
-       pass = DEPENDS;
-       source_func->visit(*this);
-
        /* Populate referenced_names from the target function so we can rename
        variables from the inlined function that would conflict. */
        pass = REFERENCED;
@@ -187,7 +184,7 @@ const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &ta
 
        tgt_blk.body.splice(ins_pt, staging_block.body);
 
-       NodeReorderer().apply(stage, target_func, dependencies);
+       NodeReorderer().apply(stage, target_func, DependencyCollector().apply(*source_func));
 
        return r_result_name;
 }
@@ -200,31 +197,19 @@ void InlineContentInjector::visit(VariableReference &var)
                if(i!=staging_block.variables.end())
                        var.name = i->second->name;
        }
-       else if(pass==DEPENDS && var.declaration)
-       {
-               dependencies.insert(var.declaration);
-               var.declaration->visit(*this);
-       }
        else if(pass==REFERENCED)
                referenced_names.insert(var.name);
 }
 
 void InlineContentInjector::visit(InterfaceBlockReference &iface)
 {
-       if(pass==DEPENDS && iface.declaration)
-       {
-               dependencies.insert(iface.declaration);
-               iface.declaration->visit(*this);
-       }
-       else if(pass==REFERENCED)
+       if(pass==REFERENCED)
                referenced_names.insert(iface.name);
 }
 
 void InlineContentInjector::visit(FunctionCall &call)
 {
-       if(pass==DEPENDS && call.declaration)
-               dependencies.insert(call.declaration);
-       else if(pass==REFERENCED)
+       if(pass==REFERENCED)
                referenced_names.insert(call.name);
        TraversingVisitor::visit(call);
 }
@@ -249,11 +234,6 @@ void InlineContentInjector::visit(VariableDeclaration &var)
                        }
                }
        }
-       else if(pass==DEPENDS && var.type_declaration)
-       {
-               dependencies.insert(var.type_declaration);
-               var.type_declaration->visit(*this);
-       }
        else if(pass==REFERENCED)
                referenced_names.insert(var.type);
 }
@@ -934,33 +914,10 @@ bool UnusedTypeRemover::apply(Stage &stage)
        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)
+void UnusedTypeRemover::visit(RefPtr<Expression> &expr)
 {
-       unused_nodes.erase(binary.type);
-       TraversingVisitor::visit(binary);
-}
-
-void UnusedTypeRemover::visit(TernaryExpression &ternary)
-{
-       unused_nodes.erase(ternary.type);
-       TraversingVisitor::visit(ternary);
-}
-
-void UnusedTypeRemover::visit(FunctionCall &call)
-{
-       unused_nodes.erase(call.type);
-       TraversingVisitor::visit(call);
+       unused_nodes.erase(expr->type);
+       TraversingVisitor::visit(expr);
 }
 
 void UnusedTypeRemover::visit(BasicTypeDeclaration &type)
@@ -986,6 +943,7 @@ void UnusedTypeRemover::visit(StructDeclaration &strct)
 void UnusedTypeRemover::visit(VariableDeclaration &var)
 {
        unused_nodes.erase(var.type_declaration);
+       TraversingVisitor::visit(var);
 }
 
 void UnusedTypeRemover::visit(InterfaceBlock &iface)
@@ -1017,10 +975,6 @@ bool UnusedVariableRemover::apply(Stage &s)
                if(i->used_by.empty())
                        unused_nodes.insert(i->node);
 
-       for(map<string, InterfaceBlock *>::const_iterator i=s.interface_blocks.begin(); i!=s.interface_blocks.end(); ++i)
-               if(i->second->instance_name.empty())
-                       unused_nodes.insert(i->second);
-
        for(BlockVariableMap::const_iterator i=variables.begin(); i!=variables.end(); ++i)
        {
                if(i->second.output)
@@ -1173,16 +1127,8 @@ void UnusedVariableRemover::visit(VariableDeclaration &var)
 
 void UnusedVariableRemover::visit(InterfaceBlock &iface)
 {
-       if(iface.instance_name.empty())
-       {
-               SetForScope<InterfaceBlock *> set_block(interface_block, &iface);
-               iface.struct_declaration->members.visit(*this);
-       }
-       else
-       {
-               VariableInfo &var_info = variables[&iface];
-               var_info.output = (iface.interface=="out" && (iface.linked_block || !iface.block_name.compare(0, 3, "gl_")));
-       }
+       VariableInfo &var_info = variables[&iface];
+       var_info.output = (iface.interface=="out" && (iface.linked_block || !iface.block_name.compare(0, 3, "gl_")));
 }
 
 void UnusedVariableRemover::merge_variables(const BlockVariableMap &other_vars)