]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/builtin.cpp
Use a different method of adding builtins to stages
[libs/gl.git] / source / glsl / builtin.cpp
index 7aecda3c244bbd31d028021687f1352bc9dd584e..955266fe0a1ce4ad3a8abfcd9fb3afb0340266f8 100644 (file)
@@ -1,5 +1,4 @@
 #include "builtin.h"
-#include "generate.h"
 #include "parser.h"
 
 using namespace std;
@@ -28,30 +27,31 @@ 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>", BUILTIN_SOURCE));
+
+               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)
+       if(type==Stage::SHARED)
+               return &module->shared;
+       for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
                if(i->type==type)
                        return &*i;
        return 0;