X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.cpp;h=fe053ade254c3105d80771a72d575b264583946a;hb=3f899b1fc2e04f4fe74c99ad3e8ebb900c257214;hp=2ac37a6ffae788a16c6cc367dbcf53b9fdb61dcb;hpb=6288c42adde9ee7d39a47de51fa2856cf965dccc;p=libs%2Fgl.git diff --git a/source/glsl/generate.cpp b/source/glsl/generate.cpp index 2ac37a6f..fe053ade 100644 --- a/source/glsl/generate.cpp +++ b/source/glsl/generate.cpp @@ -24,20 +24,6 @@ void DeclarationCombiner::visit(Block &block) TraversingVisitor::visit(block); } -void DeclarationCombiner::visit(FunctionDeclaration &func) -{ - vector &decls = functions[func.name]; - if(func.definition) - { - for(vector::iterator i=decls.begin(); i!=decls.end(); ++i) - { - (*i)->definition = func.definition; - (*i)->body.body.clear(); - } - } - decls.push_back(&func); -} - void DeclarationCombiner::visit(VariableDeclaration &var) { VariableDeclaration *&ptr = variables[var.name]; @@ -113,22 +99,16 @@ 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; } } } -void BlockResolver::enter(Block &block) +void BlockHierarchyResolver::enter(Block &block) { block.parent = current_block; } @@ -146,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); @@ -323,29 +305,44 @@ 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]; - if(func.definition) + 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; - decls.clear(); - decls.push_back(&func); + (*i)->body.body.clear(); + } } - else if(!decls.empty() && decls.back()->definition) - func.definition = decls.back()->definition; else - decls.push_back(&func); + { + if(!stage_decl) + stage_decl = &func; + + func.definition = stage_decl->definition; + } + decls.push_back(&func); TraversingVisitor::visit(func); } @@ -416,9 +413,9 @@ bool InterfaceGenerator::generate_interface(VariableDeclaration &var, const stri iface_var->array = var.array; if(iface_var->array) iface_var->array_size = var.array_size; - iface_var->layout = var.layout; if(iface=="in") { + iface_var->layout = var.layout; iface_var->linked_declaration = &var; var.linked_declaration = iface_var; }