X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=0c87acf0b953a40198b60299f4288b57a0c59cbe;hb=a0caabaed3aeb8947133d78986bfb4ae5ae3c893;hp=a2dd9401256a34c7659800765f8cf25ca56a8313;hpb=a048354f5be808c97d92504f9e618f6f5558ce1e;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index a2dd9401..0c87acf0 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -9,21 +9,27 @@ namespace Msp { namespace GL { class Program; +class Resources; class ProgramCompiler { private: struct Visitor: ProgramSyntax::TraversingVisitor { + typedef void ResultType; + ProgramSyntax::Stage *stage; Visitor(); virtual void apply(ProgramSyntax::Stage &); + void get_result() const { } }; struct Formatter: Visitor { + typedef std::string ResultType; + std::string formatted; unsigned indent; bool parameter_list; @@ -32,6 +38,7 @@ private: Formatter(); + const std::string &get_result() const { return formatted; } virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::Literal &); virtual void visit(ProgramSyntax::ParenthesizedExpression &); @@ -42,6 +49,7 @@ private: virtual void visit(ProgramSyntax::Assignment &); virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::ExpressionStatement &); + virtual void visit(ProgramSyntax::Import &); virtual void visit(ProgramSyntax::Layout &); virtual void visit(ProgramSyntax::StructDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); @@ -52,6 +60,31 @@ private: virtual void visit(ProgramSyntax::Return &); }; + template + struct NodeGatherer: Visitor + { + typedef std::list ResultType; + + std::list nodes; + + const ResultType &get_result() const { return nodes; } + virtual void visit(T &n) { nodes.push_back(&n); } + }; + + struct DeclarationCombiner: Visitor + { + bool toplevel; + std::map > functions; + std::map variables; + bool remove_node; + + DeclarationCombiner(); + + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::FunctionDeclaration &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + }; + struct VariableResolver: Visitor { std::vector blocks; @@ -112,6 +145,7 @@ private: bool self_referencing; }; + typedef std::set ResultType; typedef std::map BlockAssignmentMap; std::set unused_nodes; @@ -124,6 +158,7 @@ private: UnusedVariableLocator(); virtual void apply(ProgramSyntax::Stage &); + const ResultType &get_result() const { return unused_nodes; } virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::MemberAccess &); virtual void visit(ProgramSyntax::BinaryExpression &); @@ -143,10 +178,14 @@ private: { std::set to_remove; + NodeRemover() { } + NodeRemover(const std::set &); + virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::VariableDeclaration &); }; + Resources *resources; ProgramParser parser; ProgramSyntax::Module *module; @@ -154,7 +193,7 @@ public: ProgramCompiler(); void compile(const std::string &); - void compile(IO::Base &); + void compile(IO::Base &, Resources * = 0); void add_shaders(Program &); private: @@ -162,12 +201,14 @@ private: static ProgramSyntax::Module &get_builtins_module(); static ProgramSyntax::Stage *get_builtins(ProgramSyntax::StageType); void process(); + void import(const std::string &); 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 &); + static typename T::ResultType apply(ProgramSyntax::Stage &); + template + static typename T::ResultType apply(ProgramSyntax::Stage &, const A &); }; } // namespace GL