X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=46c37930d6d4e948299f6ef43b637746dc3e4256;hb=0ab875bdc9fbf84ecfce883b188410bb45882447;hp=2ef4aa7d9b77c5f853968da6e4e9dbc310c9abec;hpb=7434b80c452eb8f7ac8200a6f693a9eb668421f0;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 2ef4aa7d..46c37930 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -9,6 +9,7 @@ namespace Msp { namespace GL { class Program; +class Resources; class ProgramCompiler { @@ -37,6 +38,7 @@ private: Formatter(); + virtual void apply(ProgramSyntax::Stage &); const std::string &get_result() const { return formatted; } virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::Literal &); @@ -48,7 +50,9 @@ 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::InterfaceLayout &); virtual void visit(ProgramSyntax::StructDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); virtual void visit(ProgramSyntax::InterfaceBlock &); @@ -58,6 +62,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; @@ -81,14 +110,32 @@ private: virtual void visit(ProgramSyntax::InterfaceBlock &); }; - struct InterfaceGenerator: Visitor + struct FunctionResolver: Visitor + { + std::map > functions; + + virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::FunctionDeclaration &); + }; + + struct BlockModifier: Visitor + { + bool remove_node; + std::list > insert_nodes; + + BlockModifier(); + + void flatten_block(ProgramSyntax::Block &); + void apply_and_increment(ProgramSyntax::Block &, std::list >::iterator &); + virtual void visit(ProgramSyntax::Block &); + }; + + struct InterfaceGenerator: BlockModifier { std::string in_prefix; std::string out_prefix; unsigned scope_level; - std::map iface_declarations; - bool remove_node; - std::list insert_nodes; + std::map > iface_declarations; InterfaceGenerator(); @@ -109,6 +156,93 @@ private: virtual void visit(ProgramSyntax::VariableDeclaration &); }; + struct DeclarationReorderer: Visitor + { + enum DeclarationKind + { + NO_DECLARATION, + LAYOUT, + STRUCT, + VARIABLE, + FUNCTION + }; + + DeclarationKind kind; + + DeclarationReorderer(); + + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::InterfaceLayout &) { kind = LAYOUT; } + virtual void visit(ProgramSyntax::StructDeclaration &) { kind = STRUCT; } + virtual void visit(ProgramSyntax::VariableDeclaration &) { kind = VARIABLE; } + virtual void visit(ProgramSyntax::InterfaceBlock &) { kind = VARIABLE; } + virtual void visit(ProgramSyntax::FunctionDeclaration &) { kind = FUNCTION; } + }; + + struct InlineableFunctionLocator: Visitor + { + typedef std::set ResultType; + + std::map refcounts; + std::set inlineable; + ProgramSyntax::FunctionDeclaration *in_function; + + InlineableFunctionLocator(); + + const ResultType &get_result() const { return inlineable; } + virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::FunctionDeclaration &); + }; + + struct FunctionInliner: Visitor + { + std::set inlineable; + unsigned extract_result; + RefPtr inline_result; + + FunctionInliner(); + FunctionInliner(const std::set &); + + void visit_and_inline(RefPtr &); + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::UnaryExpression &); + virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::Return &); + }; + + struct ExpressionEvaluator: ProgramSyntax::NodeVisitor + { + typedef std::map ValueMap; + + const ValueMap *variable_values; + float result; + bool result_valid; + + ExpressionEvaluator(); + ExpressionEvaluator(const ValueMap &); + + virtual void visit(ProgramSyntax::Literal &); + virtual void visit(ProgramSyntax::ParenthesizedExpression &); + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::UnaryExpression &); + virtual void visit(ProgramSyntax::BinaryExpression &); + }; + + struct ConstantConditionEliminator: BlockModifier + { + unsigned scope_level; + ExpressionEvaluator::ValueMap variable_values; + + ConstantConditionEliminator(); + + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::Assignment &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + virtual void visit(ProgramSyntax::Conditional &); + virtual void visit(ProgramSyntax::Iteration &); + }; + struct UnusedVariableLocator: Visitor { struct AssignmentList @@ -147,6 +281,18 @@ private: virtual void visit(ProgramSyntax::Iteration &); }; + struct UnusedFunctionLocator: Visitor + { + typedef std::set ResultType; + + std::set unused_nodes; + std::set used_definitions; + + const ResultType &get_result() const { return unused_nodes; } + virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::FunctionDeclaration &); + }; + struct NodeRemover: Visitor { std::set to_remove; @@ -158,6 +304,23 @@ private: virtual void visit(ProgramSyntax::VariableDeclaration &); }; + struct LegacyConverter: BlockModifier + { + Version target_version; + std::string type; + std::string frag_out_name; + + LegacyConverter(); + LegacyConverter(const Version &); + + bool check_version(const Version &); + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + virtual void visit(ProgramSyntax::InterfaceBlock &); + }; + + Resources *resources; ProgramParser parser; ProgramSyntax::Module *module; @@ -165,7 +328,7 @@ public: ProgramCompiler(); void compile(const std::string &); - void compile(IO::Base &); + void compile(IO::Base &, Resources * = 0); void add_shaders(Program &); private: @@ -173,6 +336,7 @@ 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 &);