X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=0ea485a9765d2faa7cafca338b622c5955b936da;hb=a36992487d018d8801ead6980b362b00a2f5f5c5;hp=9a825489df87e27178cfc0b0e775de0ff6b9ebbc;hpb=6e6ee01b68056b23c6709d7f60396710dd7623b9;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 9a825489..0ea485a9 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -1,6 +1,7 @@ #ifndef MSP_GL_PROGRAMCOMPILER_H_ #define MSP_GL_PROGRAMCOMPILER_H_ +#include #include "programparser.h" #include "programsyntax.h" @@ -21,8 +22,14 @@ public: Formatter(); - std::string format_expression(ProgramSyntax::Expression &); virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::Literal &); + virtual void visit(ProgramSyntax::ParenthesizedExpression &); + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::MemberAccess &); + virtual void visit(ProgramSyntax::UnaryExpression &); + virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::ExpressionStatement &); virtual void visit(ProgramSyntax::Layout &); virtual void visit(ProgramSyntax::StructDeclaration &); @@ -35,6 +42,46 @@ public: }; private: + struct VariableResolver: ProgramSyntax::TraversingVisitor + { + std::vector blocks; + ProgramSyntax::StructDeclaration *type; + bool anonymous; + + VariableResolver(); + + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::MemberAccess &); + virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::StructDeclaration &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + virtual void visit(ProgramSyntax::InterfaceBlock &); + }; + + struct UnusedVariableLocator: ProgramSyntax::TraversingVisitor + { + std::set unused_variables; + + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::MemberAccess &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + }; + + struct NodeRemover: ProgramSyntax::TraversingVisitor + { + 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::InterfaceBlock &); + }; + ProgramParser parser; ProgramSyntax::Module *module; @@ -46,6 +93,9 @@ public: void add_shaders(Program &); private: + void process(); + void process(ProgramSyntax::Context &); + static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &); std::string format_context(ProgramSyntax::Context &); };