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