]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/generate.cpp
Ignore function parameters in InterfaceGenerator
[libs/gl.git] / source / glsl / generate.cpp
index ca4d41e64c7a8c63bf51fd8d446e5ccb4dc8bd5a..62c879c88a2d56c1ca99c9ef3daa2de20e69c50a 100644 (file)
@@ -73,10 +73,9 @@ void DeclarationCombiner::visit(VariableDeclaration &var)
 }
 
 
-void BlockResolver::visit(Block &block)
+void BlockResolver::enter(Block &block)
 {
        block.parent = current_block;
-       TraversingVisitor::visit(block);
 }
 
 void BlockResolver::visit(InterfaceBlock &iface)
@@ -104,12 +103,9 @@ Block *VariableResolver::next_block(Block &block)
        return block.parent ? block.parent : &block!=builtins ? builtins : 0;
 }
 
-void VariableResolver::visit(Block &block)
+void VariableResolver::enter(Block &block)
 {
-       if(current_block!=&block)
-               block.variables.clear();
-
-       TraversingVisitor::visit(block);
+       block.variables.clear();
 }
 
 void VariableResolver::visit(VariableReference &var)
@@ -222,20 +218,6 @@ void VariableResolver::visit(InterfaceBlock &iface)
        TraversingVisitor::visit(iface);
 }
 
-void VariableResolver::visit(FunctionDeclaration &func)
-{
-       SetForScope<Block *> set_block(current_block, &func.body);
-       func.body.variables.clear();
-       TraversingVisitor::visit(func);
-}
-
-void VariableResolver::visit(Iteration &iter)
-{
-       SetForScope<Block *> set_block(current_block, &iter.body);
-       iter.body.variables.clear();
-       TraversingVisitor::visit(iter);
-}
-
 
 void FunctionResolver::visit(FunctionCall &call)
 {
@@ -358,6 +340,10 @@ void InterfaceGenerator::visit(VariableReference &var)
 {
        if(var.declaration || !stage->previous)
                return;
+       /* Don't pull a variable from previous stage if we just generated an out
+       interface in this stage */
+       if(stage->out_variables.count(var.name))
+               return;
 
        const map<string, VariableDeclaration *> &prev_out = stage->previous->out_variables;
        map<string, VariableDeclaration *>::const_iterator i = prev_out.find(var.name);
@@ -408,6 +394,12 @@ void InterfaceGenerator::visit(VariableDeclaration &var)
        TraversingVisitor::visit(var);
 }
 
+void InterfaceGenerator::visit(FunctionDeclaration &func)
+{
+       // Skip parameters because they're not useful here
+       func.body.visit(*this);
+}
+
 void InterfaceGenerator::visit(Passthrough &pass)
 {
        vector<VariableDeclaration *> pass_vars;