X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=829f75358cdd08695d16730184f109cc03e5c0d6;hb=02c1541c20adf36ea09825dc7bc745f8487c4bc8;hp=0ea485a9765d2faa7cafca338b622c5955b936da;hpb=a36992487d018d8801ead6980b362b00a2f5f5c5;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 0ea485a9..829f7535 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -12,8 +12,17 @@ class Program; class ProgramCompiler { -public: - struct Formatter: ProgramSyntax::NodeVisitor +private: + struct Visitor: ProgramSyntax::TraversingVisitor + { + ProgramSyntax::Stage *stage; + + Visitor(); + + virtual void apply(ProgramSyntax::Stage &); + }; + + struct Formatter: Visitor { std::string formatted; unsigned indent; @@ -41,8 +50,7 @@ public: virtual void visit(ProgramSyntax::Return &); }; -private: - struct VariableResolver: ProgramSyntax::TraversingVisitor + struct VariableResolver: Visitor { std::vector blocks; ProgramSyntax::StructDeclaration *type; @@ -59,29 +67,65 @@ private: virtual void visit(ProgramSyntax::InterfaceBlock &); }; - struct UnusedVariableLocator: ProgramSyntax::TraversingVisitor + struct InterfaceGenerator: Visitor { - std::set unused_variables; + std::string in_prefix; + std::string out_prefix; + unsigned scope_level; + std::map iface_declarations; + bool remove_node; + std::list insert_nodes; + InterfaceGenerator(); + + static std::string get_out_prefix(ProgramSyntax::StageType); + virtual void apply(ProgramSyntax::Stage &); + virtual void visit(ProgramSyntax::Block &); + std::string change_prefix(const std::string &, const std::string &) const; + bool generate_interface(ProgramSyntax::VariableDeclaration &, const std::string &, const std::string &); + void insert_assignment(const std::string &, ProgramSyntax::Expression *); virtual void visit(ProgramSyntax::VariableReference &); - virtual void visit(ProgramSyntax::MemberAccess &); virtual void visit(ProgramSyntax::VariableDeclaration &); + virtual void visit(ProgramSyntax::Passthrough &); }; - struct NodeRemover: ProgramSyntax::TraversingVisitor + struct VariableRenamer: Visitor { - std::set to_remove; - unsigned n_removed; - bool immutable_block; - bool remove_block; + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + }; - NodeRemover(); + struct UnusedVariableLocator: Visitor + { + std::set unused_nodes; + std::map aggregates; + ProgramSyntax::Node *aggregate; + std::map assignments; + bool assignment; + bool record_target; + ProgramSyntax::VariableDeclaration *assignment_target; + bool indeterminate_target; + bool self_referencing; + + UnusedVariableLocator(); - virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::MemberAccess &); + virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::ExpressionStatement &); virtual void visit(ProgramSyntax::StructDeclaration &); + virtual void visit(ProgramSyntax::VariableDeclaration &); virtual void visit(ProgramSyntax::InterfaceBlock &); }; + struct NodeRemover: Visitor + { + std::set to_remove; + + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + }; + ProgramParser parser; ProgramSyntax::Module *module; @@ -94,9 +138,12 @@ public: private: void process(); - void process(ProgramSyntax::Context &); + void generate(ProgramSyntax::Stage &); + bool optimize(ProgramSyntax::Stage &); static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &); - std::string format_context(ProgramSyntax::Context &); + template + static void apply(ProgramSyntax::Stage &); + std::string create_source(ProgramSyntax::Stage &); }; } // namespace GL