]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/generate.h
Transform interface block contents into structs
[libs/gl.git] / source / glsl / generate.h
index 54e39f39aa0679088ea7d18dd98192c32645f07c..427f4de2360d977819d02ba9373b5beb7dfee7fe 100644 (file)
@@ -48,8 +48,13 @@ private:
 /** Forms links between nested blocks in the syntax tree. */
 class BlockHierarchyResolver: private TraversingVisitor
 {
+private:
+       bool r_any_resolved;
+
 public:
-       void apply(Stage &s) { s.content.visit(*this); }
+       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 &);
@@ -63,19 +68,23 @@ private:
        std::map<TypeDeclaration *, TypeDeclaration *> alias_map;
        std::map<TypeDeclaration *, TypeDeclaration *> array_types;
        NodeList<Statement>::iterator type_insert_point;
+       InterfaceBlock *iface_block;
+       bool r_any_resolved;
 
 public:
        TypeResolver();
 
-       void apply(Stage &);
+       bool apply(Stage &);
 
 private:
-       TypeDeclaration *resolve_type(const std::string &);
+       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 &);
 };
 
@@ -86,7 +95,6 @@ class VariableResolver: private TraversingVisitor
 private:
        Stage *stage;
        RefPtr<Expression> r_replacement_expr;
-       std::string block_interface;
        bool r_any_resolved;
        bool record_target;
        bool r_self_referencing;
@@ -164,9 +172,10 @@ class FunctionResolver: private TraversingVisitor
 private:
        Stage *stage;
        std::map<std::string, std::vector<FunctionDeclaration *> > declarations;
+       bool r_any_resolved;
 
 public:
-       void apply(Stage &);
+       bool apply(Stage &);
 
 private:
        virtual void visit(FunctionCall &);
@@ -188,7 +197,6 @@ private:
        std::string in_prefix;
        std::string out_prefix;
        bool function_scope;
-       InterfaceBlock *iface_block;
        bool copy_block;
        Block *iface_target_block;
        NodeList<Statement>::iterator iface_insert_point;