X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=7e8d3373a53e4ffcf028a218d99e420d1a9cd5a7;hp=e43b3a2d45c0e1c272976de51abd6c643cff0054;hb=bfeb6c6404659fffb1222e084b0bd08cccb4e67d;hpb=f02daac8305327d403e947e23c4f2d231eced417 diff --git a/source/programcompiler.h b/source/programcompiler.h index e43b3a2d..7e8d3373 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 &, std::list >::iterator &); + using Visitor::visit; + virtual void visit(ProgramSyntax::Block &); + }; + struct Formatter: Visitor { typedef std::string ResultType; @@ -40,6 +53,7 @@ private: virtual void apply(ProgramSyntax::Stage &); const std::string &get_result() const { return formatted; } + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::Literal &); virtual void visit(ProgramSyntax::ParenthesizedExpression &); @@ -51,6 +65,7 @@ private: virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::ExpressionStatement &); virtual void visit(ProgramSyntax::Import &); + virtual void visit(ProgramSyntax::Precision &); virtual void visit(ProgramSyntax::Layout &); virtual void visit(ProgramSyntax::InterfaceLayout &); virtual void visit(ProgramSyntax::StructDeclaration &); @@ -66,23 +81,24 @@ 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(); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::FunctionDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); @@ -101,6 +117,7 @@ private: VariableResolver(); virtual void apply(ProgramSyntax::Stage &); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::MemberAccess &); @@ -115,22 +132,11 @@ private: { std::map > functions; + using Visitor::visit; 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; @@ -142,6 +148,7 @@ private: static std::string get_out_prefix(ProgramSyntax::StageType); virtual void apply(ProgramSyntax::Stage &); + using Visitor::visit; 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 &); @@ -151,12 +158,6 @@ private: virtual void visit(ProgramSyntax::Passthrough &); }; - struct VariableRenamer: Visitor - { - virtual void visit(ProgramSyntax::VariableReference &); - virtual void visit(ProgramSyntax::VariableDeclaration &); - }; - struct DeclarationReorderer: Visitor { enum DeclarationKind @@ -168,16 +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 @@ -191,6 +197,7 @@ private: InlineableFunctionLocator(); const ResultType &get_result() const { return inlineable; } + using Visitor::visit; virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::FunctionDeclaration &); }; @@ -205,6 +212,7 @@ private: FunctionInliner(const std::set &); void visit_and_inline(RefPtr &); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::UnaryExpression &); virtual void visit(ProgramSyntax::BinaryExpression &); @@ -223,6 +231,7 @@ private: ExpressionEvaluator(); ExpressionEvaluator(const ValueMap &); + using ProgramSyntax::NodeVisitor::visit; virtual void visit(ProgramSyntax::Literal &); virtual void visit(ProgramSyntax::ParenthesizedExpression &); virtual void visit(ProgramSyntax::VariableReference &); @@ -237,6 +246,7 @@ private: ConstantConditionEliminator(); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::Assignment &); virtual void visit(ProgramSyntax::VariableDeclaration &); @@ -246,38 +256,44 @@ private: struct UnusedVariableLocator: Visitor { - struct AssignmentList + struct VariableInfo { - std::vector nodes; - bool conditional; - bool self_referencing; + bool local; + std::vector assignments; + bool conditionally_assigned; + bool referenced; + + VariableInfo(); }; typedef std::set ResultType; - typedef std::map BlockAssignmentMap; + typedef std::map BlockVariableMap; std::set unused_nodes; std::map aggregates; ProgramSyntax::Node *aggregate; - std::vector assignments; + std::vector variables; ProgramSyntax::Assignment *assignment; bool assignment_target; + bool global_scope; UnusedVariableLocator(); virtual void apply(ProgramSyntax::Stage &); const ResultType &get_result() const { return unused_nodes; } + using Visitor::visit; virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::MemberAccess &); virtual void visit(ProgramSyntax::BinaryExpression &); virtual void visit(ProgramSyntax::Assignment &); void record_assignment(ProgramSyntax::VariableDeclaration &, ProgramSyntax::Node &, bool); + void clear_assignments(VariableInfo &, bool); virtual void visit(ProgramSyntax::ExpressionStatement &); virtual void visit(ProgramSyntax::StructDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); virtual void visit(ProgramSyntax::InterfaceBlock &); virtual void visit(ProgramSyntax::FunctionDeclaration &); - void merge_down_assignments(); + void merge_down_variables(); virtual void visit(ProgramSyntax::Conditional &); virtual void visit(ProgramSyntax::Iteration &); }; @@ -290,6 +306,7 @@ private: std::set used_definitions; const ResultType &get_result() const { return unused_nodes; } + using Visitor::visit; virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::FunctionDeclaration &); }; @@ -301,45 +318,78 @@ private: NodeRemover() { } NodeRemover(const std::set &); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::VariableDeclaration &); }; + struct PrecisionRemover: BlockModifier + { + using Visitor::visit; + virtual void visit(ProgramSyntax::Precision &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + }; + + struct DefaultPrecisionGenerator: BlockModifier + { + bool toplevel; + std::set have_default; + + DefaultPrecisionGenerator(); + + using Visitor::visit; + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::Precision &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + }; + struct LegacyConverter: BlockModifier { + GLApi target_api; Version target_version; std::string type; - std::string frag_out_name; + ProgramSyntax::VariableDeclaration *frag_out; LegacyConverter(); LegacyConverter(const Version &); - bool check_version(const Version &); + bool check_version(const Version &) const; + using Visitor::visit; + bool supports_unified_interface_syntax() const; virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::Assignment &); + bool supports_unified_sampling_functions() const; virtual void visit(ProgramSyntax::FunctionCall &); + bool supports_interface_layouts() 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 &); bool optimize(ProgramSyntax::Stage &); + void finalize(ProgramSyntax::Stage &); static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &); template static typename T::ResultType apply(ProgramSyntax::Stage &);