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::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 &);
54 struct VariableResolver: Visitor
56 std::vector<ProgramSyntax::Block *> blocks;
57 ProgramSyntax::StructDeclaration *type;
59 std::string block_interface;
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 &);
73 struct InterfaceGenerator: Visitor
75 std::string in_prefix;
76 std::string out_prefix;
78 std::map<std::string, ProgramSyntax::VariableDeclaration *> iface_declarations;
80 std::list<ProgramSyntax::Node *> insert_nodes;
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 &);
95 struct VariableRenamer: Visitor
97 virtual void visit(ProgramSyntax::VariableReference &);
98 virtual void visit(ProgramSyntax::VariableDeclaration &);
101 struct UnusedVariableLocator: Visitor
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;
109 ProgramSyntax::VariableDeclaration *assignment_target;
110 bool indeterminate_target;
111 bool self_referencing;
113 UnusedVariableLocator();
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 &);
124 struct NodeRemover: Visitor
126 std::set<ProgramSyntax::Node *> to_remove;
128 virtual void visit(ProgramSyntax::Block &);
129 virtual void visit(ProgramSyntax::VariableDeclaration &);
132 ProgramParser parser;
133 ProgramSyntax::Module *module;
138 void compile(const std::string &);
139 void compile(IO::Base &);
140 void add_shaders(Program &);
143 static ProgramSyntax::Module *create_builtins_module();
144 static ProgramSyntax::Module &get_builtins_module();
145 static ProgramSyntax::Stage *get_builtins(ProgramSyntax::StageType);
147 void generate(ProgramSyntax::Stage &);
148 bool optimize(ProgramSyntax::Stage &);
149 static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &);
151 static void apply(ProgramSyntax::Stage &);
152 std::string create_source(ProgramSyntax::Stage &);