1 #ifndef MSP_GL_PROGRAMCOMPILER_H_
2 #define MSP_GL_PROGRAMCOMPILER_H_
5 #include "programparser.h"
6 #include "programsyntax.h"
16 struct Visitor: ProgramSyntax::TraversingVisitor
18 ProgramSyntax::Stage *stage;
22 virtual void apply(ProgramSyntax::Stage &);
25 struct Formatter: Visitor
27 std::string formatted;
31 std::string block_interface;
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::Assignment &);
43 virtual void visit(ProgramSyntax::FunctionCall &);
44 virtual void visit(ProgramSyntax::ExpressionStatement &);
45 virtual void visit(ProgramSyntax::Layout &);
46 virtual void visit(ProgramSyntax::StructDeclaration &);
47 virtual void visit(ProgramSyntax::VariableDeclaration &);
48 virtual void visit(ProgramSyntax::InterfaceBlock &);
49 virtual void visit(ProgramSyntax::FunctionDeclaration &);
50 virtual void visit(ProgramSyntax::Conditional &);
51 virtual void visit(ProgramSyntax::Iteration &);
52 virtual void visit(ProgramSyntax::Return &);
55 struct VariableResolver: Visitor
57 std::vector<ProgramSyntax::Block *> blocks;
58 ProgramSyntax::StructDeclaration *type;
60 std::string block_interface;
62 ProgramSyntax::VariableDeclaration *assignment_target;
63 bool self_referencing;
67 virtual void apply(ProgramSyntax::Stage &);
68 virtual void visit(ProgramSyntax::Block &);
69 virtual void visit(ProgramSyntax::VariableReference &);
70 virtual void visit(ProgramSyntax::MemberAccess &);
71 virtual void visit(ProgramSyntax::BinaryExpression &);
72 virtual void visit(ProgramSyntax::Assignment &);
73 virtual void visit(ProgramSyntax::StructDeclaration &);
74 virtual void visit(ProgramSyntax::VariableDeclaration &);
75 virtual void visit(ProgramSyntax::InterfaceBlock &);
78 struct InterfaceGenerator: Visitor
80 std::string in_prefix;
81 std::string out_prefix;
83 std::map<std::string, ProgramSyntax::VariableDeclaration *> iface_declarations;
85 std::list<ProgramSyntax::Node *> insert_nodes;
89 static std::string get_out_prefix(ProgramSyntax::StageType);
90 virtual void apply(ProgramSyntax::Stage &);
91 virtual void visit(ProgramSyntax::Block &);
92 std::string change_prefix(const std::string &, const std::string &) const;
93 bool generate_interface(ProgramSyntax::VariableDeclaration &, const std::string &, const std::string &);
94 void insert_assignment(const std::string &, ProgramSyntax::Expression *);
95 virtual void visit(ProgramSyntax::VariableReference &);
96 virtual void visit(ProgramSyntax::VariableDeclaration &);
97 virtual void visit(ProgramSyntax::Passthrough &);
100 struct VariableRenamer: Visitor
102 virtual void visit(ProgramSyntax::VariableReference &);
103 virtual void visit(ProgramSyntax::VariableDeclaration &);
106 struct UnusedVariableLocator: Visitor
108 struct AssignmentList
110 std::vector<ProgramSyntax::Node *> nodes;
112 bool self_referencing;
115 typedef std::map<ProgramSyntax::VariableDeclaration *, AssignmentList> BlockAssignmentMap;
117 std::set<ProgramSyntax::Node *> unused_nodes;
118 std::map<ProgramSyntax::VariableDeclaration *, ProgramSyntax::Node *> aggregates;
119 ProgramSyntax::Node *aggregate;
120 std::vector<BlockAssignmentMap> assignments;
121 ProgramSyntax::Assignment *assignment;
122 bool assignment_target;
124 UnusedVariableLocator();
126 virtual void apply(ProgramSyntax::Stage &);
127 virtual void visit(ProgramSyntax::VariableReference &);
128 virtual void visit(ProgramSyntax::MemberAccess &);
129 virtual void visit(ProgramSyntax::BinaryExpression &);
130 virtual void visit(ProgramSyntax::Assignment &);
131 void record_assignment(ProgramSyntax::VariableDeclaration &, ProgramSyntax::Node &, bool);
132 virtual void visit(ProgramSyntax::ExpressionStatement &);
133 virtual void visit(ProgramSyntax::StructDeclaration &);
134 virtual void visit(ProgramSyntax::VariableDeclaration &);
135 virtual void visit(ProgramSyntax::InterfaceBlock &);
136 virtual void visit(ProgramSyntax::FunctionDeclaration &);
137 void merge_down_assignments();
138 virtual void visit(ProgramSyntax::Conditional &);
139 virtual void visit(ProgramSyntax::Iteration &);
142 struct NodeRemover: Visitor
144 std::set<ProgramSyntax::Node *> to_remove;
146 virtual void visit(ProgramSyntax::Block &);
147 virtual void visit(ProgramSyntax::VariableDeclaration &);
150 ProgramParser parser;
151 ProgramSyntax::Module *module;
156 void compile(const std::string &);
157 void compile(IO::Base &);
158 void add_shaders(Program &);
161 static ProgramSyntax::Module *create_builtins_module();
162 static ProgramSyntax::Module &get_builtins_module();
163 static ProgramSyntax::Stage *get_builtins(ProgramSyntax::StageType);
165 void generate(ProgramSyntax::Stage &);
166 bool optimize(ProgramSyntax::Stage &);
167 static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &);
169 static void apply(ProgramSyntax::Stage &);
170 std::string create_source(ProgramSyntax::Stage &);