1 #ifndef MSP_GL_PROGRAMCOMPILER_H_
2 #define MSP_GL_PROGRAMCOMPILER_H_
5 #include "programparser.h"
6 #include "programsyntax.h"
16 struct Formatter: ProgramSyntax::NodeVisitor
18 std::string formatted;
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 &);
45 struct VariableResolver: ProgramSyntax::TraversingVisitor
47 std::vector<ProgramSyntax::Block *> blocks;
48 ProgramSyntax::StructDeclaration *type;
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 &);
62 struct InterfaceGenerator: ProgramSyntax::TraversingVisitor
64 ProgramSyntax::Context *context;
65 std::string in_prefix;
66 std::string out_prefix;
68 std::map<std::string, ProgramSyntax::NodePtr<ProgramSyntax::Node> > iface_declarations;
70 std::list<ProgramSyntax::NodePtr<ProgramSyntax::Node> > insert_nodes;
74 static std::string get_out_prefix(ProgramSyntax::ContextType);
75 void visit(ProgramSyntax::Context &);
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 &);
85 struct VariableRenamer: ProgramSyntax::TraversingVisitor
87 virtual void visit(ProgramSyntax::VariableReference &);
88 virtual void visit(ProgramSyntax::VariableDeclaration &);
91 struct UnusedVariableLocator: ProgramSyntax::TraversingVisitor
93 ProgramSyntax::Context *context;
94 std::set<ProgramSyntax::Node *> unused_nodes;
95 std::map<ProgramSyntax::VariableDeclaration *, ProgramSyntax::Node *> assignments;
97 ProgramSyntax::VariableDeclaration *assignment_target;
99 UnusedVariableLocator();
101 void visit(ProgramSyntax::Context &);
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 &);
109 struct NodeRemover: ProgramSyntax::TraversingVisitor
111 ProgramSyntax::Context *context;
112 std::set<ProgramSyntax::Node *> to_remove;
114 bool immutable_block;
119 void visit(ProgramSyntax::Context &);
120 virtual void visit(ProgramSyntax::Block &);
121 virtual void visit(ProgramSyntax::StructDeclaration &);
122 virtual void visit(ProgramSyntax::VariableDeclaration &);
123 virtual void visit(ProgramSyntax::InterfaceBlock &);
126 ProgramParser parser;
127 ProgramSyntax::Module *module;
132 void compile(const std::string &);
133 void compile(IO::Base &);
134 void add_shaders(Program &);
138 void generate(ProgramSyntax::Context &);
139 void optimize(ProgramSyntax::Context &);
140 static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &);
141 static void resolve_variables(ProgramSyntax::Context &);
142 std::string format_context(ProgramSyntax::Context &);