]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/output.cpp
Output the passthrough statement in both GLSL and debug modes
[libs/gl.git] / source / glsl / output.cpp
index 6e88fd1f870e6ba554a0fbfa0ddaba93d6347720..46314588858667c059a80c131bb6f527b3ba9bc6 100644 (file)
@@ -10,31 +10,39 @@ namespace SL {
 
 Formatter::Formatter():
        stage(0),
+       mode(Compiler::PROGRAM),
        source_index(0),
        source_line(1),
        indent(0),
        parameter_list(false)
 { }
 
-const string &Formatter::apply(Stage &s)
+const string &Formatter::apply(Stage &s, Compiler::Mode m)
 {
-       SetForScope<Stage *> set_stage(stage, &s);
+       mode = m;
+       stage = &s;
 
-       GLApi api = get_gl_api();
-       const Version &ver = s.required_version;
+       const Version &ver = s.required_features.glsl_version;
 
        if(ver)
        {
                append(format("#version %d%02d", ver.major, ver.minor));
-               if(api==OPENGL_ES2 && ver>=Version(3, 0))
+               if(s.required_features.gl_api==OPENGL_ES2 && ver>=Version(3, 0))
                        append(" es");
                formatted += '\n';
        }
 
-       for(vector<const Extension *>::const_iterator i=s.required_extensions.begin(); i!=s.required_extensions.end(); ++i)
-               append(format("#extension %s: require\n", (*i)->get_name()));
-       if(!s.required_extensions.empty())
-               formatted += '\n';
+       if(s.required_features.arb_explicit_attrib_location)
+               append("#extension arb_explicit_attrib_location: require\n");
+       if(s.required_features.arb_gpu_shader5)
+               append("#extension arb_gpu_shader5: require\n");
+       if(s.required_features.arb_uniform_buffer_object)
+               append("#extension arb_uniform_buffer_object: require\n");
+       if(s.required_features.ext_gpu_shader4)
+               append("#extension ext_gpu_shader4: require\n");
+       if(s.required_features.ext_texture_array)
+               append("#extension ext_texture_array: require\n");
+       formatted += '\n';
 
        visit(s.content);
 
@@ -65,7 +73,7 @@ void Formatter::set_source(unsigned index, unsigned line)
                else
                {
                        unsigned l = line;
-                       if(stage->required_version<Version(3, 30))
+                       if(mode==Compiler::PROGRAM && stage && stage->required_features.glsl_version<Version(3, 30))
                                --l;
                        formatted += format("#line %d %d\n", l, index);
                }
@@ -178,9 +186,9 @@ void Formatter::visit(Layout &layout)
        {
                if(i!=layout.qualifiers.begin())
                        append(", ");
-               append(i->identifier);
-               if(!i->value.empty())
-                       append(format("=%s", i->value));
+               append(i->name);
+               if(i->has_value)
+                       append(format("=%d", i->value));
        }
        append(')');
 }
@@ -214,7 +222,7 @@ void Formatter::visit(VariableDeclaration &var)
        if(!var.interface.empty() && var.interface!=block_interface)
        {
                string interface = var.interface;
-               if(stage->required_version<Version(1, 30))
+               if(mode==Compiler::PROGRAM && stage && stage->required_features.glsl_version<Version(1, 30))
                {
                        if(stage->type==Stage::VERTEX && var.interface=="in")
                                interface = "attribute";
@@ -333,6 +341,18 @@ void Formatter::visit(Iteration &iter)
        }
 }
 
+void Formatter::visit(Passthrough &pass)
+{
+       append("passthrough");
+       if(pass.subscript)
+       {
+               append('[');
+               pass.subscript->visit(*this);
+               append(']');
+       }
+       append(';');
+}
+
 void Formatter::visit(Return &ret)
 {
        append("return");