]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/reflect.h
Add visitors to calculate offsets of struct members
[libs/gl.git] / source / glsl / reflect.h
index a48ad53f8cfa9b960665af6a61cd66e2a475d686..162ed9c0b8bcf4ddb01daf17724e4308138decd0 100644 (file)
@@ -25,6 +25,49 @@ private:
        virtual void visit(VariableDeclaration &);
 };
 
+/** Determines the size and alignment of a variable, in bytes. */
+class MemoryRequirementsCalculator: private NodeVisitor
+{
+public:
+       struct Result
+       {
+               unsigned size;
+               unsigned alignment;
+
+               Result(unsigned s, unsigned a): size(s), alignment(a) { }
+       };
+private:
+       unsigned r_size;
+       unsigned r_alignment;
+       int r_offset;
+
+public:
+       Result apply(VariableDeclaration &v) { v.visit(*this); return Result(r_size, r_alignment); }
+
+private:
+       virtual void visit(BasicTypeDeclaration &);
+       virtual void visit(StructDeclaration &);
+       virtual void visit(VariableDeclaration &);
+};
+
+/** Collects dependencies of a function.  This includes global variables,
+interface blocks, other functions and types. */
+class DependencyCollector: private TraversingVisitor
+{
+private:
+       std::set<Node *> dependencies;
+       std::set<Node *> locals;
+
+public:
+       std::set<Node *> apply(FunctionDeclaration &);
+
+private:
+       virtual void visit(VariableReference &);
+       virtual void visit(InterfaceBlockReference &);
+       virtual void visit(FunctionCall &);
+       virtual void visit(VariableDeclaration &);
+};
+
 } // namespace SL
 } // namespace GL
 } // namespace Msp