X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.cpp;h=fe053ade254c3105d80771a72d575b264583946a;hb=3f899b1fc2e04f4fe74c99ad3e8ebb900c257214;hp=13b62aa32296a3d6c93c851827387205c08bfed1;hpb=f6dfd3e78fc8c4c4a14619f3fdece53600ab0db7;p=libs%2Fgl.git diff --git a/source/glsl/generate.cpp b/source/glsl/generate.cpp index 13b62aa3..fe053ade 100644 --- a/source/glsl/generate.cpp +++ b/source/glsl/generate.cpp @@ -99,15 +99,9 @@ void ConstantSpecializer::visit(VariableDeclaration &var) { RefPtr literal = new Literal; if(var.type=="bool") - { literal->token = (i->second ? "true" : "false"); - literal->value = static_cast(i->second); - } else if(var.type=="int") - { literal->token = lexical_cast(i->second); - literal->value = i->second; - } var.init_expression = literal; } } @@ -132,6 +126,8 @@ VariableResolver::VariableResolver(): void VariableResolver::apply(Stage &s) { stage = &s; + s.types.clear(); + s.interface_blocks.clear(); Stage *builtin_stage = get_builtins(s.type); builtins = (builtin_stage ? &builtin_stage->content : 0); s.content.visit(*this); @@ -309,28 +305,43 @@ void VariableResolver::visit(InterfaceBlock &iface) } +void FunctionResolver::apply(Stage &s) +{ + stage = &s; + s.functions.clear(); + s.content.visit(*this); +} + void FunctionResolver::visit(FunctionCall &call) { - map >::iterator i = functions.find(call.name); - if(i!=functions.end()) - call.declaration = i->second.back(); + map::iterator i = stage->functions.find(call.name); + if(i!=stage->functions.end()) + call.declaration = i->second; TraversingVisitor::visit(call); } void FunctionResolver::visit(FunctionDeclaration &func) { - vector &decls = functions[func.name]; + FunctionDeclaration *&stage_decl = stage->functions[func.name]; + vector &decls = declarations[func.name]; if(func.definition==&func) { + stage_decl = &func; + for(vector::iterator i=decls.begin(); i!=decls.end(); ++i) { (*i)->definition = func.definition; (*i)->body.body.clear(); } } - else if(!decls.empty() && decls.back()->definition) - func.definition = decls.back()->definition; + else + { + if(!stage_decl) + stage_decl = &func; + + func.definition = stage_decl->definition; + } decls.push_back(&func); TraversingVisitor::visit(func);