X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fglsl_types.h;h=df5ca4629e5b1c266f97430c9f19036bc90e330e;hb=39006590517de05709d32378d6024de8041035d0;hp=c29d589a148ffa80674709c5b786d34aed6ac2c3;hpb=74ee3f76deec064577b2ce33b6a7ec9828868d57;p=mesa.git diff --git a/src/compiler/glsl_types.h b/src/compiler/glsl_types.h index c29d589a148..df5ca4629e5 100644 --- a/src/compiler/glsl_types.h +++ b/src/compiler/glsl_types.h @@ -31,6 +31,7 @@ #include "shader_enums.h" #include "c11/threads.h" #include "util/blob.h" +#include "util/format/u_format.h" #include "util/macros.h" #ifdef __cplusplus @@ -59,10 +60,6 @@ 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); -#ifdef __cplusplus -} -#endif - typedef void (*glsl_type_size_align_func)(const struct glsl_type *type, unsigned *size, unsigned *align); @@ -196,6 +193,27 @@ glsl_base_type_get_bit_size(const enum glsl_base_type base_type) return 0; } +static inline enum glsl_base_type +glsl_unsigned_base_type_of(enum glsl_base_type type) +{ + switch (type) { + case GLSL_TYPE_INT: + return GLSL_TYPE_UINT; + case GLSL_TYPE_INT8: + return GLSL_TYPE_UINT8; + case GLSL_TYPE_INT16: + return GLSL_TYPE_UINT16; + case GLSL_TYPE_INT64: + return GLSL_TYPE_UINT64; + default: + assert(type == GLSL_TYPE_UINT || + type == GLSL_TYPE_UINT8 || + type == GLSL_TYPE_UINT16 || + type == GLSL_TYPE_UINT64); + return type; + } +} + enum glsl_sampler_dim { GLSL_SAMPLER_DIM_1D = 0, GLSL_SAMPLER_DIM_2D, @@ -209,6 +227,9 @@ enum glsl_sampler_dim { GLSL_SAMPLER_DIM_SUBPASS_MS, /* for multisampled vulkan input attachments */ }; +int +glsl_get_sampler_dim_coordinate_components(enum glsl_sampler_dim dim); + enum glsl_matrix_layout { /** * The layout of the matrix is inherited from the object containing the @@ -238,6 +259,8 @@ enum { }; #ifdef __cplusplus +} /* extern "C" */ + #include "GL/gl.h" #include "util/ralloc.h" #include "main/menums.h" /* for gl_texture_index, C++'s enum rules are broken */ @@ -372,6 +395,21 @@ public: */ const glsl_type *get_bare_type() const; + /** + * Gets the float16 version of this type. + */ + 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 */ @@ -481,6 +519,14 @@ public: */ unsigned count_vec4_slots(bool is_gl_vertex_input, bool bindless) const; + /** + * Calculate the number of vec4 slots required to hold this type. + * + * This is the underlying recursive type_size function for + * gallium's PIPE_CAP_PACKED_UNIFORMS case. + */ + unsigned count_dword_slots(bool bindless) const; + /** * Calculate the number of attribute slots required to hold this type * @@ -675,6 +721,14 @@ public: 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. */ @@ -699,6 +753,22 @@ public: 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. @@ -725,6 +795,56 @@ public: return base_type == GLSL_TYPE_FLOAT; } + /** + * Query whether or not a type is a half-float or float type + */ + bool is_float_16_32() const + { + return base_type == GLSL_TYPE_FLOAT16 || is_float(); + } + + /** + * Query whether or not a type is a half-float, float or double + */ + bool is_float_16_32_64() const + { + 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 */ @@ -1220,92 +1340,94 @@ struct glsl_struct_field { * -1 otherwise. */ int xfb_stride; - - /** - * For interface blocks, the interpolation mode (as in - * ir_variable::interpolation). 0 otherwise. - */ - unsigned interpolation:2; - - /** - * For interface blocks, 1 if this variable uses centroid interpolation (as - * in ir_variable::centroid). 0 otherwise. - */ - unsigned centroid:1; - - /** - * For interface blocks, 1 if this variable uses sample interpolation (as - * in ir_variable::sample). 0 otherwise. - */ - unsigned sample:1; - - /** - * Layout of the matrix. Uses glsl_matrix_layout values. - */ - unsigned matrix_layout:2; - - /** - * For interface blocks, 1 if this variable is a per-patch input or output - * (as in ir_variable::patch). 0 otherwise. - */ - unsigned patch:1; - - /** - * Precision qualifier - */ - unsigned precision:2; - - /** - * Memory qualifiers, applicable to buffer variables defined in shader - * storage buffer objects (SSBOs) - */ - unsigned memory_read_only:1; - unsigned memory_write_only:1; - unsigned memory_coherent:1; - unsigned memory_volatile:1; - unsigned memory_restrict:1; - /** * Layout format, applicable to image variables only. */ - unsigned image_format:16; - - /** - * Any of the xfb_* qualifiers trigger the shader to be in transform - * feedback mode so we need to keep track of whether the buffer was - * explicitly set or if its just been assigned the default global value. - */ - unsigned explicit_xfb_buffer:1; + enum pipe_format image_format; - unsigned implicit_sized_array:1; + union { + struct { + /** + * For interface blocks, the interpolation mode (as in + * ir_variable::interpolation). 0 otherwise. + */ + unsigned interpolation:3; + + /** + * For interface blocks, 1 if this variable uses centroid interpolation (as + * in ir_variable::centroid). 0 otherwise. + */ + unsigned centroid:1; + + /** + * For interface blocks, 1 if this variable uses sample interpolation (as + * in ir_variable::sample). 0 otherwise. + */ + unsigned sample:1; + + /** + * Layout of the matrix. Uses glsl_matrix_layout values. + */ + unsigned matrix_layout:2; + + /** + * For interface blocks, 1 if this variable is a per-patch input or output + * (as in ir_variable::patch). 0 otherwise. + */ + unsigned patch:1; + + /** + * Precision qualifier + */ + unsigned precision:2; + + /** + * Memory qualifiers, applicable to buffer variables defined in shader + * storage buffer objects (SSBOs) + */ + unsigned memory_read_only:1; + unsigned memory_write_only:1; + unsigned memory_coherent:1; + unsigned memory_volatile:1; + unsigned memory_restrict:1; + + /** + * Any of the xfb_* qualifiers trigger the shader to be in transform + * feedback mode so we need to keep track of whether the buffer was + * explicitly set or if its just been assigned the default global value. + */ + unsigned explicit_xfb_buffer:1; + + unsigned implicit_sized_array:1; + }; + unsigned flags; + }; #ifdef __cplusplus -#define DEFAULT_CONSTRUCTORS(_type, _precision, _name) \ +#define DEFAULT_CONSTRUCTORS(_type, _name) \ type(_type), name(_name), location(-1), offset(-1), xfb_buffer(0), \ - xfb_stride(0), interpolation(0), centroid(0), \ - sample(0), matrix_layout(GLSL_MATRIX_LAYOUT_INHERITED), patch(0), \ - precision(_precision), memory_read_only(0), \ - memory_write_only(0), memory_coherent(0), memory_volatile(0), \ - memory_restrict(0), image_format(0), explicit_xfb_buffer(0), \ - implicit_sized_array(0) + xfb_stride(0), image_format(PIPE_FORMAT_NONE), flags(0) \ glsl_struct_field(const struct glsl_type *_type, int _precision, const char *_name) - : DEFAULT_CONSTRUCTORS(_type, _precision, _name) + : DEFAULT_CONSTRUCTORS(_type, _name) { - /* empty */ + matrix_layout = GLSL_MATRIX_LAYOUT_INHERITED; + precision = _precision; } glsl_struct_field(const struct glsl_type *_type, const char *_name) - : DEFAULT_CONSTRUCTORS(_type, GLSL_PRECISION_NONE, _name) + : DEFAULT_CONSTRUCTORS(_type, _name) { - /* empty */ + matrix_layout = GLSL_MATRIX_LAYOUT_INHERITED; + precision = GLSL_PRECISION_NONE; } glsl_struct_field() - : DEFAULT_CONSTRUCTORS(NULL, GLSL_PRECISION_NONE, NULL) + : DEFAULT_CONSTRUCTORS(NULL, NULL) { - /* empty */ + matrix_layout = GLSL_MATRIX_LAYOUT_INHERITED; + precision = GLSL_PRECISION_NONE; } #undef DEFAULT_CONSTRUCTORS #endif