X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=695c2e260a7c65ec4ced67b5c9b15c7c537c5d16;hb=5945ad9b63bbc55c3ed21f0c023d17f73aaac370;hp=6bac5386828d928ba2d9379366d48b8efb9ae020;hpb=009918a51aa309eeceb6c02ecaebe45e8d357033;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 6bac5386..695c2e26 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -12,13 +12,23 @@ 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; bool parameter_list; bool else_if; + std::string block_interface; Formatter(); @@ -41,15 +51,16 @@ public: virtual void visit(ProgramSyntax::Return &); }; -private: - struct VariableResolver: ProgramSyntax::TraversingVisitor + struct VariableResolver: Visitor { std::vector blocks; ProgramSyntax::StructDeclaration *type; bool anonymous; + std::string block_interface; VariableResolver(); + virtual void apply(ProgramSyntax::Stage &); virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::MemberAccess &); @@ -59,20 +70,19 @@ private: virtual void visit(ProgramSyntax::InterfaceBlock &); }; - struct InterfaceGenerator: ProgramSyntax::TraversingVisitor + struct InterfaceGenerator: Visitor { - ProgramSyntax::Context *context; std::string in_prefix; std::string out_prefix; unsigned scope_level; - std::map > iface_declarations; + std::map iface_declarations; bool remove_node; - std::list > insert_nodes; + std::list insert_nodes; InterfaceGenerator(); - static std::string get_out_prefix(ProgramSyntax::ContextType); - void visit(ProgramSyntax::Context &); + 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 &); @@ -82,45 +92,41 @@ private: virtual void visit(ProgramSyntax::Passthrough &); }; - struct VariableRenamer: ProgramSyntax::TraversingVisitor + struct VariableRenamer: Visitor { virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::VariableDeclaration &); }; - struct UnusedVariableLocator: ProgramSyntax::TraversingVisitor + struct UnusedVariableLocator: Visitor { - ProgramSyntax::Context *context; 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(); - void visit(ProgramSyntax::Context &); 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: ProgramSyntax::TraversingVisitor + struct NodeRemover: Visitor { - ProgramSyntax::Context *context; std::set to_remove; - unsigned n_removed; - bool immutable_block; - bool remove_block; - NodeRemover(); - - void visit(ProgramSyntax::Context &); virtual void visit(ProgramSyntax::Block &); - virtual void visit(ProgramSyntax::StructDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); - virtual void visit(ProgramSyntax::InterfaceBlock &); }; ProgramParser parser; @@ -134,12 +140,16 @@ public: void add_shaders(Program &); private: + static ProgramSyntax::Module *create_builtins_module(); + static ProgramSyntax::Module &get_builtins_module(); + static ProgramSyntax::Stage *get_builtins(ProgramSyntax::StageType); void process(); - void generate(ProgramSyntax::Context &); - void optimize(ProgramSyntax::Context &); + void generate(ProgramSyntax::Stage &); + bool optimize(ProgramSyntax::Stage &); static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &); - static void resolve_variables(ProgramSyntax::Context &); - std::string format_context(ProgramSyntax::Context &); + template + static void apply(ProgramSyntax::Stage &); + std::string create_source(ProgramSyntax::Stage &); }; } // namespace GL