X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=8c4f54537c7bc0da9f70ce9a744acf154157bb5d;hp=daf2a5db7904988f9e782e300b25e88ebcc47835;hb=8468279a03d906f79fb6158162c7970d4d7fff60;hpb=a5772e203cc30ce3b449614d03a293fd5b5985ad diff --git a/source/programcompiler.h b/source/programcompiler.h index daf2a5db..8c4f5453 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -26,6 +26,19 @@ private: void get_result() const { } }; + struct BlockModifier: Visitor + { + bool remove_node; + std::vector > insert_nodes; + + BlockModifier(); + + void flatten_block(ProgramSyntax::Block &); + void apply_and_increment(ProgramSyntax::Block &, ProgramSyntax::NodeList::iterator &); + using Visitor::visit; + virtual void visit(ProgramSyntax::Block &); + }; + struct Formatter: Visitor { typedef std::string ResultType; @@ -68,21 +81,20 @@ private: template struct NodeGatherer: Visitor { - typedef std::list ResultType; + typedef std::vector ResultType; - std::list nodes; + std::vector nodes; const ResultType &get_result() const { return nodes; } using Visitor::visit; virtual void visit(T &n) { nodes.push_back(&n); } }; - struct DeclarationCombiner: Visitor + struct DeclarationCombiner: BlockModifier { bool toplevel; std::map > functions; std::map variables; - bool remove_node; DeclarationCombiner(); @@ -125,19 +137,6 @@ private: 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 &); - using Visitor::visit; - virtual void visit(ProgramSyntax::Block &); - }; - struct InterfaceGenerator: BlockModifier { std::string in_prefix; @@ -159,13 +158,6 @@ private: virtual void visit(ProgramSyntax::Passthrough &); }; - struct VariableRenamer: Visitor - { - using Visitor::visit; - virtual void visit(ProgramSyntax::VariableReference &); - virtual void visit(ProgramSyntax::VariableDeclaration &); - }; - struct DeclarationReorderer: Visitor { enum DeclarationKind @@ -177,17 +169,21 @@ private: FUNCTION }; + unsigned scope_level; DeclarationKind kind; + std::set ordered_funcs; + std::set needed_funcs; DeclarationReorderer(); using Visitor::visit; virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::FunctionCall &); 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::VariableDeclaration &); virtual void visit(ProgramSyntax::InterfaceBlock &) { kind = VARIABLE; } - virtual void visit(ProgramSyntax::FunctionDeclaration &) { kind = FUNCTION; } + virtual void visit(ProgramSyntax::FunctionDeclaration &); }; struct InlineableFunctionLocator: Visitor @@ -220,7 +216,9 @@ private: virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::UnaryExpression &); virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::MemberAccess &); virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::VariableDeclaration &); virtual void visit(ProgramSyntax::Return &); }; @@ -246,12 +244,14 @@ private: struct ConstantConditionEliminator: BlockModifier { unsigned scope_level; + bool record_only; ExpressionEvaluator::ValueMap variable_values; ConstantConditionEliminator(); using Visitor::visit; virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::UnaryExpression &); virtual void visit(ProgramSyntax::Assignment &); virtual void visit(ProgramSyntax::VariableDeclaration &); virtual void visit(ProgramSyntax::Conditional &); @@ -279,6 +279,7 @@ private: std::vector variables; ProgramSyntax::Assignment *assignment; bool assignment_target; + bool assign_to_subscript; bool global_scope; UnusedVariableLocator(); @@ -325,6 +326,7 @@ private: using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::VariableDeclaration &); + virtual void visit(ProgramSyntax::Iteration &); }; struct PrecisionRemover: BlockModifier @@ -358,6 +360,7 @@ private: LegacyConverter(const Version &); bool check_version(const Version &) const; + bool check_extension(const Extension &) const; using Visitor::visit; bool supports_unified_interface_syntax() const; virtual void visit(ProgramSyntax::VariableReference &); @@ -365,26 +368,32 @@ private: bool supports_unified_sampling_functions() const; virtual void visit(ProgramSyntax::FunctionCall &); bool supports_interface_layouts() const; + bool supports_centroid_sampling() const; + bool supports_sample_sampling() const; virtual void visit(ProgramSyntax::VariableDeclaration &); bool supports_interface_blocks(const std::string &) const; virtual void visit(ProgramSyntax::InterfaceBlock &); }; Resources *resources; - ProgramParser parser; ProgramSyntax::Module *module; + std::set imported_names; public: ProgramCompiler(); + ~ProgramCompiler(); - void compile(const std::string &); - void compile(IO::Base &, Resources * = 0); + void compile(const std::string &, const std::string & = ""); + void compile(IO::Base &, Resources * = 0, const std::string & = ""); + void compile(IO::Base &, const std::string &); 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 append_module(ProgramSyntax::Module &); + void append_stage(ProgramSyntax::Stage &); void process(); void import(const std::string &); void generate(ProgramSyntax::Stage &);