/* Populate referenced_names from the target function so we can rename
variables from the inlined function that would conflict. Only consider
- names which declared in blocks linearly related to the target block. */
+ names declared in blocks linearly related to the target block. */
pass = REFERENCED;
tgt_blk.visit(*this);
for(const Block *b=&tgt_blk; b; b=b->parent)
for(const auto &kvp: b->variables)
referenced_names.insert(kvp.first);
+ for(const auto &kvp: stage.interface_blocks)
+ if(kvp.second->name.find(' ')!=string::npos)
+ for(const auto &kvp2: kvp.second->block_declaration->members.variables)
+ referenced_names.insert(kvp2.first);
/* Inline and rename passes must be interleaved so used variable names are
known when inlining the return statement. */
referenced_names.insert(var.name);
}
-void InlineContentInjector::visit(InterfaceBlockReference &iface)
-{
- if(pass==REFERENCED)
- referenced_names.insert(iface.name);
-}
-
void InlineContentInjector::visit(FunctionCall &call)
{
if(pass==REFERENCED)
TraversingVisitor::visit(var);
}
-void UnusedTypeRemover::visit(InterfaceBlock &iface)
-{
- unused_nodes.erase(iface.type_declaration);
-}
-
void UnusedTypeRemover::visit(FunctionDeclaration &func)
{
unused_nodes.erase(func.return_type_declaration);
referenced(var.declaration, var);
}
-void UnusedVariableRemover::visit(InterfaceBlockReference &iface)
-{
- if(composite_reference)
- r_reference.declaration = iface.declaration;
- else if(iface.declaration)
- referenced(iface.declaration, iface);
-}
-
void UnusedVariableRemover::visit_composite(Expression &expr)
{
if(!composite_reference)
/* Mark variables as output if they're used by the next stage or the
graphics API. */
- var_info.output = (var.interface=="out" && (stage->type==Stage::FRAGMENT || var.linked_declaration || !var.name.compare(0, 3, "gl_")));
+ bool builtin = (!var.name.compare(0, 3, "gl_") || (var.block_declaration && !var.block_declaration->block_name.compare(0, 3, "gl_")));
+ var_info.output = (var.interface=="out" && (stage->type==Stage::FRAGMENT || var.linked_declaration || builtin));
// Linked outputs are automatically referenced.
if(var_info.output && var.linked_declaration)
}
}
-void UnusedVariableRemover::visit(InterfaceBlock &iface)
-{
- VariableInfo &var_info = variables[&iface];
- var_info.output = (iface.interface=="out" && (iface.linked_block || !iface.block_name.compare(0, 3, "gl_")));
-}
-
void UnusedVariableRemover::merge_variables(const BlockVariableMap &other_vars)
{
for(const auto &kvp: other_vars)