]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/syntax.h
Add GLSL keywords for overriding functions
[libs/gl.git] / source / glsl / syntax.h
index 62c289d9fbb6ec48f61be268b7eec67072718e98..81fd6b4f6390050e0312aee3b2d04983e55217e4 100644 (file)
@@ -6,7 +6,9 @@
 #include <set>
 #include <string>
 #include <vector>
+#include <msp/core/inttypes.h>
 #include <msp/core/refptr.h>
+#include <msp/core/variant.h>
 #include "features.h"
 #include "glsl_error.h"
 #include "sourcemap.h"
@@ -25,7 +27,8 @@ struct Operator
                NO_OPERATOR,
                BINARY,
                PREFIX,
-               POSTFIX
+               POSTFIX,
+               TERNARY
        };
 
        enum Associativity
@@ -47,6 +50,7 @@ struct Operator
 
 enum
 {
+       INTERNAL_SOURCE = -2,
        BUILTIN_SOURCE = -1,
        GENERATED_SOURCE = 0
 };
@@ -101,7 +105,7 @@ template<typename T>
 class NodeArray: public NodeContainer<std::vector<RefPtr<T> > >
 { };
 
-struct StructDeclaration;
+struct TypeDeclaration;
 struct VariableDeclaration;
 struct InterfaceBlock;
 struct FunctionDeclaration;
@@ -130,6 +134,9 @@ struct Expression: Node
 {
        const Operator *oper;
 
+       TypeDeclaration *type;
+       bool lvalue;
+
        Expression();
 
        virtual Expression *clone() const = 0;
@@ -138,6 +145,7 @@ struct Expression: Node
 struct Literal: Expression
 {
        std::string token;
+       Variant value;
 
        virtual Literal *clone() const { return new Literal(*this); }
        virtual void visit(NodeVisitor &);
@@ -191,6 +199,19 @@ struct MemberAccess: Expression
        virtual void visit(NodeVisitor &);
 };
 
+struct Swizzle: Expression
+{
+       NodePtr<Expression> left;
+       std::string component_group;
+       unsigned count;
+       UInt8 components[4];
+
+       Swizzle();
+
+       virtual Swizzle *clone() const { return new Swizzle(*this); }
+       virtual void visit(NodeVisitor &);
+};
+
 struct UnaryExpression: Expression
 {
        NodePtr<Expression> expression;
@@ -210,9 +231,27 @@ struct BinaryExpression: Expression
 
 struct Assignment: BinaryExpression
 {
+       struct Target
+       {
+               enum ChainType
+               {
+                       MEMBER = 0x40,
+                       SWIZZLE = 0x80,
+                       ARRAY = 0xC0
+               };
+
+               Statement *declaration;
+               Msp::UInt8 chain_len;
+               Msp::UInt8 chain[7];
+
+               Target(Statement * = 0);
+
+               bool operator<(const Target &) const;
+       };
+
        bool self_referencing;
 
-       VariableDeclaration *target_declaration;
+       Target target;
 
        Assignment();
        Assignment(const Assignment &);
@@ -221,6 +260,16 @@ struct Assignment: BinaryExpression
        virtual void visit(NodeVisitor &);
 };
 
+struct TernaryExpression: Expression
+{
+       NodePtr<Expression> condition;
+       NodePtr<Expression> true_expr;
+       NodePtr<Expression> false_expr;
+
+       virtual TernaryExpression *clone() const { return new TernaryExpression(*this); }
+       virtual void visit(NodeVisitor &);
+};
+
 struct FunctionCall: Expression
 {
        std::string name;
@@ -347,7 +396,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 +435,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();
@@ -401,9 +458,13 @@ struct FunctionDeclaration: Statement
        std::string return_type;
        std::string name;
        NodeArray<VariableDeclaration> parameters;
+       bool virtua;
+       bool overrd;
        Block body;
 
+       std::string signature;
        FunctionDeclaration *definition;
+       TypeDeclaration *return_type_declaration;
 
        FunctionDeclaration();
        FunctionDeclaration(const FunctionDeclaration &);