]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/output.cpp
Always use member access for interface blocks, even anonymous ones
[libs/gl.git] / source / glsl / output.cpp
index b86cdd0a0ad4f75082d49146c05ae892e5684b16..38adb5bd6b799f54f165299657b90f09830293de 100644 (file)
@@ -14,7 +14,8 @@ Formatter::Formatter():
        source_line(1),
        indent(0),
        parameter_list(false),
-       omit_builtin(false)
+       omit_builtin(false),
+       r_empty_name(false)
 { }
 
 const string &Formatter::apply(Stage &s)
@@ -32,10 +33,16 @@ const string &Formatter::apply(Stage &s)
                formatted += '\n';
        }
 
+       if(s.required_features.arb_enhanced_layouts)
+               append("#extension GL_ARB_enhanced_layouts: require\n");
        if(s.required_features.arb_explicit_attrib_location)
                append("#extension GL_ARB_explicit_attrib_location: require\n");
+       if(s.required_features.arb_explicit_uniform_location)
+               append("#extension GL_ARB_explicit_uniform_location: require\n");
        if(s.required_features.arb_gpu_shader5)
                append("#extension GL_ARB_gpu_shader5: require\n");
+       if(s.required_features.arb_separate_shader_objects)
+               append("#extension GL_ARB_separate_shader_objects: require\n");
        if(s.required_features.arb_uniform_buffer_object)
                append("#extension GL_ARB_uniform_buffer_object: require\n");
        if(s.required_features.ext_gpu_shader4)
@@ -148,17 +155,22 @@ void Formatter::visit(Literal &literal)
 void Formatter::visit(VariableReference &var)
 {
        append(var.name);
+       r_empty_name = false;
 }
 
 void Formatter::visit(InterfaceBlockReference &iface)
 {
-       append(iface.name);
+       r_empty_name = iface.declaration->instance_name.empty();
+       if(!r_empty_name)
+               append(iface.declaration->instance_name);
 }
 
 void Formatter::visit(MemberAccess &memacc)
 {
        visit_expression(*memacc.left, memacc.oper, false);
-       append(format(".%s", memacc.member));
+       if(!r_empty_name)
+               append('.');
+       append(memacc.member);
 }
 
 void Formatter::visit(Swizzle &swizzle)