]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Recognize swizzles in GLSL
[libs/gl.git] / source / glsl / optimize.cpp
index c1431f2b6e9d9e33ed522cd853bcd326bbb3414a..414cf38754191a85d8b6643811c3dc5c4764f4b4 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]=='-');
@@ -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);