]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/validate.cpp
Transform interface block contents into structs
[libs/gl.git] / source / glsl / validate.cpp
index fcccb526e0dc3bc62831e3c949f8bb767b929591..b0c6e3d67acb29cb178bbdeb1e7d2812ea16f5be 100644 (file)
@@ -149,8 +149,13 @@ void DeclarationValidator::visit(InterfaceBlock &iface)
        if(!iface.instance_name.empty())
                check_definition(iface.instance_name, iface);
 
-       SetFlag set_anon(anonymous_block, iface.instance_name.empty());
-       TraversingVisitor::visit(iface);
+       if(iface.instance_name.empty() && iface.struct_declaration)
+       {
+               // Inject anonymous interface block members into the global scope
+               const map<string, VariableDeclaration *> &iface_vars = iface.struct_declaration->members.variables;
+               for(map<string, VariableDeclaration *>::const_iterator j=iface_vars.begin(); j!=iface_vars.end(); ++j)
+                       check_definition(j->first, *j->second);
+       }
 }
 
 void DeclarationValidator::visit(FunctionDeclaration &func)
@@ -207,6 +212,13 @@ void ReferenceValidator::visit(VariableDeclaration &var)
        TraversingVisitor::visit(var);
 }
 
+void ReferenceValidator::visit(InterfaceBlock &iface)
+{
+       if(!iface.struct_declaration)
+               error(iface, format("Interface block '%s %s' lacks a struct declaration", iface.interface, iface.name));
+       TraversingVisitor::visit(iface);
+}
+
 void ReferenceValidator::visit(FunctionDeclaration &func)
 {
        if(!func.return_type_declaration)