]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Fix function inlining regressions
[libs/gl.git] / source / glsl / optimize.cpp
index d57002552540c6c375cb7446f8465a9538a0a42d..7b3f8f28c8ad00007b520446ed5c2cc1180c49d0 100644 (file)
@@ -102,8 +102,7 @@ const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &ta
                SetForScope<Pass> set_pass(pass, RENAME);
                var->visit(*this);
 
-               staging_block.body.push_back(0);
-               staging_block.body.back() = var;
+               staging_block.body.push_back_nocopy(var);
                params.push_back(var);
        }
 
@@ -117,8 +116,7 @@ const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &ta
                SetForScope<Pass> set_pass(pass, RENAME);
                r_inlined_statement->visit(*this);
 
-               staging_block.body.push_back(0);
-               staging_block.body.back() = r_inlined_statement;
+               staging_block.body.push_back_nocopy(r_inlined_statement);
        }
 
        /* Now collect names from the staging block.  Local variables that would
@@ -188,8 +186,11 @@ void InlineContentInjector::visit(VariableDeclaration &var)
 
        if(pass==RENAME)
        {
+               /* Check against conflicts with the other context as well as variables
+               already renamed here. */
+               bool conflict = (staging_block.variables.count(var.name) || referenced_names.count(var.name));
                staging_block.variables[var.name] = &var;
-               if(referenced_names.count(var.name))
+               if(conflict)
                {
                        string mapped_name = get_unused_variable_name(staging_block, var.name);
                        if(mapped_name!=var.name)
@@ -267,12 +268,12 @@ void FunctionInliner::visit(Block &block)
 
 void FunctionInliner::visit(FunctionCall &call)
 {
+       for(NodeArray<Expression>::iterator i=call.arguments.begin(); (!r_inlined_here && i!=call.arguments.end()); ++i)
+               visit(*i);
+
        if(r_inlined_here)
                return;
 
-       for(NodeArray<Expression>::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i)
-               visit(*i);
-
        FunctionDeclaration *def = call.declaration;
        if(def)
                def = def->definition;
@@ -1118,7 +1119,7 @@ void UnusedVariableRemover::visit(VariableDeclaration &var)
        /* Mark variables as output if they're used by the next stage or the
        graphics API. */
        if(interface_block)
-               var_info.output = (interface_block->interface=="out" && (interface_block->linked_block || !interface_block->name.compare(0, 3, "gl_")));
+               var_info.output = (interface_block->interface=="out" && (interface_block->linked_block || !interface_block->block_name.compare(0, 3, "gl_")));
        else
                var_info.output = (var.interface=="out" && (stage->type==Stage::FRAGMENT || var.linked_declaration || !var.name.compare(0, 3, "gl_")));
 
@@ -1140,7 +1141,7 @@ void UnusedVariableRemover::visit(InterfaceBlock &iface)
        else
        {
                VariableInfo &var_info = variables[&iface];
-               var_info.output = (iface.interface=="out" && (iface.linked_block || !iface.name.compare(0, 3, "gl_")));
+               var_info.output = (iface.interface=="out" && (iface.linked_block || !iface.block_name.compare(0, 3, "gl_")));
        }
 }