]> git.tdb.fi Git - libs/gl.git/blob - source/programcompiler.h
Assorted refactoring and fixes
[libs/gl.git] / source / programcompiler.h
1 #ifndef MSP_GL_PROGRAMCOMPILER_H_
2 #define MSP_GL_PROGRAMCOMPILER_H_
3
4 #include <set>
5 #include "programparser.h"
6 #include "programsyntax.h"
7
8 namespace Msp {
9 namespace GL {
10
11 class Program;
12
13 class ProgramCompiler
14 {
15 private:
16         struct Visitor: ProgramSyntax::TraversingVisitor
17         {
18                 ProgramSyntax::Stage *stage;
19
20                 Visitor();
21
22                 virtual void apply(ProgramSyntax::Stage &);
23         };
24
25         struct Formatter: Visitor
26         {
27                 std::string formatted;
28                 unsigned indent;
29                 bool parameter_list;
30                 bool else_if;
31
32                 Formatter();
33
34                 virtual void visit(ProgramSyntax::Block &);
35                 virtual void visit(ProgramSyntax::Literal &);
36                 virtual void visit(ProgramSyntax::ParenthesizedExpression &);
37                 virtual void visit(ProgramSyntax::VariableReference &);
38                 virtual void visit(ProgramSyntax::MemberAccess &);
39                 virtual void visit(ProgramSyntax::UnaryExpression &);
40                 virtual void visit(ProgramSyntax::BinaryExpression &);
41                 virtual void visit(ProgramSyntax::FunctionCall &);
42                 virtual void visit(ProgramSyntax::ExpressionStatement &);
43                 virtual void visit(ProgramSyntax::Layout &);
44                 virtual void visit(ProgramSyntax::StructDeclaration &);
45                 virtual void visit(ProgramSyntax::VariableDeclaration &);
46                 virtual void visit(ProgramSyntax::InterfaceBlock &);
47                 virtual void visit(ProgramSyntax::FunctionDeclaration &);
48                 virtual void visit(ProgramSyntax::Conditional &);
49                 virtual void visit(ProgramSyntax::Iteration &);
50                 virtual void visit(ProgramSyntax::Return &);
51         };
52
53         struct VariableResolver: Visitor
54         {
55                 std::vector<ProgramSyntax::Block *> blocks;
56                 ProgramSyntax::StructDeclaration *type;
57                 bool anonymous;
58
59                 VariableResolver();
60
61                 virtual void visit(ProgramSyntax::Block &);
62                 virtual void visit(ProgramSyntax::VariableReference &);
63                 virtual void visit(ProgramSyntax::MemberAccess &);
64                 virtual void visit(ProgramSyntax::BinaryExpression &);
65                 virtual void visit(ProgramSyntax::StructDeclaration &);
66                 virtual void visit(ProgramSyntax::VariableDeclaration &);
67                 virtual void visit(ProgramSyntax::InterfaceBlock &);
68         };
69
70         struct InterfaceGenerator: Visitor
71         {
72                 std::string in_prefix;
73                 std::string out_prefix;
74                 unsigned scope_level;
75                 std::map<std::string, ProgramSyntax::Node *> iface_declarations;
76                 bool remove_node;
77                 std::list<ProgramSyntax::Node *> insert_nodes;
78
79                 InterfaceGenerator();
80
81                 static std::string get_out_prefix(ProgramSyntax::StageType);
82                 virtual void apply(ProgramSyntax::Stage &);
83                 virtual void visit(ProgramSyntax::Block &);
84                 std::string change_prefix(const std::string &, const std::string &) const;
85                 bool generate_interface(ProgramSyntax::VariableDeclaration &, const std::string &, const std::string &);
86                 void insert_assignment(const std::string &, ProgramSyntax::Expression *);
87                 virtual void visit(ProgramSyntax::VariableReference &);
88                 virtual void visit(ProgramSyntax::VariableDeclaration &);
89                 virtual void visit(ProgramSyntax::Passthrough &);
90         };
91
92         struct VariableRenamer: Visitor
93         {
94                 virtual void visit(ProgramSyntax::VariableReference &);
95                 virtual void visit(ProgramSyntax::VariableDeclaration &);
96         };
97
98         struct UnusedVariableLocator: Visitor
99         {
100                 std::set<ProgramSyntax::Node *> unused_nodes;
101                 std::map<ProgramSyntax::VariableDeclaration *, ProgramSyntax::Node *> assignments;
102                 bool assignment;
103                 ProgramSyntax::VariableDeclaration *assignment_target;
104
105                 UnusedVariableLocator();
106
107                 virtual void visit(ProgramSyntax::VariableReference &);
108                 virtual void visit(ProgramSyntax::MemberAccess &);
109                 virtual void visit(ProgramSyntax::BinaryExpression &);
110                 virtual void visit(ProgramSyntax::ExpressionStatement &);
111                 virtual void visit(ProgramSyntax::VariableDeclaration &);
112         };
113
114         struct NodeRemover: Visitor
115         {
116                 std::set<ProgramSyntax::Node *> to_remove;
117                 unsigned n_removed;
118                 bool immutable_block;
119                 bool remove_block;
120
121                 NodeRemover();
122
123                 virtual void visit(ProgramSyntax::Block &);
124                 virtual void visit(ProgramSyntax::StructDeclaration &);
125                 virtual void visit(ProgramSyntax::VariableDeclaration &);
126                 virtual void visit(ProgramSyntax::InterfaceBlock &);
127         };
128
129         ProgramParser parser;
130         ProgramSyntax::Module *module;
131
132 public:
133         ProgramCompiler();
134
135         void compile(const std::string &);
136         void compile(IO::Base &);
137         void add_shaders(Program &);
138
139 private:
140         void process();
141         void generate(ProgramSyntax::Stage &);
142         void optimize(ProgramSyntax::Stage &);
143         static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &);
144         template<typename T>
145         static void apply(ProgramSyntax::Stage &);
146         std::string create_source(ProgramSyntax::Stage &);
147 };
148
149 } // namespace GL
150 } // namespace Msp
151
152 #endif