]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/reflect.h
Add a SPIR-V backend to the GLSL compiler
[libs/gl.git] / source / glsl / reflect.h
index 9520feb6a924c797ee50b7e8a062dbd7b1f74795..8de915729ce50e8748c9e8011419d5bd4f7cf6b8 100644 (file)
@@ -27,6 +27,8 @@ private:
        void compare(Node &, Node &);
        template<typename T>
        T *multi_visit(T &);
+       virtual void visit(Literal &);
+       virtual void visit(VariableReference &);
        virtual void visit(BasicTypeDeclaration &);
        virtual void visit(ImageTypeDeclaration &);
        virtual void visit(StructDeclaration &);
@@ -51,7 +53,7 @@ private:
        virtual void visit(VariableDeclaration &);
 };
 
-/** Determines the size and alignment of a variable, in bytes. */
+/** Determines the size and alignment of a variable or a type, in bytes. */
 class MemoryRequirementsCalculator: private NodeVisitor
 {
 public:
@@ -59,8 +61,9 @@ public:
        {
                unsigned size;
                unsigned alignment;
+               unsigned stride;
 
-               Result(unsigned s, unsigned a): size(s), alignment(a) { }
+               Result(unsigned s, unsigned a): size(s), alignment(a), stride(s+a-1-(s+a-1)%a) { }
        };
 private:
        unsigned r_size;
@@ -69,6 +72,7 @@ private:
 
 public:
        Result apply(VariableDeclaration &v) { v.visit(*this); return Result(r_size, r_alignment); }
+       Result apply(TypeDeclaration &t) { t.visit(*this); return Result(r_size, r_alignment); }
 
 private:
        virtual void visit(BasicTypeDeclaration &);
@@ -83,6 +87,7 @@ class DependencyCollector: private TraversingVisitor
 private:
        std::set<Node *> dependencies;
        std::set<Node *> locals;
+       std::set<FunctionDeclaration *> visited_functions;
 
 public:
        std::set<Node *> apply(FunctionDeclaration &);
@@ -92,6 +97,7 @@ private:
        virtual void visit(InterfaceBlockReference &);
        virtual void visit(FunctionCall &);
        virtual void visit(VariableDeclaration &);
+       virtual void visit(FunctionDeclaration &);
 };
 
 } // namespace SL