]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/syntax.h
Use standard fixed-size integer types
[libs/gl.git] / source / glsl / syntax.h
index da7b0907e37460d5b7041d32e2c921dee9473563..7fa116b717dd388e5a2acba6001dc34c74226bab 100644 (file)
@@ -6,7 +6,9 @@
 #include <set>
 #include <string>
 #include <vector>
+#include <cstdint>
 #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
@@ -36,7 +39,8 @@ struct Operator
        };
 
        char token[4];
-       unsigned precedence;
+       char token2[2];
+       std::uint8_t precedence;
        Type type;
        Associativity assoc;
 
@@ -47,6 +51,7 @@ struct Operator
 
 enum
 {
+       INTERNAL_SOURCE = -2,
        BUILTIN_SOURCE = -1,
        GENERATED_SOURCE = 0
 };
@@ -55,9 +60,11 @@ 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,6 +96,9 @@ class NodeContainer: public C
 public:
        NodeContainer() { }
        NodeContainer(const NodeContainer &);
+
+       void push_back_nocopy(const typename C::value_type &v)
+       { C::push_back(0); C::back() = v; }
 };
 
 template<typename T>
@@ -99,18 +109,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
 {
-       int source;
-       unsigned line;
-
-       Statement();
-
        virtual Statement *clone() const = 0;
 };
 
@@ -133,6 +138,9 @@ struct Expression: Node
 {
        const Operator *oper;
 
+       TypeDeclaration *type;
+       bool lvalue;
+
        Expression();
 
        virtual Expression *clone() const = 0;
@@ -141,19 +149,12 @@ struct Expression: Node
 struct Literal: Expression
 {
        std::string token;
+       Variant value;
 
        virtual Literal *clone() const { return new Literal(*this); }
        virtual void visit(NodeVisitor &);
 };
 
-struct ParenthesizedExpression: Expression
-{
-       NodePtr<Expression> expression;
-
-       virtual ParenthesizedExpression *clone() const { return new ParenthesizedExpression(*this); }
-       virtual void visit(NodeVisitor &);
-};
-
 struct VariableReference: Expression
 {
        std::string name;
@@ -186,6 +187,7 @@ struct MemberAccess: Expression
        std::string member;
 
        VariableDeclaration *declaration;
+       int index;
 
        MemberAccess();
        MemberAccess(const MemberAccess &);
@@ -194,6 +196,19 @@ struct MemberAccess: Expression
        virtual void visit(NodeVisitor &);
 };
 
+struct Swizzle: Expression
+{
+       NodePtr<Expression> left;
+       std::string component_group;
+       unsigned count;
+       std::uint8_t components[4];
+
+       Swizzle();
+
+       virtual Swizzle *clone() const { return new Swizzle(*this); }
+       virtual void visit(NodeVisitor &);
+};
+
 struct UnaryExpression: Expression
 {
        NodePtr<Expression> expression;
@@ -213,9 +228,27 @@ struct BinaryExpression: Expression
 
 struct Assignment: BinaryExpression
 {
+       struct Target
+       {
+               enum ChainType
+               {
+                       MEMBER = 0x40,
+                       SWIZZLE = 0x80,
+                       ARRAY = 0xC0
+               };
+
+               Statement *declaration;
+               std::uint8_t chain_len;
+               std::uint8_t chain[7];
+
+               Target(Statement * = 0);
+
+               bool operator<(const Target &) const;
+       };
+
        bool self_referencing;
 
-       VariableDeclaration *target_declaration;
+       Target target;
 
        Assignment();
        Assignment(const Assignment &);
@@ -224,6 +257,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;
@@ -271,6 +314,9 @@ struct Layout: Node
                std::string name;
                bool has_value;
                int value;
+
+               Qualifier(const std::string &n = std::string()): name(n), has_value(false), value(0) { }
+               Qualifier(const std::string &n, int v): name(n), has_value(true), value(v) { }
        };
 
        std::vector<Qualifier> qualifiers;
@@ -288,12 +334,74 @@ 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;
+       bool sign;
+       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 &);
@@ -313,7 +421,7 @@ struct VariableDeclaration: Statement
        NodePtr<Expression> array_size;
        NodePtr<Expression> init_expression;
 
-       StructDeclaration *type_declaration;
+       TypeDeclaration *type_declaration;
        VariableDeclaration *linked_declaration;
 
        VariableDeclaration();
@@ -326,12 +434,17 @@ struct VariableDeclaration: Statement
 
 struct InterfaceBlock: Statement
 {
+       NodePtr<Layout> layout;
        std::string interface;
-       std::string name;
-       Block members;
+       std::string block_name;
+       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();
@@ -347,9 +460,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 &);
@@ -416,10 +533,12 @@ struct Stage
        Type type;
        Stage *previous;
        Block content;
-       std::map<std::string, StructDeclaration *> types;
+       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;
+       std::map<std::string, unsigned> texture_bindings;
+       std::map<std::string, unsigned> uniform_block_bindings;
        Features required_features;
        std::vector<Diagnostic> diagnostics;
 
@@ -437,6 +556,11 @@ struct Module
        Module();
 };
 
+std::string get_unused_variable_name(const Block &, const std::string &);
+
+int get_layout_value(const Layout &, const std::string &, int = -1);
+void add_to_chain(Assignment::Target &, Assignment::Target::ChainType, unsigned);
+
 } // namespace SL
 } // namespace GL
 } // namespace Msp