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;
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 &);
53 struct VariableResolver: Visitor
55 std::vector<ProgramSyntax::Block *> blocks;
56 ProgramSyntax::StructDeclaration *type;
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 &);
70 struct InterfaceGenerator: Visitor
72 std::string in_prefix;
73 std::string out_prefix;
75 std::map<std::string, ProgramSyntax::Node *> iface_declarations;
77 std::list<ProgramSyntax::Node *> insert_nodes;
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 &);
92 struct VariableRenamer: Visitor
94 virtual void visit(ProgramSyntax::VariableReference &);
95 virtual void visit(ProgramSyntax::VariableDeclaration &);
98 struct UnusedVariableLocator: Visitor
100 std::set<ProgramSyntax::Node *> unused_nodes;
101 std::map<ProgramSyntax::VariableDeclaration *, ProgramSyntax::Node *> assignments;
103 ProgramSyntax::VariableDeclaration *assignment_target;
105 UnusedVariableLocator();
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 &);
114 struct NodeRemover: Visitor
116 std::set<ProgramSyntax::Node *> to_remove;
118 bool immutable_block;
123 virtual void visit(ProgramSyntax::Block &);
124 virtual void visit(ProgramSyntax::StructDeclaration &);
125 virtual void visit(ProgramSyntax::VariableDeclaration &);
126 virtual void visit(ProgramSyntax::InterfaceBlock &);
129 ProgramParser parser;
130 ProgramSyntax::Module *module;
135 void compile(const std::string &);
136 void compile(IO::Base &);
137 void add_shaders(Program &);
141 void generate(ProgramSyntax::Stage &);
142 void optimize(ProgramSyntax::Stage &);
143 static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &);
145 static void apply(ProgramSyntax::Stage &);
146 std::string create_source(ProgramSyntax::Stage &);