#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,
* and \c GLSL_TYPE_UINT are valid.
*/
- unsigned vector_elements:3; /**< 0, 2, 3, or 4 vector elements. */
- unsigned matrix_rows:3; /**< 0, 2, 3, or 4 matrix rows. */
+ /**
+ * \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
} fields;
+ /**
+ * \name Pointers to various public type singletons
+ */
+ /*@{*/
+ static const glsl_type *const error_type;
+ static const glsl_type *const int_type;
+ static const glsl_type *const uint_type;
+ static const glsl_type *const float_type;
+ static const glsl_type *const bool_type;
+ /*@}*/
+
+
glsl_type(unsigned base_type, unsigned vector_elements,
- unsigned matrix_rows, const char *name) :
+ unsigned matrix_columns, const char *name) :
base_type(base_type),
sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
sampler_type(0),
- vector_elements(vector_elements), matrix_rows(matrix_rows),
+ vector_elements(vector_elements), matrix_columns(matrix_columns),
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));
}
base_type(GLSL_TYPE_SAMPLER),
sampler_dimensionality(dim), sampler_shadow(shadow),
sampler_array(array), sampler_type(type),
- vector_elements(0), matrix_rows(0),
+ vector_elements(0), matrix_columns(0),
name(name),
length(0)
{
base_type(GLSL_TYPE_STRUCT),
sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
sampler_type(0),
- vector_elements(0), matrix_rows(0),
+ vector_elements(0), matrix_columns(0),
name(name),
length(num_fields)
{
*/
const glsl_type *get_base_type() const;
+ /**
+ * Get the instance of a built-in scalar, vector, or matrix 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);
}
*/
bool is_vector() const
{
- return (vector_elements > 0)
- && (matrix_rows == 0)
+ return (vector_elements > 1)
+ && (matrix_columns == 1)
&& (base_type >= GLSL_TYPE_UINT)
&& (base_type <= GLSL_TYPE_BOOL);
}
bool is_matrix() const
{
/* GLSL only has float matrices. */
- return (matrix_rows > 0) && (base_type == GLSL_TYPE_FLOAT);
+ return (matrix_columns > 1) && (base_type == GLSL_TYPE_FLOAT);
}
/**
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
*/
{
return base_type == GLSL_TYPE_ERROR;
}
+
+ /**
+ * Query the full type of a matrix row
+ *
+ * \return
+ * If the type is not a matrix, \c glsl_type::error_type is returned.
+ * Otherwise a type matching the rows of the matrix is returned.
+ */
+ const glsl_type *row_type() const
+ {
+ return is_matrix()
+ ? get_instance(base_type, matrix_columns, 1)
+ : error_type;
+ }
+
+ /**
+ * Query the full type of a matrix column
+ *
+ * \return
+ * If the type is not a matrix, \c glsl_type::error_type is returned.
+ * Otherwise a type matching the columns of the matrix is returned.
+ */
+ const glsl_type *column_type() const
+ {
+ return is_matrix()
+ ? get_instance(base_type, vector_elements, 1)
+ : error_type;
+ }
+
+private:
+ /**
+ * \name Pointers to various private type singletons
+ */
+ /*@{*/
+ static const glsl_type *const mat2_type;
+ static const glsl_type *const mat2x3_type;
+ static const glsl_type *const mat2x4_type;
+ static const glsl_type *const mat3x2_type;
+ static const glsl_type *const mat3_type;
+ static const glsl_type *const mat3x4_type;
+ static const glsl_type *const mat4x2_type;
+ static const glsl_type *const mat4x3_type;
+ static const glsl_type *const mat4_type;
+ /*@}*/
};
struct glsl_struct_field {
extern void
_mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state);
-extern const struct glsl_type *
-_mesa_glsl_get_vector_type(unsigned base_type, unsigned vector_length);
-
-extern const struct glsl_type *const glsl_error_type;
-extern const struct glsl_type *const glsl_int_type;
-extern const struct glsl_type *const glsl_uint_type;
-extern const struct glsl_type *const glsl_float_type;
-extern const struct glsl_type *const glsl_bool_type;
+extern void
+_mesa_glsl_initialize_constructors(struct exec_list *instructions,
+ struct _mesa_glsl_parse_state *state);
#ifdef __cplusplus
}