visit_and_inline(memacc.left);
}
+void FunctionInliner::visit(Swizzle &swizzle)
+{
+ visit_and_inline(swizzle.left);
+}
+
void FunctionInliner::visit(FunctionCall &call)
{
for(NodeArray<Expression>::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i)
r_trivial = false;
}
+void ExpressionInliner::visit(Swizzle &swizzle)
+{
+ visit_and_record(swizzle.left, swizzle.oper, false);
+ r_oper = swizzle.oper;
+ r_trivial = false;
+}
+
void ExpressionInliner::visit(UnaryExpression &unary)
{
SetFlag set_target(mutating, mutating || unary.oper->token[1]=='+' || unary.oper->token[1]=='-');
unused_nodes.erase(var.type_declaration);
}
+void UnusedTypeRemover::visit(InterfaceBlock &iface)
+{
+ unused_nodes.erase(iface.type_declaration);
+}
+
void UnusedTypeRemover::visit(FunctionDeclaration &func)
{
unused_nodes.erase(func.return_type_declaration);
BlockVariableMap &global_variables = variables.back();
for(BlockVariableMap::iterator i=global_variables.begin(); i!=global_variables.end(); ++i)
{
+ string interface = i->first->interface;
+ bool linked = i->first->linked_declaration;
+ map<VariableDeclaration *, Node *>::iterator j = aggregates.find(i->first);
+ if(j!=aggregates.end())
+ if(InterfaceBlock *iface = dynamic_cast<InterfaceBlock *>(j->second))
+ {
+ interface = iface->interface;
+ linked = iface->linked_block;
+ }
+
/* Don't remove output variables which are used by the next stage or the
graphics API. */
- if(i->first->interface=="out" && (stage.type==Stage::FRAGMENT || i->first->linked_declaration || !i->first->name.compare(0, 3, "gl_")))
+ if(interface=="out" && (stage.type==Stage::FRAGMENT || linked || !i->first->name.compare(0, 3, "gl_")))
continue;
// Mark other unreferenced global variables as unused.
unused_nodes.erase(memacc.declaration);
}
+void UnusedVariableRemover::visit(Swizzle &swizzle)
+{
+ if(assignment_target)
+ r_assign_to_subfield = true;
+ TraversingVisitor::visit(swizzle);
+}
+
void UnusedVariableRemover::visit(UnaryExpression &unary)
{
TraversingVisitor::visit(unary);
{
SetForScope<Node *> set(aggregate, &iface);
unused_nodes.insert(&iface);
- TraversingVisitor::visit(iface);
+ iface.struct_declaration->members.visit(*this);
}
void UnusedVariableRemover::visit(FunctionDeclaration &func)