X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fresolve.h;fp=source%2Fglsl%2Fresolve.h;h=ca9c4f3231f8416c69b493ba1a0a218ea200e135;hb=bbe2fb7bc1384d7683f1795b5cfa9168df18c580;hp=0000000000000000000000000000000000000000;hpb=b19f8f1c9cfc351cc3aeea3f97a5f8640dd947e2;p=libs%2Fgl.git diff --git a/source/glsl/resolve.h b/source/glsl/resolve.h new file mode 100644 index 00000000..ca9c4f32 --- /dev/null +++ b/source/glsl/resolve.h @@ -0,0 +1,170 @@ +#ifndef MSP_GL_SL_RESOLVE_H_ +#define MSP_GL_SL_RESOLVE_H_ + +#include +#include +#include +#include +#include "visitor.h" + +namespace Msp { +namespace GL { +namespace SL { + +/** Forms links between nested blocks in the syntax tree. */ +class BlockHierarchyResolver: private TraversingVisitor +{ +private: + bool r_any_resolved; + +public: + BlockHierarchyResolver(): r_any_resolved(false) { } + + bool apply(Stage &s) { r_any_resolved = false; s.content.visit(*this); return r_any_resolved; } + +private: + virtual void enter(Block &); +}; + +/** Resolves types of variables and base types of other types. */ +class TypeResolver: private TraversingVisitor +{ +private: + Stage *stage; + std::map alias_map; + std::map array_types; + NodeList::iterator type_insert_point; + InterfaceBlock *iface_block; + bool r_any_resolved; + +public: + TypeResolver(); + + bool apply(Stage &); + +private: + TypeDeclaration *get_or_create_array_type(TypeDeclaration &); + void resolve_type(TypeDeclaration *&, const std::string &, bool); + 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. */ +class VariableResolver: private TraversingVisitor +{ +private: + Stage *stage; + RefPtr r_replacement_expr; + bool r_any_resolved; + bool record_target; + bool r_self_referencing; + Assignment::Target r_assignment_target; + std::vector redeclared_builtins; + std::set nodes_to_remove; + +public: + VariableResolver(); + + bool apply(Stage &); + +private: + virtual void enter(Block &); + virtual void visit(RefPtr &); + void check_assignment_target(Statement *); + virtual void visit(VariableReference &); + virtual void visit(InterfaceBlockReference &); + void add_to_chain(Assignment::Target::ChainType, unsigned); + virtual void visit(MemberAccess &); + virtual void visit(Swizzle &); + virtual void visit(BinaryExpression &); + virtual void visit(Assignment &); + void merge_layouts(Layout &, const Layout &); + virtual void visit(VariableDeclaration &); + virtual void visit(InterfaceBlock &); +}; + +/** Resolves types and lvalueness of expressions. */ +class ExpressionResolver: private TraversingVisitor +{ +private: + enum Compatibility + { + NOT_COMPATIBLE, + LEFT_CONVERTIBLE, + RIGHT_CONVERTIBLE, + SAME_TYPE + }; + + struct ArgumentInfo + { + BasicTypeDeclaration *type; + unsigned component_count; + }; + + Stage *stage; + std::vector basic_types; + NodeList::iterator insert_point; + bool r_any_resolved; + +public: + ExpressionResolver(); + + bool apply(Stage &); + +private: + static bool is_scalar(BasicTypeDeclaration &); + static bool is_vector_or_matrix(BasicTypeDeclaration &); + static BasicTypeDeclaration *get_element_type(BasicTypeDeclaration &); + static bool can_convert(BasicTypeDeclaration &, BasicTypeDeclaration &); + static Compatibility get_compatibility(BasicTypeDeclaration &, BasicTypeDeclaration &); + BasicTypeDeclaration *find_type(BasicTypeDeclaration::Kind, unsigned); + BasicTypeDeclaration *find_type(BasicTypeDeclaration &, BasicTypeDeclaration::Kind, unsigned); + void convert_to(RefPtr &, BasicTypeDeclaration &); + bool convert_to_element(RefPtr &, BasicTypeDeclaration &); + bool truncate_vector(RefPtr &, unsigned); + void resolve(Expression &, TypeDeclaration *, bool); + + 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 &); + void visit(BinaryExpression &, bool); + virtual void visit(BinaryExpression &); + virtual void visit(Assignment &); + virtual void visit(TernaryExpression &); + void visit_constructor(FunctionCall &); + virtual void visit(FunctionCall &); + virtual void visit(BasicTypeDeclaration &); + virtual void visit(VariableDeclaration &); +}; + +/** Resolves function declarations and calls. */ +class FunctionResolver: private TraversingVisitor +{ +private: + Stage *stage; + std::map > declarations; + bool r_any_resolved; + +public: + bool apply(Stage &); + +private: + virtual void visit(FunctionCall &); + virtual void visit(FunctionDeclaration &); +}; + +} // namespace SL +} // namespace GL +} // namespace Msp + +#endif