]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/generate.cpp
Clear the stage map at the beginning if a resolving pass
[libs/gl.git] / source / glsl / generate.cpp
index 30dca25a2939c28068f3493e18275ebd51ca0026..fe053ade254c3105d80771a72d575b264583946a 100644 (file)
@@ -24,20 +24,6 @@ void DeclarationCombiner::visit(Block &block)
        TraversingVisitor::visit(block);
 }
 
-void DeclarationCombiner::visit(FunctionDeclaration &func)
-{
-       vector<FunctionDeclaration *> &decls = functions[func.name];
-       if(func.definition)
-       {
-               for(vector<FunctionDeclaration *>::iterator i=decls.begin(); i!=decls.end(); ++i)
-               {
-                       (*i)->definition = func.definition;
-                       (*i)->body.body.clear();
-               }
-       }
-       decls.push_back(&func);
-}
-
 void DeclarationCombiner::visit(VariableDeclaration &var)
 {
        VariableDeclaration *&ptr = variables[var.name];
@@ -113,22 +99,16 @@ void ConstantSpecializer::visit(VariableDeclaration &var)
                {
                        RefPtr<Literal> literal = new Literal;
                        if(var.type=="bool")
-                       {
                                literal->token = (i->second ? "true" : "false");
-                               literal->value = static_cast<bool>(i->second);
-                       }
                        else if(var.type=="int")
-                       {
                                literal->token = lexical_cast<string>(i->second);
-                               literal->value = i->second;
-                       }
                        var.init_expression = literal;
                }
        }
 }
 
 
-void BlockResolver::enter(Block &block)
+void BlockHierarchyResolver::enter(Block &block)
 {
        block.parent = current_block;
 }
@@ -146,6 +126,8 @@ VariableResolver::VariableResolver():
 void VariableResolver::apply(Stage &s)
 {
        stage = &s;
+       s.types.clear();
+       s.interface_blocks.clear();
        Stage *builtin_stage = get_builtins(s.type);
        builtins = (builtin_stage ? &builtin_stage->content : 0);
        s.content.visit(*this);
@@ -323,29 +305,44 @@ void VariableResolver::visit(InterfaceBlock &iface)
 }
 
 
+void FunctionResolver::apply(Stage &s)
+{
+       stage = &s;
+       s.functions.clear();
+       s.content.visit(*this);
+}
+
 void FunctionResolver::visit(FunctionCall &call)
 {
-       map<string, vector<FunctionDeclaration *> >::iterator i = functions.find(call.name);
-       if(i!=functions.end())
-               call.declaration = i->second.back();
+       map<string, FunctionDeclaration *>::iterator i = stage->functions.find(call.name);
+       if(i!=stage->functions.end())
+               call.declaration = i->second;
 
        TraversingVisitor::visit(call);
 }
 
 void FunctionResolver::visit(FunctionDeclaration &func)
 {
-       vector<FunctionDeclaration *> &decls = functions[func.name];
-       if(func.definition)
+       FunctionDeclaration *&stage_decl = stage->functions[func.name];
+       vector<FunctionDeclaration *> &decls = declarations[func.name];
+       if(func.definition==&func)
        {
+               stage_decl = &func;
+
                for(vector<FunctionDeclaration *>::iterator i=decls.begin(); i!=decls.end(); ++i)
+               {
                        (*i)->definition = func.definition;
-               decls.clear();
-               decls.push_back(&func);
+                       (*i)->body.body.clear();
+               }
        }
-       else if(!decls.empty() && decls.back()->definition)
-               func.definition = decls.back()->definition;
        else
-               decls.push_back(&func);
+       {
+               if(!stage_decl)
+                       stage_decl = &func;
+
+               func.definition = stage_decl->definition;
+       }
+       decls.push_back(&func);
 
        TraversingVisitor::visit(func);
 }