]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/generate.cpp
Add GLSL keywords for overriding functions
[libs/gl.git] / source / glsl / generate.cpp
index a2fd3608220e836d268d2310ad1ec6c8915e4550..2ff751946528f75e2a39f6a512565231ed10ce8c 100644 (file)
@@ -219,6 +219,8 @@ bool VariableResolver::apply(Stage &s)
        s.interface_blocks.clear();
        r_any_resolved = false;
        s.content.visit(*this);
+       for(vector<VariableDeclaration *>::const_iterator i=redeclared_builtins.begin(); i!=redeclared_builtins.end(); ++i)
+               (*i)->source = GENERATED_SOURCE;
        NodeRemover().apply(s, nodes_to_remove);
        return r_any_resolved;
 }
@@ -461,6 +463,12 @@ void VariableResolver::visit(VariableDeclaration &var)
                ptr = &var;
        else if(!current_block->parent && ptr->interface==var.interface && ptr->type==var.type)
        {
+               if(ptr->source==BUILTIN_SOURCE)
+                       redeclared_builtins.push_back(&var);
+               else
+                       stage->diagnostics.push_back(Diagnostic(Diagnostic::WARN, var.source, var.line,
+                               format("Redeclaring non-builtin variable '%s' is deprecated", var.name)));
+
                if(var.init_expression)
                        ptr->init_expression = var.init_expression;
                if(var.layout)
@@ -978,6 +986,15 @@ void FunctionResolver::visit(FunctionDeclaration &func)
        vector<FunctionDeclaration *> &decls = declarations[key];
        if(func.definition==&func)
        {
+               if(stage_decl && stage_decl->definition)
+               {
+                       if(!func.overrd)
+                               stage->diagnostics.push_back(Diagnostic(Diagnostic::WARN, func.source, func.line,
+                                       format("Overriding function '%s' without the override keyword is deprecated", key)));
+                       if(!stage_decl->definition->virtua)
+                               stage->diagnostics.push_back(Diagnostic(Diagnostic::WARN, func.source, func.line,
+                                       format("Overriding function '%s' not declared as virtual is deprecated", key)));
+               }
                stage_decl = &func;
 
                // Set all previous declarations to use this definition.
@@ -1216,7 +1233,8 @@ void InterfaceGenerator::visit(VariableDeclaration &var)
        }
        else if(var.interface=="in" && current_block==&stage->content)
        {
-               declared_inputs.push_back(&var);
+               if(var.name.compare(0, 3, "gl_"))
+                       declared_inputs.push_back(&var);
 
                /* Try to link input variables in global scope with output variables from
                previous stage. */