+
+ iface_target_block->body.insert(iface_insert_point, iface_var);
+ iface_target_block->variables[name] = iface_var;
+
+ return true;
+}
+
+bool InterfaceGenerator::generate_interface(InterfaceBlock &out_block)
+{
+ if(stage->interface_blocks.count(out_block.name))
+ return false;
+
+ InterfaceBlock *in_block = new InterfaceBlock;
+ in_block->interface = "in";
+ in_block->name = out_block.name;
+ in_block->instance_name = out_block.instance_name;
+ if(stage->type==Stage::GEOMETRY)
+ in_block->array = true;
+ else
+ in_block->array = out_block.array;
+ in_block->linked_block = &out_block;
+ out_block.linked_block = in_block;
+
+ {
+ SetFlag set_copy(copy_block, true);
+ SetForScope<Block *> set_target(iface_target_block, &in_block->members);
+ SetForScope<NodeList<Statement>::iterator> set_ins_pt(iface_insert_point, in_block->members.body.end());
+ out_block.members.visit(*this);
+ }
+
+ iface_target_block->body.insert(iface_insert_point, in_block);
+ stage->interface_blocks[in_block->name] = in_block;
+ if(!in_block->instance_name.empty())
+ stage->interface_blocks[in_block->instance_name] = in_block;
+
+ SetFlag set_scope(function_scope, false);
+ SetForScope<Block *> set_block(current_block, &stage->content);
+ in_block->visit(*this);