return prefix+name.substr(offset);
}
-VariableDeclaration *InterfaceGenerator::generate_interface(VariableDeclaration &var, const string &iface, const string &name)
+VariableDeclaration *InterfaceGenerator::generate_interface(VariableDeclaration &other_var, const string &iface, const string &name)
{
if(stage->content.variables.count(name))
return nullptr;
- if(stage->type==Stage::GEOMETRY && var.interface=="out" && var.array)
+ if(stage->type==Stage::GEOMETRY && other_var.interface=="out" && other_var.array)
return nullptr;
- unique_ptr<VariableDeclaration> iface_var = make_unique<VariableDeclaration>();
- iface_var->sampling = var.sampling;
+ unique_ptr<VariableDeclaration> var = make_unique<VariableDeclaration>();
+ var->sampling = other_var.sampling;
if(stage->type==Stage::FRAGMENT && iface=="in")
- if(BasicTypeDeclaration *basic = dynamic_cast<BasicTypeDeclaration *>(var.type_declaration))
+ if(BasicTypeDeclaration *basic = dynamic_cast<BasicTypeDeclaration *>(other_var.type_declaration))
if(BasicTypeDeclaration *elem = get_element_type(*basic))
if(elem->kind==BasicTypeDeclaration::INT)
- iface_var->interpolation = "flat";
- iface_var->interface = iface;
- iface_var->type = var.type;
- iface_var->name = name;
+ var->interpolation = "flat";
+ var->interface = iface;
+ var->type = other_var.type;
+ var->name = name;
// Tessellation and geometry inputs may be arrayed.
if(stage->type==Stage::TESS_CONTROL)
// VS out -> TCS in: add | TCS in -> TCS out: unchanged | VS out -> TCS out: add
- iface_var->array = (var.array || var.interface!="in");
+ var->array = (other_var.array || other_var.interface!="in");
else if(stage->type==Stage::TESS_EVAL)
// TCS out -> TES in: unchanged | TES in -> TES out: remove | TCS out -> TES out: remove
- iface_var->array = (var.array && iface=="in");
+ var->array = (other_var.array && iface=="in");
else if(stage->type==Stage::GEOMETRY)
// VS/TES out -> GS in: add | GS in -> GS out: remove | VS/TES out -> GS out: unchanged
- iface_var->array = ((var.array && var.interface!="in") || iface=="in");
+ var->array = ((other_var.array && other_var.interface!="in") || iface=="in");
else
- iface_var->array = var.array;
- if(iface_var->array)
- iface_var->array_size = var.array_size.clone();
+ var->array = other_var.array;
+ if(var->array)
+ var->array_size = other_var.array_size.clone();
if(iface=="in")
{
- iface_var->layout = var.layout.clone();
- iface_var->linked_declaration = &var;
- var.linked_declaration = iface_var.get();
+ var->layout = other_var.layout.clone();
+ var->linked_declaration = &other_var;
+ other_var.linked_declaration = var.get();
}
- if(var.block_declaration)
+ if(other_var.block_declaration)
{
- unique_ptr<StructDeclaration> iface_type(var.block_declaration->clone());
- iface_type->name = format("_%s_%s", iface, var.block_declaration->block_name);
+ unique_ptr<StructDeclaration> block_type(other_var.block_declaration->clone());
+ block_type->name = format("_%s_%s", iface, other_var.block_declaration->block_name);
- iface_var->type = iface_type->name;
+ var->type = block_type->name;
if(name.empty())
- iface_var->name = format("%s %s", iface, var.block_declaration->block_name);
+ var->name = format("%s %s", iface, other_var.block_declaration->block_name);
- stage->interface_blocks.insert(make_pair("in "+var.block_declaration->block_name, iface_var.get()));
+ stage->interface_blocks.insert(make_pair("in "+other_var.block_declaration->block_name, var.get()));
if(!name.empty())
- stage->interface_blocks.insert(make_pair(name, iface_var.get()));
+ stage->interface_blocks.insert(make_pair(name, var.get()));
- iface_target_block->body.insert(iface_insert_point, move(iface_type));
+ iface_target_block->body.insert(iface_insert_point, move(block_type));
}
- iface_target_block->variables.insert(make_pair(name, iface_var.get()));
+ iface_target_block->variables.insert(make_pair(name, var.get()));
if(iface_target_block==&stage->content && iface=="in")
- declared_inputs.push_back(iface_var.get());
+ declared_inputs.push_back(var.get());
- VariableDeclaration *result = iface_var.get();
- iface_target_block->body.insert(iface_insert_point, move(iface_var));
+ VariableDeclaration *result = var.get();
+ iface_target_block->body.insert(iface_insert_point, move(var));
return result;
}
for(const auto &kvp: stage->previous->interface_blocks)
if(kvp.second->name.find(' ')!=string::npos)
{
- const map<string, VariableDeclaration *> &iface_vars = kvp.second->block_declaration->members.variables;
- i = iface_vars.find(var.name);
- if(i!=iface_vars.end())
+ const map<string, VariableDeclaration *> &block_vars = kvp.second->block_declaration->members.variables;
+ i = block_vars.find(var.name);
+ if(i!=block_vars.end())
{
generate_interface(*kvp.second, "in", string());
return;
stage->types.insert(make_pair(strct.name, &strct));
if(strct.block_name.empty())
{
- SetForScope<VariableDeclaration *> set_iface(iface_block, strct.block_declaration);
+ SetForScope<VariableDeclaration *> set_block(iface_block, strct.block_declaration);
TraversingVisitor::visit(strct);
}
else
strct->extended_alignment = true;
SetForScope<NodeList<Statement>::iterator> set_ins_pt(type_insert_point, block_member_type_ins_pt);
- SetForScope<VariableDeclaration *> set_iface(iface_block, &var);
+ SetForScope<VariableDeclaration *> set_block(iface_block, &var);
TraversingVisitor::visit(*strct);
}
{
/* The name refers a member of an anonymous interface block. Prepare
new syntax tree nodes accordingly. */
- unique_ptr<VariableReference> iface_ref = make_unique<VariableReference>();
- iface_ref->name = kvp.first;
- iface_ref->source = var.source;
- iface_ref->line = var.line;
- iface_ref->declaration = kvp.second;
+ unique_ptr<VariableReference> block_ref = make_unique<VariableReference>();
+ block_ref->name = kvp.first;
+ block_ref->source = var.source;
+ block_ref->line = var.line;
+ block_ref->declaration = kvp.second;
unique_ptr<MemberAccess> memacc = make_unique<MemberAccess>();
memacc->source = var.source;
memacc->line = var.line;
- memacc->left = move(iface_ref);
+ memacc->left = move(block_ref);
memacc->member = var.name;
r_replacement_expr = move(memacc);