X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.cpp;h=11116b11ecb164cb704fdcf277de380ac882ba82;hb=2e0ed3f7d23f09de7b4b09c2f132c316ce703d9a;hp=a2fd3608220e836d268d2310ad1ec6c8915e4550;hpb=27e7b634d31498783ea6d24b72f02f3f1287851d;p=libs%2Fgl.git diff --git a/source/glsl/generate.cpp b/source/glsl/generate.cpp index a2fd3608..11116b11 100644 --- a/source/glsl/generate.cpp +++ b/source/glsl/generate.cpp @@ -219,6 +219,8 @@ bool VariableResolver::apply(Stage &s) s.interface_blocks.clear(); r_any_resolved = false; s.content.visit(*this); + for(vector::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) @@ -611,12 +619,6 @@ void ExpressionResolver::visit(Literal &literal) resolve(literal, find_type(BasicTypeDeclaration::FLOAT, 32), false); } -void ExpressionResolver::visit(ParenthesizedExpression &parexpr) -{ - TraversingVisitor::visit(parexpr); - resolve(parexpr, parexpr.expression->type, parexpr.expression->lvalue); -} - void ExpressionResolver::visit(VariableReference &var) { if(var.declaration) @@ -935,22 +937,28 @@ bool FunctionResolver::apply(Stage &s) void FunctionResolver::visit(FunctionCall &call) { - string arg_types; - bool has_signature = true; - for(NodeArray::const_iterator i=call.arguments.begin(); (has_signature && i!=call.arguments.end()); ++i) - { - if((*i)->type) - append(arg_types, ",", (*i)->type->name); - else - has_signature = false; - } - FunctionDeclaration *declaration = 0; - if(has_signature) + if(stage->types.count(call.name)) + call.constructor = true; + else { - map::iterator i = stage->functions.find(format("%s(%s)", call.name, arg_types)); - declaration = (i!=stage->functions.end() ? i->second : 0); + string arg_types; + bool has_signature = true; + for(NodeArray::const_iterator i=call.arguments.begin(); (has_signature && i!=call.arguments.end()); ++i) + { + if((*i)->type) + append(arg_types, ",", (*i)->type->name); + else + has_signature = false; + } + + if(has_signature) + { + map::iterator i = stage->functions.find(format("%s(%s)", call.name, arg_types)); + declaration = (i!=stage->functions.end() ? i->second : 0); + } } + r_any_resolved |= (declaration!=call.declaration); call.declaration = declaration; @@ -978,6 +986,15 @@ void FunctionResolver::visit(FunctionDeclaration &func) vector &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. */