X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.cpp;h=ad8515a94392568d4823d84bc3595c44dc9945ee;hb=d72d8a9163e342167f35360c807ee9ea5ebacdc2;hp=0a469a46e1dd79b07ad73b82d594e41c11fd5749;hpb=2dec8ba3f45ff2dfa3144e63c67d673e79a58b3b;p=libs%2Fgl.git diff --git a/source/glsl/generate.cpp b/source/glsl/generate.cpp index 0a469a46..ad8515a9 100644 --- a/source/glsl/generate.cpp +++ b/source/glsl/generate.cpp @@ -157,8 +157,8 @@ void VariableResolver::visit(VariableReference &var) else { const map &blocks = stage->interface_blocks; - map::const_iterator i = blocks.find(var.name); - if(i!=blocks.end() && i->second->instance_name==var.name) + map::const_iterator i = blocks.find("_"+var.name); + if(i!=blocks.end()) { /* The name refers to an interface block with an instance name rather than a variable. Prepare a new syntax tree node accordingly. */ @@ -201,7 +201,7 @@ void VariableResolver::visit(InterfaceBlockReference &iface) iface.declaration = 0; for(Block *block=current_block; block; block=block->parent) { - map::iterator i = stage->interface_blocks.find(iface.name); + map::iterator i = stage->interface_blocks.find("_"+iface.name); if(i!=stage->interface_blocks.end()) { iface.declaration = i->second; @@ -313,11 +313,11 @@ void VariableResolver::visit(VariableDeclaration &var) void VariableResolver::visit(InterfaceBlock &iface) { - /* Block names can't be used for any other identifiers so we can put them - in the same map with instance names. */ - stage->interface_blocks.insert(make_pair(iface.name, &iface)); + /* Block names can be reused in different interfaces. Prefix the name with + the first character of the interface to avoid conflicts. */ + stage->interface_blocks.insert(make_pair(iface.interface+iface.name, &iface)); if(!iface.instance_name.empty()) - stage->interface_blocks.insert(make_pair(iface.instance_name, &iface)); + stage->interface_blocks.insert(make_pair("_"+iface.instance_name, &iface)); SetForScope set_iface(block_interface, iface.interface); TraversingVisitor::visit(iface); @@ -450,7 +450,7 @@ VariableDeclaration *InterfaceGenerator::generate_interface(VariableDeclaration InterfaceBlock *InterfaceGenerator::generate_interface(InterfaceBlock &out_block) { - if(stage->interface_blocks.count(out_block.name)) + if(stage->interface_blocks.count("in"+out_block.name)) return 0; InterfaceBlock *in_block = new InterfaceBlock; @@ -472,9 +472,9 @@ InterfaceBlock *InterfaceGenerator::generate_interface(InterfaceBlock &out_block } iface_target_block->body.insert(iface_insert_point, in_block); - stage->interface_blocks.insert(make_pair(in_block->name, in_block)); + stage->interface_blocks.insert(make_pair("in"+in_block->name, in_block)); if(!in_block->instance_name.empty()) - stage->interface_blocks.insert(make_pair(in_block->instance_name, in_block)); + stage->interface_blocks.insert(make_pair("_"+in_block->instance_name, in_block)); SetFlag set_scope(function_scope, false); SetForScope set_block(current_block, &stage->content); @@ -521,10 +521,12 @@ void InterfaceGenerator::visit(VariableReference &var) } const map &prev_blocks = stage->previous->interface_blocks; - map::const_iterator j = prev_blocks.find(var.name); - if(j!=prev_blocks.end() && j->second->interface=="out" && j->second->instance_name==var.name) + map::const_iterator j = prev_blocks.find("_"+var.name); + if(j!=prev_blocks.end() && j->second->interface=="out") { generate_interface(*j->second); + /* Let VariableResolver convert the variable reference into an interface + block reference. */ return; } @@ -608,8 +610,8 @@ void InterfaceGenerator::visit(InterfaceBlock &iface) if(!iface.linked_block && stage->previous) { const map &prev_blocks = stage->previous->interface_blocks; - map::const_iterator i = prev_blocks.find(iface.name); - if(i!=prev_blocks.end() && i->second->interface=="out" && i->second->name==iface.name) + map::const_iterator i = prev_blocks.find("out"+iface.name); + if(i!=prev_blocks.end()) { iface.linked_block = i->second; i->second->linked_block = &iface;