X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fglsl_types.h;h=7709556fe0cdc989b505ae6770f02ca8a8849f55;hb=abc8a702d0f01852f85705a87c9d624300c1efec;hp=dd46479755ad804ae1b48eeb5d7acc9657aefbcc;hpb=8b6f8fe5030a0bcc6cce6bf3aae48795802b6fb6;p=mesa.git diff --git a/src/compiler/glsl_types.h b/src/compiler/glsl_types.h index dd46479755a..7709556fe0c 100644 --- a/src/compiler/glsl_types.h +++ b/src/compiler/glsl_types.h @@ -22,7 +22,6 @@ * DEALINGS IN THE SOFTWARE. */ -#pragma once #ifndef GLSL_TYPES_H #define GLSL_TYPES_H @@ -47,10 +46,15 @@ _mesa_glsl_release_types(void); #endif enum glsl_base_type { + /* Note: GLSL_TYPE_UINT, GLSL_TYPE_INT, and GLSL_TYPE_FLOAT must be 0, 1, + * and 2 so that they will fit in the 2 bits of glsl_type::sampled_type. + */ GLSL_TYPE_UINT = 0, GLSL_TYPE_INT, GLSL_TYPE_FLOAT, GLSL_TYPE_DOUBLE, + GLSL_TYPE_UINT64, + GLSL_TYPE_INT64, GLSL_TYPE_BOOL, GLSL_TYPE_SAMPLER, GLSL_TYPE_IMAGE, @@ -64,6 +68,13 @@ enum glsl_base_type { GLSL_TYPE_ERROR }; +static inline bool glsl_base_type_is_64bit(enum glsl_base_type type) +{ + return type == GLSL_TYPE_DOUBLE || + type == GLSL_TYPE_UINT64 || + type == GLSL_TYPE_INT64; +} + enum glsl_sampler_dim { GLSL_SAMPLER_DIM_1D = 0, GLSL_SAMPLER_DIM_2D, @@ -72,7 +83,9 @@ enum glsl_sampler_dim { GLSL_SAMPLER_DIM_RECT, GLSL_SAMPLER_DIM_BUF, GLSL_SAMPLER_DIM_EXTERNAL, - GLSL_SAMPLER_DIM_MS + GLSL_SAMPLER_DIM_MS, + GLSL_SAMPLER_DIM_SUBPASS, /* for vulkan input attachments */ + GLSL_SAMPLER_DIM_SUBPASS_MS, /* for multisampled vulkan input attachments */ }; enum glsl_interface_packing { @@ -119,7 +132,7 @@ struct glsl_type { GLenum gl_type; glsl_base_type base_type; - unsigned sampler_dimensionality:3; /**< \see glsl_sampler_dim */ + unsigned sampler_dimensionality:4; /**< \see glsl_sampler_dim */ unsigned sampler_shadow:1; unsigned sampler_array:1; unsigned sampled_type:2; /**< Type of data returned using this @@ -128,6 +141,7 @@ struct glsl_type { * and \c GLSL_TYPE_UINT are valid. */ unsigned interface_packing:2; + unsigned interface_row_major:1; /* Callers of this ralloc-based new need not call delete. It's * easier to just ralloc_free 'mem_ctx' (or any of its ancestors). */ @@ -214,6 +228,8 @@ struct glsl_type { static const glsl_type *ivec(unsigned components); static const glsl_type *uvec(unsigned components); static const glsl_type *bvec(unsigned components); + static const glsl_type *i64vec(unsigned components); + static const glsl_type *u64vec(unsigned components); /**@}*/ /** @@ -273,6 +289,7 @@ struct glsl_type { static const glsl_type *get_interface_instance(const glsl_struct_field *fields, unsigned num_fields, enum glsl_interface_packing packing, + bool row_major, const char *block_name); /** @@ -344,7 +361,7 @@ struct glsl_type { * For vertex shader attributes - doubles only take one slot. * For inter-shader varyings - dvec3/dvec4 take two slots. */ - unsigned count_attribute_slots(bool vertex_input_slots) const; + unsigned count_attribute_slots(bool is_vertex_input) const; /** * Alignment in bytes of the start of this type in a std140 uniform @@ -450,7 +467,7 @@ struct glsl_type { */ bool is_numeric() const { - return (base_type >= GLSL_TYPE_UINT) && (base_type <= GLSL_TYPE_DOUBLE); + return (base_type >= GLSL_TYPE_UINT) && (base_type <= GLSL_TYPE_INT64); } /** @@ -461,6 +478,15 @@ struct glsl_type { return (base_type == GLSL_TYPE_UINT) || (base_type == GLSL_TYPE_INT); } + /** + * Query whether or not a type is a 32-bit or 64-bit integer + */ + bool is_integer_32_64() const + { + return (base_type == GLSL_TYPE_UINT) || (base_type == GLSL_TYPE_INT) || + (base_type == GLSL_TYPE_UINT64) || (base_type == GLSL_TYPE_INT64); + } + /** * Query whether or not type is an integral type, or for struct and array * types, contains an integral type. @@ -468,8 +494,8 @@ struct glsl_type { bool contains_integer() const; /** - * Query whether or not type is a double type, or for struct and array - * types, contains a double type. + * Query whether or not type is a double type, or for struct, interface and + * array types, contains a double type. */ bool contains_double() const; @@ -490,11 +516,19 @@ struct glsl_type { } /** - * Query whether a double takes two slots. + * Query whether a 64-bit type takes two slots. + */ + bool is_dual_slot() const + { + return is_64bit() && vector_elements > 2; + } + + /** + * Query whether or not a type is 64-bit */ - bool is_dual_slot_double() const + bool is_64bit() const { - return base_type == GLSL_TYPE_DOUBLE && vector_elements > 2; + return glsl_base_type_is_64bit(base_type); } /** @@ -514,8 +548,8 @@ struct glsl_type { } /** - * Query whether or not type is a sampler, or for struct and array - * types, contains a sampler. + * Query whether or not type is a sampler, or for struct, interface and + * array types, contains a sampler. */ bool contains_sampler() const; @@ -525,8 +559,8 @@ struct glsl_type { gl_texture_index sampler_index() const; /** - * Query whether or not type is an image, or for struct and array - * types, contains an image. + * Query whether or not type is an image, or for struct, interface and + * array types, contains an image. */ bool contains_image() const; @@ -732,7 +766,7 @@ struct glsl_type { * * Note that this is often different than actual coordinate type used in * a texturing built-in function, since those pack additional values (such - * as the shadow comparitor or projector) into the coordinate type. + * as the shadow comparator or projector) into the coordinate type. */ int coordinate_components() const; @@ -740,8 +774,26 @@ struct glsl_type { * Compare a record type against another record type. * * This is useful for matching record types declared across shader stages. + * The option to not match locations is to deal with places where the + * same struct is defined in a block which has a location set on it. + */ + bool record_compare(const glsl_type *b, bool match_locations = true) const; + + /** + * Get the type interface packing. + */ + enum glsl_interface_packing get_interface_packing() const + { + return (enum glsl_interface_packing)interface_packing; + } + + /** + * Check if the type interface is row major */ - bool record_compare(const glsl_type *b) const; + bool get_interface_row_major() const + { + return (bool) interface_row_major; + } private: @@ -772,7 +824,8 @@ private: /** Constructor for interface types */ glsl_type(const glsl_struct_field *fields, unsigned num_fields, - enum glsl_interface_packing packing, const char *name); + enum glsl_interface_packing packing, + bool row_major, const char *name); /** Constructor for interface types */ glsl_type(const glsl_type *return_type, @@ -914,12 +967,15 @@ struct glsl_struct_field { */ unsigned explicit_xfb_buffer:1; + unsigned implicit_sized_array:1; #ifdef __cplusplus glsl_struct_field(const struct glsl_type *_type, const char *_name) - : type(_type), name(_name), location(-1), interpolation(0), centroid(0), + : type(_type), name(_name), location(-1), offset(0), xfb_buffer(0), + xfb_stride(0), interpolation(0), centroid(0), sample(0), matrix_layout(GLSL_MATRIX_LAYOUT_INHERITED), patch(0), precision(GLSL_PRECISION_NONE), image_read_only(0), image_write_only(0), - image_coherent(0), image_volatile(0), image_restrict(0) + image_coherent(0), image_volatile(0), image_restrict(0), + explicit_xfb_buffer(0), implicit_sized_array(0) { /* empty */ }