]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/syntax.h
Transform interface block contents into structs
[libs/gl.git] / source / glsl / syntax.h
index 62c289d9fbb6ec48f61be268b7eec67072718e98..30acca42b957bd42b547b642173032160fcdd0df 100644 (file)
@@ -7,6 +7,7 @@
 #include <string>
 #include <vector>
 #include <msp/core/refptr.h>
+#include <msp/core/variant.h>
 #include "features.h"
 #include "glsl_error.h"
 #include "sourcemap.h"
@@ -47,6 +48,7 @@ struct Operator
 
 enum
 {
+       INTERNAL_SOURCE = -2,
        BUILTIN_SOURCE = -1,
        GENERATED_SOURCE = 0
 };
@@ -101,7 +103,7 @@ template<typename T>
 class NodeArray: public NodeContainer<std::vector<RefPtr<T> > >
 { };
 
-struct StructDeclaration;
+struct TypeDeclaration;
 struct VariableDeclaration;
 struct InterfaceBlock;
 struct FunctionDeclaration;
@@ -130,6 +132,9 @@ struct Expression: Node
 {
        const Operator *oper;
 
+       TypeDeclaration *type;
+       bool lvalue;
+
        Expression();
 
        virtual Expression *clone() const = 0;
@@ -138,6 +143,7 @@ struct Expression: Node
 struct Literal: Expression
 {
        std::string token;
+       Variant value;
 
        virtual Literal *clone() const { return new Literal(*this); }
        virtual void visit(NodeVisitor &);
@@ -347,7 +353,11 @@ struct StructDeclaration: TypeDeclaration
 {
        Block members;
 
+       InterfaceBlock *interface_block;
+
        StructDeclaration();
+       StructDeclaration(const StructDeclaration &);
+       ~StructDeclaration();
 
        virtual StructDeclaration *clone() const { return new StructDeclaration(*this); }
        virtual void visit(NodeVisitor &);
@@ -382,10 +392,14 @@ struct InterfaceBlock: Statement
 {
        std::string interface;
        std::string name;
-       Block members;
+       NodePtr<Block> members;
        std::string instance_name;
        bool array;
 
+       /* An interface block's ultimate base type is always a struct.  The
+       immediate type may be either that same struct or an array of it. */
+       TypeDeclaration *type_declaration;
+       StructDeclaration *struct_declaration;
        InterfaceBlock *linked_block;
 
        InterfaceBlock();
@@ -404,6 +418,7 @@ struct FunctionDeclaration: Statement
        Block body;
 
        FunctionDeclaration *definition;
+       TypeDeclaration *return_type_declaration;
 
        FunctionDeclaration();
        FunctionDeclaration(const FunctionDeclaration &);