]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/builtin.cpp
Split SL::Compiler into several files
[libs/gl.git] / source / glsl / builtin.cpp
diff --git a/source/glsl/builtin.cpp b/source/glsl/builtin.cpp
new file mode 100644 (file)
index 0000000..7aecda3
--- /dev/null
@@ -0,0 +1,62 @@
+#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 {
+
+Module *create_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)
+       {
+               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;
+       }
+       return module;
+}
+
+Module &get_builtins_module()
+{
+       static RefPtr<Module> builtins_module = create_builtins_module();
+       return *builtins_module;
+}
+
+Stage *get_builtins(StageType type)
+{
+       Module &module = get_builtins_module();
+       for(list<Stage>::iterator i=module.stages.begin(); i!=module.stages.end(); ++i)
+               if(i->type==type)
+                       return &*i;
+       return 0;
+}
+
+} // namespace SL
+} // namespace GL
+} // namespace Msp