X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.cpp;h=48de1efc5992a4796411e5cadaf6618903c363e3;hb=f08bd843fbe63a0bf5bcbc21308f2751d08f00c1;hp=62c879c88a2d56c1ca99c9ef3daa2de20e69c50a;hpb=33dcf183c6394b403b340095f0cf6ac58bd8090d;p=libs%2Fgl.git diff --git a/source/glsl/generate.cpp b/source/glsl/generate.cpp index 62c879c8..48de1efc 100644 --- a/source/glsl/generate.cpp +++ b/source/glsl/generate.cpp @@ -80,7 +80,7 @@ void BlockResolver::enter(Block &block) void BlockResolver::visit(InterfaceBlock &iface) { - iface.members.anonymous = true; + current_block->interfaces.insert(&iface); TraversingVisitor::visit(iface); } @@ -114,11 +114,23 @@ void VariableResolver::visit(VariableReference &var) type = 0; for(Block *block=current_block; block; block=next_block(*block)) { - map::iterator j = block->variables.find(var.name); - if(j!=block->variables.end()) + map::iterator i = block->variables.find(var.name); + if(i!=block->variables.end()) + var.declaration = i->second; + else + { + const set &ifaces = block->interfaces; + for(set::const_iterator j=ifaces.begin(); (!var.declaration && j!=ifaces.end()); ++j) + { + i = (*j)->members.variables.find(var.name); + if(i!=(*j)->members.variables.end()) + var.declaration = i->second; + } + } + + if(var.declaration) { - var.declaration = j->second; - type = j->second->type_declaration; + type = var.declaration->type_declaration; break; } } @@ -208,8 +220,6 @@ void VariableResolver::visit(VariableDeclaration &var) TraversingVisitor::visit(var); current_block->variables[var.name] = &var; - if(current_block->anonymous && current_block->parent) - current_block->parent->variables[var.name] = &var; } void VariableResolver::visit(InterfaceBlock &iface) @@ -292,8 +302,7 @@ string InterfaceGenerator::change_prefix(const string &name, const string &prefi bool InterfaceGenerator::generate_interface(VariableDeclaration &var, const string &iface, const string &name) { - const map &stage_vars = (iface=="in" ? stage->in_variables : stage->out_variables); - if(stage_vars.count(name)) + if(stage->content.variables.count(name)) return false; VariableDeclaration* iface_var = new VariableDeclaration; @@ -309,12 +318,12 @@ bool InterfaceGenerator::generate_interface(VariableDeclaration &var, const stri if(iface_var->array) iface_var->array_size = var.array_size; if(iface=="in") - iface_var->linked_declaration = &var; - stage->content.body.insert(iface_insert_point, iface_var); { - SetForScope set_block(current_block, &stage->content); - iface_var->visit(*this); + iface_var->linked_declaration = &var; + var.linked_declaration = iface_var; } + stage->content.body.insert(iface_insert_point, iface_var); + stage->content.variables[name] = iface_var; return true; } @@ -342,14 +351,14 @@ void InterfaceGenerator::visit(VariableReference &var) return; /* Don't pull a variable from previous stage if we just generated an out interface in this stage */ - if(stage->out_variables.count(var.name)) + if(stage->content.variables.count(var.name)) return; - const map &prev_out = stage->previous->out_variables; - map::const_iterator i = prev_out.find(var.name); - if(i==prev_out.end()) - i = prev_out.find(in_prefix+var.name); - if(i!=prev_out.end()) + const map &prev_vars = stage->previous->content.variables; + map::const_iterator i = prev_vars.find(var.name); + if(i==prev_vars.end() || i->second->interface!="out") + i = prev_vars.find(in_prefix+var.name); + if(i!=prev_vars.end() && i->second->interface=="out") { generate_interface(*i->second, "in", i->second->name); var.name = i->second->name; @@ -360,9 +369,7 @@ void InterfaceGenerator::visit(VariableDeclaration &var) { if(var.interface=="out") { - if(current_block==&stage->content) - stage->out_variables[var.name] = &var; - else if(generate_interface(var, "out", change_prefix(var.name, string()))) + if(current_block!=&stage->content && generate_interface(var, "out", change_prefix(var.name, string()))) { nodes_to_remove.insert(&var); if(var.init_expression) @@ -376,14 +383,11 @@ void InterfaceGenerator::visit(VariableDeclaration &var) } else if(var.interface=="in") { - stage->in_variables[var.name] = &var; - if(var.linked_declaration) - var.linked_declaration->linked_declaration = &var; - else if(stage->previous) + if(!var.linked_declaration && stage->previous) { - const map &prev_out = stage->previous->out_variables; - map::const_iterator i = prev_out.find(var.name); - if(i!=prev_out.end()) + const map &prev_vars = stage->previous->content.variables; + map::const_iterator i = prev_vars.find(var.name); + if(i!=prev_vars.end() && i->second->interface=="out") { var.linked_declaration = i->second; i->second->linked_declaration = &var; @@ -404,13 +408,14 @@ void InterfaceGenerator::visit(Passthrough &pass) { vector pass_vars; - for(map::const_iterator i=stage->in_variables.begin(); i!=stage->in_variables.end(); ++i) - pass_vars.push_back(i->second); + for(map::const_iterator i=stage->content.variables.begin(); i!=stage->content.variables.end(); ++i) + if(i->second->interface=="in") + pass_vars.push_back(i->second); if(stage->previous) { - const map &prev_out = stage->previous->out_variables; - for(map::const_iterator i=prev_out.begin(); i!=prev_out.end(); ++i) + const map &prev_vars = stage->previous->content.variables; + for(map::const_iterator i=prev_vars.begin(); i!=prev_vars.end(); ++i) { bool linked = false; for(vector::const_iterator j=pass_vars.begin(); (!linked && j!=pass_vars.end()); ++j)