]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/builtin.cpp
Make builtins const
[libs/gl.git] / source / glsl / builtin.cpp
index 1fd496b40c5e8210636960d2a69644363844e95a..3800e14bbc0d412552e679f3e2697c514d1deba4 100644 (file)
@@ -1,29 +1,10 @@
+#include <msp/gl/resources.h>
+#include <msp/io/seekable.h>
 #include "builtin.h"
-#include "generate.h"
 #include "parser.h"
 
 using namespace std;
 
-namespace {
-
-const char builtins_src[] =
-       "#pragma MSP stage(vertex)\n"
-       "out gl_PerVertex {\n"
-       "  vec4 gl_Position;\n"
-       "  float gl_ClipDistance[];\n"
-       "};\n"
-       "#pragma MSP stage(geometry)\n"
-       "in gl_PerVertex {\n"
-       "  vec4 gl_Position;\n"
-       "  float gl_ClipDistance[];\n"
-       "} gl_in[];\n"
-       "out gl_PerVertex {\n"
-       "  vec4 gl_Position;\n"
-       "  float gl_ClipDistance[];\n"
-       "};\n";
-
-}
-
 namespace Msp {
 namespace GL {
 namespace SL {
@@ -36,26 +17,26 @@ Module *get_builtins_module()
        {
                initialized = true;
 
+               RefPtr<IO::Seekable> io = Resources::get_builtins().open("_builtin.glsl");
+               if(!io)
+                       return 0;
+
                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;
-               }
+               Module *module = new Module(parser.parse(*io, "<builtin>", BUILTIN_SOURCE));
 
                builtins_module = module;
        }
        return builtins_module.get();
 }
 
-Stage *get_builtins(Stage::Type type)
+const Stage *get_builtins(Stage::Type type)
 {
        Module *module = get_builtins_module();
        if(!module)
                return 0;
 
+       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;