X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=695c2e260a7c65ec4ced67b5c9b15c7c537c5d16;hb=5945ad9b63bbc55c3ed21f0c023d17f73aaac370;hp=9a825489df87e27178cfc0b0e775de0ff6b9ebbc;hpb=6e6ee01b68056b23c6709d7f60396710dd7623b9;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 9a825489..695c2e26 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -1,6 +1,7 @@ #ifndef MSP_GL_PROGRAMCOMPILER_H_ #define MSP_GL_PROGRAMCOMPILER_H_ +#include #include "programparser.h" #include "programsyntax.h" @@ -11,18 +12,34 @@ 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(); - std::string format_expression(ProgramSyntax::Expression &); virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::Literal &); + virtual void visit(ProgramSyntax::ParenthesizedExpression &); + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::MemberAccess &); + virtual void visit(ProgramSyntax::UnaryExpression &); + virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::ExpressionStatement &); virtual void visit(ProgramSyntax::Layout &); virtual void visit(ProgramSyntax::StructDeclaration &); @@ -34,7 +51,84 @@ public: virtual void visit(ProgramSyntax::Return &); }; -private: + 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 &); + virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::StructDeclaration &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + virtual void visit(ProgramSyntax::InterfaceBlock &); + }; + + struct InterfaceGenerator: Visitor + { + 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::VariableDeclaration &); + virtual void visit(ProgramSyntax::Passthrough &); + }; + + struct VariableRenamer: Visitor + { + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + }; + + 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::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; @@ -46,7 +140,16 @@ public: void add_shaders(Program &); private: - std::string format_context(ProgramSyntax::Context &); + static ProgramSyntax::Module *create_builtins_module(); + static ProgramSyntax::Module &get_builtins_module(); + static ProgramSyntax::Stage *get_builtins(ProgramSyntax::StageType); + void process(); + void generate(ProgramSyntax::Stage &); + bool optimize(ProgramSyntax::Stage &); + static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &); + template + static void apply(ProgramSyntax::Stage &); + std::string create_source(ProgramSyntax::Stage &); }; } // namespace GL