X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Fresolve.h;h=36af54578da987b53fafcdabaffc3d6130b57a55;hp=856117272f892e9c5e60cd0a6f0ca53e34f6e567;hb=HEAD;hpb=17074650100dd51362f6075eca81e18748808a63 diff --git a/source/glsl/resolve.h b/source/glsl/resolve.h index 85611727..d592e4ef 100644 --- a/source/glsl/resolve.h +++ b/source/glsl/resolve.h @@ -30,9 +30,11 @@ class TypeResolver: private TraversingVisitor private: Stage *stage = 0; std::map alias_map; - std::map array_types; + std::map, TypeDeclaration *> array_types; + std::map, ImageTypeDeclaration *> image_types; NodeList::iterator type_insert_point; - InterfaceBlock *iface_block = 0; + NodeList::iterator block_member_type_ins_pt; + VariableDeclaration *iface_block = 0; bool r_any_resolved = false; public: @@ -40,18 +42,17 @@ public: private: TypeDeclaration *get_or_create_array_type(TypeDeclaration &); - void resolve_type(TypeDeclaration *&, const std::string &, bool); + TypeDeclaration *get_or_create_image_type(ImageTypeDeclaration &, const std::string &); + void resolve_type(TypeDeclaration *&, const std::string &, bool, const Layout * = 0); virtual void visit(Block &); virtual void visit(BasicTypeDeclaration &); virtual void visit(ImageTypeDeclaration &); virtual void visit(StructDeclaration &); virtual void visit(VariableDeclaration &); - virtual void visit(InterfaceBlock &); virtual void visit(FunctionDeclaration &); }; -/** Resolves variable references. Variable references which match the name -of an interface block are turned into interface block references. */ +/** Resolves variable references. */ class VariableResolver: private TraversingVisitor { private: @@ -70,16 +71,15 @@ public: private: virtual void enter(Block &); virtual void visit(RefPtr &); - void check_assignment_target(Statement *); + void check_assignment_target(VariableDeclaration *); virtual void visit(VariableReference &); - virtual void visit(InterfaceBlockReference &); virtual void visit(MemberAccess &); virtual void visit(Swizzle &); virtual void visit(BinaryExpression &); virtual void visit(Assignment &); void merge_layouts(Layout &, const Layout &); + void redeclare_builtin(VariableDeclaration &, VariableDeclaration &); virtual void visit(VariableDeclaration &); - virtual void visit(InterfaceBlock &); }; /** Resolves types and lvalueness of expressions. */ @@ -101,6 +101,7 @@ private: }; Stage *stage = 0; + const FunctionDeclaration *current_function = 0; std::vector basic_types; NodeList::iterator insert_point; bool r_any_resolved = false; @@ -120,7 +121,6 @@ private: virtual void visit(Block &); virtual void visit(Literal &); virtual void visit(VariableReference &); - virtual void visit(InterfaceBlockReference &); virtual void visit(MemberAccess &); virtual void visit(Swizzle &); virtual void visit(UnaryExpression &); @@ -132,6 +132,8 @@ private: virtual void visit(FunctionCall &); virtual void visit(BasicTypeDeclaration &); virtual void visit(VariableDeclaration &); + virtual void visit(FunctionDeclaration &); + virtual void visit(Return &); }; /** Resolves function declarations and calls. */