]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Record assignment targets more precisely
[libs/gl.git] / source / glsl / optimize.cpp
index c1431f2b6e9d9e33ed522cd853bcd326bbb3414a..85f97faecd108452bb15b9f3b5508f7c503e8c92 100644 (file)
@@ -232,6 +232,11 @@ void FunctionInliner::visit(MemberAccess &memacc)
        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)
@@ -439,6 +444,13 @@ void ExpressionInliner::visit(MemberAccess &memacc)
        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]=='-');
@@ -467,9 +479,9 @@ void ExpressionInliner::visit(Assignment &assign)
        r_oper = 0;
        visit_and_record(assign.right, assign.oper, true);
 
-       if(assign.target_declaration)
+       if(VariableDeclaration *target_var = dynamic_cast<VariableDeclaration *>(assign.target.declaration))
        {
-               map<VariableDeclaration *, ExpressionInfo>::iterator i = expressions.find(assign.target_declaration);
+               map<VariableDeclaration *, ExpressionInfo>::iterator i = expressions.find(target_var);
                if(i!=expressions.end())
                {
                        /* Self-referencing assignments can't be inlined without additional
@@ -752,6 +764,13 @@ void UnusedVariableRemover::visit(MemberAccess &memacc)
        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);
@@ -819,8 +838,9 @@ void UnusedVariableRemover::visit(ExpressionStatement &expr)
        r_assign_to_subfield = false;
        r_side_effects = false;
        TraversingVisitor::visit(expr);
-       if(r_assignment && r_assignment->target_declaration)
-               record_assignment(*r_assignment->target_declaration, expr, (r_assignment->self_referencing || r_assign_to_subfield));
+       if(r_assignment && r_assignment->target.declaration)
+               if(VariableDeclaration *target_var = dynamic_cast<VariableDeclaration *>(r_assignment->target.declaration))
+                       record_assignment(*target_var, expr, (r_assignment->self_referencing || r_assign_to_subfield));
        if(!r_side_effects)
                unused_nodes.insert(&expr);
 }