]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.h
Fix a name conflict in certain inlining scenarios
[libs/gl.git] / source / glsl / optimize.h
index ae55e5af10f5590f886906355342327a8ddb87be..82fc78cc546e562b5c77ea096112ae2ec59fab38 100644 (file)
@@ -122,6 +122,7 @@ private:
                Block *assign_scope = 0;
                std::vector<ExpressionUse> uses;
                bool trivial = false;
+               bool blocked = false;
        };
 
        std::list<ExpressionInfo> expressions;
@@ -151,6 +152,53 @@ private:
        virtual void visit(Iteration &);
 };
 
+/**
+Breaks aggregates up into separate variables if only the individual fields are
+accessed and not the aggregate as a whole.
+*/
+class AggregateDismantler: public TraversingVisitor
+{
+private:
+       struct AggregateMember
+       {
+               const VariableDeclaration *declaration = 0;
+               unsigned index = 0;
+               RefPtr<Expression> initializer;
+               std::vector<RefPtr<Expression> *> references;
+       };
+
+       struct Aggregate
+       {
+               VariableDeclaration *declaration = 0;
+               Block *decl_scope = 0;
+               NodeList<Statement>::iterator insert_point;
+               std::vector<AggregateMember> members;
+               bool referenced = false;
+               bool members_referenced = false;
+       };
+
+       NodeList<Statement>::iterator insert_point;
+       std::map<Statement *, Aggregate> aggregates;
+       bool composite_reference = false;
+       Assignment::Target r_reference;
+       Aggregate *r_aggregate_ref = 0;
+
+public:
+       bool apply(Stage &);
+
+private:
+       virtual void visit(Block &);
+       virtual void visit(RefPtr<Expression> &);
+       virtual void visit(VariableReference &);
+       void visit_composite(RefPtr<Expression> &);
+       virtual void visit(MemberAccess &);
+       virtual void visit(BinaryExpression &);
+       virtual void visit(StructDeclaration &) { }
+       virtual void visit(VariableDeclaration &);
+       virtual void visit(InterfaceBlock &) { }
+       virtual void visit(FunctionDeclaration &);
+};
+
 /** Replaces expressions consisting entirely of literals with the results of
 evaluating the expression.*/
 class ConstantFolder: private TraversingVisitor
@@ -229,6 +277,7 @@ private:
        virtual void visit(Iteration &);
 };
 
+/** Removes code which is never executed due to flow control statements. */
 class UnreachableCodeRemover: private TraversingVisitor
 {
 private:
@@ -281,7 +330,6 @@ private:
 
        struct VariableInfo
        {
-               InterfaceBlock *interface_block = 0;
                std::vector<AssignmentInfo *> assignments;
                bool initialized = false;
                bool output = false;
@@ -293,7 +341,6 @@ private:
        Stage *stage = 0;
        BlockVariableMap variables;
        std::list<AssignmentInfo> assignments;
-       InterfaceBlock *interface_block = 0;
        Assignment *r_assignment = 0;
        bool assignment_target = false;
        bool r_side_effects = false;