]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/optimize.h
Rewrite syntax tree modifications
[libs/gl.git] / source / glsl / optimize.h
1 #ifndef MSP_GL_SL_OPTIMIZE_H_
2 #define MSP_GL_SL_OPTIMIZE_H_
3
4 #include <map>
5 #include <set>
6 #include "evaluate.h"
7 #include "visitor.h"
8
9 namespace Msp {
10 namespace GL {
11 namespace SL {
12
13 class InlineableFunctionLocator: private TraversingVisitor
14 {
15 private:
16         std::map<FunctionDeclaration *, unsigned> refcounts;
17         std::set<FunctionDeclaration *> inlineable;
18         FunctionDeclaration *in_function;
19
20 public:
21         InlineableFunctionLocator();
22
23         const std::set<FunctionDeclaration *> &apply(Stage &s) { visit(s.content); return inlineable; }
24
25 private:
26         virtual void visit(FunctionCall &);
27         virtual void visit(FunctionDeclaration &);
28         using TraversingVisitor::visit;
29 };
30
31 class FunctionInliner: private TraversingVisitor
32 {
33 private:
34         std::set<FunctionDeclaration *> inlineable;
35         unsigned extract_result;
36         RefPtr<Expression> inline_result;
37
38 public:
39         FunctionInliner();
40
41         void apply(Stage &);
42
43 private:
44         void visit_and_inline(RefPtr<Expression> &);
45
46         virtual void visit(Block &);
47         virtual void visit(UnaryExpression &);
48         virtual void visit(BinaryExpression &);
49         virtual void visit(MemberAccess &);
50         virtual void visit(FunctionCall &);
51         virtual void visit(VariableDeclaration &);
52         virtual void visit(Return &);
53         using TraversingVisitor::visit;
54 };
55
56 class ConstantConditionEliminator: private TraversingVisitor
57 {
58 private:
59         unsigned scope_level;
60         Block *current_block;
61         bool record_only;
62         ExpressionEvaluator::ValueMap variable_values;
63         NodeList<Statement>::iterator insert_point;
64         std::set<Node *> nodes_to_remove;
65
66 public:
67         ConstantConditionEliminator();
68
69         void apply(Stage &);
70
71 private:
72         virtual void visit(Block &);
73         virtual void visit(UnaryExpression &);
74         virtual void visit(Assignment &);
75         virtual void visit(VariableDeclaration &);
76         virtual void visit(Conditional &);
77         virtual void visit(Iteration &);
78         using TraversingVisitor::visit;
79 };
80
81 class UnusedVariableRemover: private TraversingVisitor
82 {
83 private:
84         struct VariableInfo
85         {
86                 bool local;
87                 std::vector<Node *> assignments;
88                 bool conditionally_assigned;
89                 bool referenced;
90
91                 VariableInfo();
92         };
93
94         typedef std::map<VariableDeclaration *, VariableInfo> BlockVariableMap;
95
96         std::set<Node *> unused_nodes;
97         std::map<VariableDeclaration *, Node *> aggregates;
98         Node *aggregate;
99         std::vector<BlockVariableMap> variables;
100         Assignment *assignment;
101         bool assignment_target;
102         bool assign_to_subscript;
103         bool global_scope;
104
105 public:
106         UnusedVariableRemover();
107
108         bool apply(Stage &);
109
110 private:
111         virtual void visit(VariableReference &);
112         virtual void visit(MemberAccess &);
113         virtual void visit(BinaryExpression &);
114         virtual void visit(Assignment &);
115         void record_assignment(VariableDeclaration &, Node &, bool);
116         void clear_assignments(VariableInfo &, bool);
117         virtual void visit(ExpressionStatement &);
118         virtual void visit(StructDeclaration &);
119         virtual void visit(VariableDeclaration &);
120         virtual void visit(InterfaceBlock &);
121         virtual void visit(FunctionDeclaration &);
122         void merge_down_variables();
123         virtual void visit(Conditional &);
124         virtual void visit(Iteration &);
125         using TraversingVisitor::visit;
126 };
127
128 class UnusedFunctionRemover: private TraversingVisitor
129 {
130 private:
131         std::set<Node *> unused_nodes;
132         std::set<FunctionDeclaration *> used_definitions;
133
134 public:
135         bool apply(Stage &s);
136
137 private:
138         virtual void visit(FunctionCall &);
139         virtual void visit(FunctionDeclaration &);
140         using TraversingVisitor::visit;
141 };
142
143 } // namespace SL
144 } // namespace GL
145 } // namespace Msp
146
147 #endif