]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/optimize.h
Rearrange secondary operations in GLSL compiler
[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 BlockModifier
57 {
58 private:
59         unsigned scope_level;
60         bool record_only;
61         ExpressionEvaluator::ValueMap variable_values;
62
63 public:
64         ConstantConditionEliminator();
65
66         void apply(Stage &s) { visit(s.content); }
67
68 private:
69         virtual void visit(Block &);
70         virtual void visit(UnaryExpression &);
71         virtual void visit(Assignment &);
72         virtual void visit(VariableDeclaration &);
73         virtual void visit(Conditional &);
74         virtual void visit(Iteration &);
75         using BlockModifier::visit;
76 };
77
78 class UnusedVariableRemover: private TraversingVisitor
79 {
80 private:
81         struct VariableInfo
82         {
83                 bool local;
84                 std::vector<Node *> assignments;
85                 bool conditionally_assigned;
86                 bool referenced;
87
88                 VariableInfo();
89         };
90
91         typedef std::map<VariableDeclaration *, VariableInfo> BlockVariableMap;
92
93         std::set<Node *> unused_nodes;
94         std::map<VariableDeclaration *, Node *> aggregates;
95         Node *aggregate;
96         std::vector<BlockVariableMap> variables;
97         Assignment *assignment;
98         bool assignment_target;
99         bool assign_to_subscript;
100         bool global_scope;
101
102 public:
103         UnusedVariableRemover();
104
105         bool apply(Stage &);
106
107 private:
108         virtual void visit(VariableReference &);
109         virtual void visit(MemberAccess &);
110         virtual void visit(BinaryExpression &);
111         virtual void visit(Assignment &);
112         void record_assignment(VariableDeclaration &, Node &, bool);
113         void clear_assignments(VariableInfo &, bool);
114         virtual void visit(ExpressionStatement &);
115         virtual void visit(StructDeclaration &);
116         virtual void visit(VariableDeclaration &);
117         virtual void visit(InterfaceBlock &);
118         virtual void visit(FunctionDeclaration &);
119         void merge_down_variables();
120         virtual void visit(Conditional &);
121         virtual void visit(Iteration &);
122         using TraversingVisitor::visit;
123 };
124
125 class UnusedFunctionRemover: private TraversingVisitor
126 {
127 private:
128         std::set<Node *> unused_nodes;
129         std::set<FunctionDeclaration *> used_definitions;
130
131 public:
132         bool apply(Stage &s);
133
134 private:
135         virtual void visit(FunctionCall &);
136         virtual void visit(FunctionDeclaration &);
137         using TraversingVisitor::visit;
138 };
139
140 } // namespace SL
141 } // namespace GL
142 } // namespace Msp
143
144 #endif