Add support for ast_to_hir of post inc/dec.
[mesa.git] / glsl_types.h
index e05130102a52678c41421ea36724f1f52629ee20..68a32efde666d8001c19ce2d26cce83ccf047c57 100644 (file)
@@ -27,6 +27,7 @@
 #define GLSL_TYPES_H
 
 #include <cstring>
+#include <cassert>
 
 #define GLSL_TYPE_UINT          0
 #define GLSL_TYPE_INT           1
 #define GLSL_TYPE_VOID          8
 #define GLSL_TYPE_ERROR         9
 
-#define is_numeric_base_type(b) \
-   (((b) >= GLSL_TYPE_UINT) && ((b) <= GLSL_TYPE_FLOAT))
-
-#define is_integer_base_type(b) \
-   (((b) == GLSL_TYPE_UINT) || ((b) == GLSL_TYPE_INT))
-
-#define is_error_type(t) ((t)->base_type == GLSL_TYPE_ERROR)
-
 enum glsl_sampler_dim {
    GLSL_SAMPLER_DIM_1D = 0,
    GLSL_SAMPLER_DIM_2D,
@@ -68,8 +61,16 @@ struct glsl_type {
                                * and \c GLSL_TYPE_UINT are valid.
                                */
 
-   unsigned vector_elements:3; /**< 0, 2, 3, or 4 vector elements. */
-   unsigned matrix_columns:3;  /**< 0, 2, 3, or 4 matrix columns. */
+   /**
+    * \name Vector and matrix element counts
+    *
+    * For scalars, each of these values will be 1.  For non-numeric types
+    * these will be 0.
+    */
+   /*@{*/
+   unsigned vector_elements:3; /**< 1, 2, 3, or 4 vector elements. */
+   unsigned matrix_columns:3;  /**< 1, 2, 3, or 4 matrix columns. */
+   /*@}*/
 
    /**
     * Name of the data type
@@ -122,6 +123,9 @@ struct glsl_type {
       name(name),
       length(0)
    {
+      /* Neither dimension is zero or both dimensions are zero.
+       */
+      assert((vector_elements == 0) == (matrix_columns == 0));
       memset(& fields, 0, sizeof(fields));
    }
 
@@ -165,12 +169,20 @@ struct glsl_type {
    static const glsl_type *get_instance(unsigned base_type, unsigned rows,
                                        unsigned columns);
 
+   /**
+    * Query the total number of scalars that make up a scalar, vector or matrix
+    */
+   unsigned components() const
+   {
+      return vector_elements * matrix_columns;
+   }
+
    /**
     * Query whether or not a type is a scalar (non-vector and non-matrix).
     */
    bool is_scalar() const
    {
-      return (vector_elements == 0)
+      return (vector_elements == 1)
         && (base_type >= GLSL_TYPE_UINT)
         && (base_type <= GLSL_TYPE_BOOL);
    }
@@ -180,8 +192,8 @@ struct glsl_type {
     */
    bool is_vector() const
    {
-      return (vector_elements > 0)
-        && (matrix_columns == 0)
+      return (vector_elements > 1)
+        && (matrix_columns == 1)
         && (base_type >= GLSL_TYPE_UINT)
         && (base_type <= GLSL_TYPE_BOOL);
    }
@@ -192,7 +204,7 @@ struct glsl_type {
    bool is_matrix() const
    {
       /* GLSL only has float matrices. */
-      return (matrix_columns > 0) && (base_type == GLSL_TYPE_FLOAT);
+      return (matrix_columns > 1) && (base_type == GLSL_TYPE_FLOAT);
    }
 
    /**
@@ -203,6 +215,14 @@ struct glsl_type {
       return (base_type >= GLSL_TYPE_UINT) && (base_type <= GLSL_TYPE_FLOAT);
    }
 
+   /**
+    * Query whether or not a type is an integral type
+    */
+   bool is_integer() const
+   {
+      return (base_type == GLSL_TYPE_UINT) || (base_type == GLSL_TYPE_INT);
+   }
+
    /**
     * Query whether or not a type is a non-array boolean type
     */