#include <string.h>
#include <assert.h>
+#include <stdio.h>
#include "shader_enums.h"
#include "c11/threads.h"
extern void
_mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state);
+void
+glsl_print_type(FILE *f, const struct glsl_type *t);
+
void encode_type_to_blob(struct blob *blob, const struct glsl_type *type);
const struct glsl_type *decode_type_from_blob(struct blob_reader *blob);
*/
unsigned explicit_stride;
+ /**
+ * Explicit alignment. This is used to communicate explicit alignment
+ * constraints. Should be 0 if the type has no explicit alignment
+ * constraint.
+ */
+ unsigned explicit_alignment;
+
/**
* Subtype of composite data types.
*/
*/
const glsl_type *get_float16_type() const;
+ /**
+ * Gets the int16 version of this type.
+ */
+ const glsl_type *get_int16_type() const;
+
+ /**
+ * Gets the uint16 version of this type.
+ */
+ const glsl_type *get_uint16_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,
unsigned explicit_stride = 0,
- bool row_major = false);
+ bool row_major = false,
+ unsigned explicit_alignment = 0);
/**
* Get the instance of a sampler type
static const glsl_type *get_struct_instance(const glsl_struct_field *fields,
unsigned num_fields,
const char *name,
- bool packed = false);
+ bool packed = false,
+ unsigned explicit_alignment = 0);
/**
* Get the instance of an interface block type
return glsl_base_type_is_integer(base_type);
}
+ /**
+ * Query whether or not a type is a 16-bit integer.
+ */
+ bool is_integer_16() const
+ {
+ return base_type == GLSL_TYPE_UINT16 || base_type == GLSL_TYPE_INT16;
+ }
+
/**
* Query whether or not a type is an 32-bit integer.
*/
return is_integer_32() || is_integer_64();
}
+ /**
+ * Query whether or not a type is a 16-bit or 32-bit integer
+ */
+ bool is_integer_16_32() const
+ {
+ return is_integer_16() || is_integer_32() || is_integer_64();
+ }
+
+ /**
+ * Query whether or not a type is a 16-bit, 32-bit or 64-bit integer
+ */
+ bool is_integer_16_32_64() const
+ {
+ return is_integer_16() || is_integer_32() || is_integer_64();
+ }
+
/**
* Query whether or not type is an integral type, or for struct and array
* types, contains an integral type.
return base_type == GLSL_TYPE_FLOAT16 || is_float() || is_double();
}
+ /**
+ * Query whether or not a type is a float or double
+ */
+ bool is_float_32_64() const
+ {
+ return is_float() || is_double();
+ }
+
+ bool is_int_16_32_64() const
+ {
+ return base_type == GLSL_TYPE_INT16 ||
+ base_type == GLSL_TYPE_INT ||
+ base_type == GLSL_TYPE_INT64;
+ }
+
+ bool is_uint_16_32_64() const
+ {
+ return base_type == GLSL_TYPE_UINT16 ||
+ base_type == GLSL_TYPE_UINT ||
+ base_type == GLSL_TYPE_UINT64;
+ }
+
+ bool is_int_16_32() const
+ {
+ return base_type == GLSL_TYPE_INT ||
+ base_type == GLSL_TYPE_INT16;
+ }
+
+ bool is_uint_16_32() const
+ {
+ return base_type == GLSL_TYPE_UINT ||
+ base_type == GLSL_TYPE_UINT16;
+ }
+
/**
* Query whether or not a type is a double type
*/
if (!is_matrix())
return error_type;
- if (explicit_stride && interface_row_major)
- return get_instance(base_type, vector_elements, 1, explicit_stride);
- else
- return get_instance(base_type, vector_elements, 1);
+ if (interface_row_major) {
+ /* If we're row-major, the vector element stride is the same as the
+ * matrix stride and we have no alignment (i.e. component-aligned).
+ */
+ return get_instance(base_type, vector_elements, 1,
+ explicit_stride, false, 0);
+ } else {
+ /* Otherwise, the vector is tightly packed (stride=0). For
+ * alignment, we treat a matrix as an array of columns make the same
+ * assumption that the alignment of the column is the same as the
+ * alignment of the whole matrix.
+ */
+ return get_instance(base_type, vector_elements, 1,
+ 0, false, explicit_alignment);
+ }
}
/**
glsl_type(GLenum gl_type,
glsl_base_type base_type, unsigned vector_elements,
unsigned matrix_columns, const char *name,
- unsigned explicit_stride = 0, bool row_major = false);
+ unsigned explicit_stride = 0, bool row_major = false,
+ unsigned explicit_alignment = 0);
/** Constructor for sampler or image types */
glsl_type(GLenum gl_type, glsl_base_type base_type,
/** Constructor for record types */
glsl_type(const glsl_struct_field *fields, unsigned num_fields,
- const char *name, bool packed = false);
+ const char *name, bool packed = false,
+ unsigned explicit_alignment = 0);
/** Constructor for interface types */
glsl_type(const glsl_struct_field *fields, unsigned num_fields,