]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/builtin.cpp
Refactor creation of the shader builtin module
[libs/gl.git] / source / glsl / builtin.cpp
index 7aecda3c244bbd31d028021687f1352bc9dd584e..1fd496b40c5e8210636960d2a69644363844e95a 100644 (file)
@@ -28,30 +28,35 @@ namespace Msp {
 namespace GL {
 namespace SL {
 
-Module *create_builtins_module()
+Module *get_builtins_module()
 {
-       Parser parser;
-       Module *module = new Module(parser.parse(builtins_src, "<builtin>"));
-       for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+       static RefPtr<Module> builtins_module;
+       static bool initialized = false;
+       if(!initialized)
        {
-               VariableResolver resolver;
-               i->content.visit(resolver);
-               for(map<string, VariableDeclaration *>::iterator j=i->content.variables.begin(); j!=i->content.variables.end(); ++j)
-                       j->second->linked_declaration = j->second;
+               initialized = true;
+
+               Parser parser;
+               Module *module = new Module(parser.parse(builtins_src, "<builtin>"));
+               for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+               {
+                       VariableResolver().apply(*i);
+                       for(map<string, VariableDeclaration *>::iterator j=i->content.variables.begin(); j!=i->content.variables.end(); ++j)
+                               j->second->linked_declaration = j->second;
+               }
+
+               builtins_module = module;
        }
-       return module;
+       return builtins_module.get();
 }
 
-Module &get_builtins_module()
+Stage *get_builtins(Stage::Type type)
 {
-       static RefPtr<Module> builtins_module = create_builtins_module();
-       return *builtins_module;
-}
+       Module *module = get_builtins_module();
+       if(!module)
+               return 0;
 
-Stage *get_builtins(StageType type)
-{
-       Module &module = get_builtins_module();
-       for(list<Stage>::iterator i=module.stages.begin(); i!=module.stages.end(); ++i)
+       for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
                if(i->type==type)
                        return &*i;
        return 0;