]> 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 4ff05fa1a09f9275760dcbfe617610dc6d21a2e3..30acca42b957bd42b547b642173032160fcdd0df 100644 (file)
@@ -7,7 +7,9 @@
 #include <string>
 #include <vector>
 #include <msp/core/refptr.h>
+#include <msp/core/variant.h>
 #include "features.h"
+#include "glsl_error.h"
 #include "sourcemap.h"
 
 #pragma push_macro("interface")
@@ -30,7 +32,8 @@ struct Operator
        enum Associativity
        {
                LEFT_TO_RIGHT,
-               RIGHT_TO_LEFT
+               RIGHT_TO_LEFT,
+               ASSOCIATIVE
        };
 
        char token[4];
@@ -39,15 +42,26 @@ struct Operator
        Associativity assoc;
 
        static const Operator operators[];
+
+       static const Operator &get_operator(const std::string &, Type);
+};
+
+enum
+{
+       INTERNAL_SOURCE = -2,
+       BUILTIN_SOURCE = -1,
+       GENERATED_SOURCE = 0
 };
 
 struct NodeVisitor;
 
 struct Node
 {
-protected:
-       Node() { }
-       Node(const Node &) { }
+       int source;
+       unsigned line;
+
+       Node(): source(GENERATED_SOURCE), line(1) { }
+       Node(const Node &n): source(n.source), line(n.line) { }
 private:
        Node &operator=(const Node &);
 public:
@@ -89,18 +103,13 @@ template<typename T>
 class NodeArray: public NodeContainer<std::vector<RefPtr<T> > >
 { };
 
-struct StructDeclaration;
+struct TypeDeclaration;
 struct VariableDeclaration;
 struct InterfaceBlock;
 struct FunctionDeclaration;
 
 struct Statement: Node
 {
-       unsigned source;
-       unsigned line;
-
-       Statement();
-
        virtual Statement *clone() const = 0;
 };
 
@@ -108,9 +117,8 @@ struct Block: Node
 {
        NodeList<Statement> body;
        bool use_braces;
-       std::map<std::string, StructDeclaration *> types;
+
        std::map<std::string, VariableDeclaration *> variables;
-       std::set<InterfaceBlock *> interfaces;
        Block *parent;
 
        Block();
@@ -122,12 +130,20 @@ struct Block: Node
 
 struct Expression: Node
 {
+       const Operator *oper;
+
+       TypeDeclaration *type;
+       bool lvalue;
+
+       Expression();
+
        virtual Expression *clone() const = 0;
 };
 
 struct Literal: Expression
 {
        std::string token;
+       Variant value;
 
        virtual Literal *clone() const { return new Literal(*this); }
        virtual void visit(NodeVisitor &);
@@ -144,6 +160,7 @@ struct ParenthesizedExpression: Expression
 struct VariableReference: Expression
 {
        std::string name;
+
        VariableDeclaration *declaration;
 
        VariableReference();
@@ -153,10 +170,24 @@ struct VariableReference: Expression
        virtual void visit(NodeVisitor &);
 };
 
+struct InterfaceBlockReference: Expression
+{
+       std::string name;
+
+       InterfaceBlock *declaration;
+
+       InterfaceBlockReference();
+       InterfaceBlockReference(const InterfaceBlockReference &);
+
+       virtual InterfaceBlockReference *clone() const { return new InterfaceBlockReference(*this); }
+       virtual void visit(NodeVisitor &);
+};
+
 struct MemberAccess: Expression
 {
        NodePtr<Expression> left;
        std::string member;
+
        VariableDeclaration *declaration;
 
        MemberAccess();
@@ -168,11 +199,7 @@ struct MemberAccess: Expression
 
 struct UnaryExpression: Expression
 {
-       std::string oper;
        NodePtr<Expression> expression;
-       bool prefix;
-
-       UnaryExpression();
 
        virtual UnaryExpression *clone() const { return new UnaryExpression(*this); }
        virtual void visit(NodeVisitor &);
@@ -181,9 +208,7 @@ struct UnaryExpression: Expression
 struct BinaryExpression: Expression
 {
        NodePtr<Expression> left;
-       std::string oper;
        NodePtr<Expression> right;
-       std::string after;
 
        virtual BinaryExpression *clone() const { return new BinaryExpression(*this); }
        virtual void visit(NodeVisitor &);
@@ -192,6 +217,7 @@ struct BinaryExpression: Expression
 struct Assignment: BinaryExpression
 {
        bool self_referencing;
+
        VariableDeclaration *target_declaration;
 
        Assignment();
@@ -204,10 +230,11 @@ struct Assignment: BinaryExpression
 struct FunctionCall: Expression
 {
        std::string name;
-       FunctionDeclaration *declaration;
        bool constructor;
        NodeArray<Expression> arguments;
 
+       FunctionDeclaration *declaration;
+
        FunctionCall();
        FunctionCall(const FunctionCall &);
 
@@ -264,12 +291,73 @@ struct InterfaceLayout: Statement
        virtual void visit(NodeVisitor &);
 };
 
-struct StructDeclaration: Statement
+struct TypeDeclaration: Statement
 {
        std::string name;
+
+       virtual TypeDeclaration *clone() const = 0;
+};
+
+struct BasicTypeDeclaration: TypeDeclaration
+{
+       enum Kind
+       {
+               ALIAS,
+               VOID,
+               BOOL,
+               INT,
+               FLOAT,
+               VECTOR,
+               MATRIX,
+               ARRAY
+       };
+
+       Kind kind;
+       unsigned size;
+       std::string base;
+
+       TypeDeclaration *base_type;
+
+       BasicTypeDeclaration();
+       BasicTypeDeclaration(const BasicTypeDeclaration &);
+
+       virtual BasicTypeDeclaration *clone() const { return new BasicTypeDeclaration(*this); }
+       virtual void visit(NodeVisitor &);
+};
+
+struct ImageTypeDeclaration: TypeDeclaration
+{
+       enum Dimensions
+       {
+               ONE = 1,
+               TWO,
+               THREE,
+               CUBE
+       };
+
+       Dimensions dimensions;
+       bool array;
+       bool sampled;
+       bool shadow;
+       std::string base;
+
+       TypeDeclaration *base_type;
+
+       ImageTypeDeclaration();
+
+       virtual ImageTypeDeclaration *clone() const { return new ImageTypeDeclaration(*this); }
+       virtual void visit(NodeVisitor &);
+};
+
+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 &);
@@ -277,22 +365,24 @@ struct StructDeclaration: Statement
 
 struct VariableDeclaration: Statement
 {
+       NodePtr<Layout> layout;
        bool constant;
        std::string sampling;
        std::string interpolation;
        std::string interface;
        std::string precision;
        std::string type;
-       StructDeclaration *type_declaration;
        std::string name;
        bool array;
        NodePtr<Expression> array_size;
        NodePtr<Expression> init_expression;
+
+       TypeDeclaration *type_declaration;
        VariableDeclaration *linked_declaration;
-       NodePtr<Layout> layout;
 
        VariableDeclaration();
        VariableDeclaration(const VariableDeclaration &);
+       ~VariableDeclaration();
 
        virtual VariableDeclaration *clone() const { return new VariableDeclaration(*this); }
        virtual void visit(NodeVisitor &);
@@ -302,11 +392,19 @@ 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();
+       InterfaceBlock(const InterfaceBlock &);
+       ~InterfaceBlock();
 
        virtual InterfaceBlock *clone() const { return new InterfaceBlock(*this); }
        virtual void visit(NodeVisitor &);
@@ -317,9 +415,11 @@ struct FunctionDeclaration: Statement
        std::string return_type;
        std::string name;
        NodeArray<VariableDeclaration> parameters;
-       FunctionDeclaration *definition;
        Block body;
 
+       FunctionDeclaration *definition;
+       TypeDeclaration *return_type_declaration;
+
        FunctionDeclaration();
        FunctionDeclaration(const FunctionDeclaration &);
 
@@ -339,7 +439,7 @@ struct Conditional: Statement
 
 struct Iteration: Statement
 {
-       NodePtr<Node> init_statement;
+       NodePtr<Statement> init_statement;
        NodePtr<Expression> condition;
        NodePtr<Expression> loop_expression;
        Block body;
@@ -385,8 +485,12 @@ struct Stage
        Type type;
        Stage *previous;
        Block content;
+       std::map<std::string, TypeDeclaration *> types;
+       std::map<std::string, InterfaceBlock *> interface_blocks;
+       std::map<std::string, FunctionDeclaration *> functions;
        std::map<std::string, unsigned> locations;
        Features required_features;
+       std::vector<Diagnostic> diagnostics;
 
        Stage(Type);