]> git.tdb.fi Git - libs/gl.git/blob - source/programcompiler.h
Add a module for builtin interface variables
[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                 std::string block_interface;
32
33                 Formatter();
34
35                 virtual void visit(ProgramSyntax::Block &);
36                 virtual void visit(ProgramSyntax::Literal &);
37                 virtual void visit(ProgramSyntax::ParenthesizedExpression &);
38                 virtual void visit(ProgramSyntax::VariableReference &);
39                 virtual void visit(ProgramSyntax::MemberAccess &);
40                 virtual void visit(ProgramSyntax::UnaryExpression &);
41                 virtual void visit(ProgramSyntax::BinaryExpression &);
42                 virtual void visit(ProgramSyntax::FunctionCall &);
43                 virtual void visit(ProgramSyntax::ExpressionStatement &);
44                 virtual void visit(ProgramSyntax::Layout &);
45                 virtual void visit(ProgramSyntax::StructDeclaration &);
46                 virtual void visit(ProgramSyntax::VariableDeclaration &);
47                 virtual void visit(ProgramSyntax::InterfaceBlock &);
48                 virtual void visit(ProgramSyntax::FunctionDeclaration &);
49                 virtual void visit(ProgramSyntax::Conditional &);
50                 virtual void visit(ProgramSyntax::Iteration &);
51                 virtual void visit(ProgramSyntax::Return &);
52         };
53
54         struct VariableResolver: Visitor
55         {
56                 std::vector<ProgramSyntax::Block *> blocks;
57                 ProgramSyntax::StructDeclaration *type;
58                 bool anonymous;
59                 std::string block_interface;
60
61                 VariableResolver();
62
63                 virtual void apply(ProgramSyntax::Stage &);
64                 virtual void visit(ProgramSyntax::Block &);
65                 virtual void visit(ProgramSyntax::VariableReference &);
66                 virtual void visit(ProgramSyntax::MemberAccess &);
67                 virtual void visit(ProgramSyntax::BinaryExpression &);
68                 virtual void visit(ProgramSyntax::StructDeclaration &);
69                 virtual void visit(ProgramSyntax::VariableDeclaration &);
70                 virtual void visit(ProgramSyntax::InterfaceBlock &);
71         };
72
73         struct InterfaceGenerator: Visitor
74         {
75                 std::string in_prefix;
76                 std::string out_prefix;
77                 unsigned scope_level;
78                 std::map<std::string, ProgramSyntax::VariableDeclaration *> iface_declarations;
79                 bool remove_node;
80                 std::list<ProgramSyntax::Node *> insert_nodes;
81
82                 InterfaceGenerator();
83
84                 static std::string get_out_prefix(ProgramSyntax::StageType);
85                 virtual void apply(ProgramSyntax::Stage &);
86                 virtual void visit(ProgramSyntax::Block &);
87                 std::string change_prefix(const std::string &, const std::string &) const;
88                 bool generate_interface(ProgramSyntax::VariableDeclaration &, const std::string &, const std::string &);
89                 void insert_assignment(const std::string &, ProgramSyntax::Expression *);
90                 virtual void visit(ProgramSyntax::VariableReference &);
91                 virtual void visit(ProgramSyntax::VariableDeclaration &);
92                 virtual void visit(ProgramSyntax::Passthrough &);
93         };
94
95         struct VariableRenamer: Visitor
96         {
97                 virtual void visit(ProgramSyntax::VariableReference &);
98                 virtual void visit(ProgramSyntax::VariableDeclaration &);
99         };
100
101         struct UnusedVariableLocator: Visitor
102         {
103                 std::set<ProgramSyntax::Node *> unused_nodes;
104                 std::map<ProgramSyntax::VariableDeclaration *, ProgramSyntax::Node *> aggregates;
105                 ProgramSyntax::Node *aggregate;
106                 std::map<ProgramSyntax::VariableDeclaration *, ProgramSyntax::Node *> assignments;
107                 bool assignment;
108                 bool record_target;
109                 ProgramSyntax::VariableDeclaration *assignment_target;
110                 bool indeterminate_target;
111                 bool self_referencing;
112
113                 UnusedVariableLocator();
114
115                 virtual void visit(ProgramSyntax::VariableReference &);
116                 virtual void visit(ProgramSyntax::MemberAccess &);
117                 virtual void visit(ProgramSyntax::BinaryExpression &);
118                 virtual void visit(ProgramSyntax::ExpressionStatement &);
119                 virtual void visit(ProgramSyntax::StructDeclaration &);
120                 virtual void visit(ProgramSyntax::VariableDeclaration &);
121                 virtual void visit(ProgramSyntax::InterfaceBlock &);
122         };
123
124         struct NodeRemover: Visitor
125         {
126                 std::set<ProgramSyntax::Node *> to_remove;
127
128                 virtual void visit(ProgramSyntax::Block &);
129                 virtual void visit(ProgramSyntax::VariableDeclaration &);
130         };
131
132         ProgramParser parser;
133         ProgramSyntax::Module *module;
134
135 public:
136         ProgramCompiler();
137
138         void compile(const std::string &);
139         void compile(IO::Base &);
140         void add_shaders(Program &);
141
142 private:
143         static ProgramSyntax::Module *create_builtins_module();
144         static ProgramSyntax::Module &get_builtins_module();
145         static ProgramSyntax::Stage *get_builtins(ProgramSyntax::StageType);
146         void process();
147         void generate(ProgramSyntax::Stage &);
148         bool optimize(ProgramSyntax::Stage &);
149         static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &);
150         template<typename T>
151         static void apply(ProgramSyntax::Stage &);
152         std::string create_source(ProgramSyntax::Stage &);
153 };
154
155 } // namespace GL
156 } // namespace Msp
157
158 #endif