X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=a2dd9401256a34c7659800765f8cf25ca56a8313;hb=a048354f5be808c97d92504f9e618f6f5558ce1e;hp=34b64b557ca29a9185dc2f5e2aacaa1420bbf325;hpb=96881e56ececfa3f4b0707dc168c687b35d249a0;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 34b64b55..a2dd9401 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -27,7 +27,8 @@ private: std::string formatted; unsigned indent; bool parameter_list; - bool else_if; + unsigned else_if; + std::string block_interface; Formatter(); @@ -38,6 +39,7 @@ private: virtual void visit(ProgramSyntax::MemberAccess &); virtual void visit(ProgramSyntax::UnaryExpression &); virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::Assignment &); virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::ExpressionStatement &); virtual void visit(ProgramSyntax::Layout &); @@ -55,13 +57,19 @@ private: std::vector blocks; ProgramSyntax::StructDeclaration *type; bool anonymous; + std::string block_interface; + bool record_target; + ProgramSyntax::VariableDeclaration *assignment_target; + bool self_referencing; 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::Assignment &); virtual void visit(ProgramSyntax::StructDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); virtual void visit(ProgramSyntax::InterfaceBlock &); @@ -97,33 +105,46 @@ private: struct UnusedVariableLocator: Visitor { + struct AssignmentList + { + std::vector nodes; + bool conditional; + bool self_referencing; + }; + + typedef std::map BlockAssignmentMap; + std::set unused_nodes; - std::map assignments; - bool assignment; - ProgramSyntax::VariableDeclaration *assignment_target; + std::map aggregates; + ProgramSyntax::Node *aggregate; + std::vector assignments; + ProgramSyntax::Assignment *assignment; + bool assignment_target; UnusedVariableLocator(); + virtual void apply(ProgramSyntax::Stage &); 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); 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(); + virtual void visit(ProgramSyntax::Conditional &); + virtual void visit(ProgramSyntax::Iteration &); }; struct NodeRemover: Visitor { std::set to_remove; - unsigned n_removed; - bool immutable_block; - bool remove_block; - - NodeRemover(); virtual void visit(ProgramSyntax::Block &); - virtual void visit(ProgramSyntax::StructDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); - virtual void visit(ProgramSyntax::InterfaceBlock &); }; ProgramParser parser; @@ -137,6 +158,9 @@ public: 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 process(); void generate(ProgramSyntax::Stage &); bool optimize(ProgramSyntax::Stage &);