Home | History | Annotate | Line # | Download | only in compiler
      1 /*
      2  * Copyright  2009 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     21  * DEALINGS IN THE SOFTWARE.
     22  */
     23 
     24 #include <stdio.h>
     25 #include "main/macros.h"
     26 #include "compiler/glsl/glsl_parser_extras.h"
     27 #include "glsl_types.h"
     28 #include "util/hash_table.h"
     29 #include "util/u_cpu_detect.h"
     30 #include "util/u_string.h"
     31 
     32 
     33 mtx_t glsl_type::hash_mutex = _MTX_INITIALIZER_NP;
     34 hash_table *glsl_type::explicit_matrix_types = NULL;
     35 hash_table *glsl_type::array_types = NULL;
     36 hash_table *glsl_type::struct_types = NULL;
     37 hash_table *glsl_type::interface_types = NULL;
     38 hash_table *glsl_type::function_types = NULL;
     39 hash_table *glsl_type::subroutine_types = NULL;
     40 
     41 /* There might be multiple users for types (e.g. application using OpenGL
     42  * and Vulkan simultaneously or app using multiple Vulkan instances). Counter
     43  * is used to make sure we don't release the types if a user is still present.
     44  */
     45 static uint32_t glsl_type_users = 0;
     46 
     47 glsl_type::glsl_type(GLenum gl_type,
     48                      glsl_base_type base_type, unsigned vector_elements,
     49                      unsigned matrix_columns, const char *name,
     50                      unsigned explicit_stride, bool row_major,
     51                      unsigned explicit_alignment) :
     52    gl_type(gl_type),
     53    base_type(base_type), sampled_type(GLSL_TYPE_VOID),
     54    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
     55    interface_packing(0), interface_row_major(row_major), packed(0),
     56    vector_elements(vector_elements), matrix_columns(matrix_columns),
     57    length(0), explicit_stride(explicit_stride),
     58    explicit_alignment(explicit_alignment)
     59 {
     60    /* Values of these types must fit in the two bits of
     61     * glsl_type::sampled_type.
     62     */
     63    STATIC_ASSERT((unsigned(GLSL_TYPE_UINT)  & 3) == unsigned(GLSL_TYPE_UINT));
     64    STATIC_ASSERT((unsigned(GLSL_TYPE_INT)   & 3) == unsigned(GLSL_TYPE_INT));
     65    STATIC_ASSERT((unsigned(GLSL_TYPE_FLOAT) & 3) == unsigned(GLSL_TYPE_FLOAT));
     66 
     67    ASSERT_BITFIELD_SIZE(glsl_type, base_type, GLSL_TYPE_ERROR);
     68    ASSERT_BITFIELD_SIZE(glsl_type, sampled_type, GLSL_TYPE_ERROR);
     69    ASSERT_BITFIELD_SIZE(glsl_type, sampler_dimensionality,
     70                         GLSL_SAMPLER_DIM_SUBPASS_MS);
     71 
     72    this->mem_ctx = ralloc_context(NULL);
     73    assert(this->mem_ctx != NULL);
     74 
     75    assert(name != NULL);
     76    this->name = ralloc_strdup(this->mem_ctx, name);
     77 
     78    /* Neither dimension is zero or both dimensions are zero.
     79     */
     80    assert((vector_elements == 0) == (matrix_columns == 0));
     81    assert(util_is_power_of_two_or_zero(explicit_alignment));
     82    memset(& fields, 0, sizeof(fields));
     83 }
     84 
     85 glsl_type::glsl_type(GLenum gl_type, glsl_base_type base_type,
     86                      enum glsl_sampler_dim dim, bool shadow, bool array,
     87                      glsl_base_type type, const char *name) :
     88    gl_type(gl_type),
     89    base_type(base_type), sampled_type(type),
     90    sampler_dimensionality(dim), sampler_shadow(shadow),
     91    sampler_array(array), interface_packing(0),
     92    interface_row_major(0), packed(0),
     93    length(0), explicit_stride(0), explicit_alignment(0)
     94 {
     95    this->mem_ctx = ralloc_context(NULL);
     96    assert(this->mem_ctx != NULL);
     97 
     98    assert(name != NULL);
     99    this->name = ralloc_strdup(this->mem_ctx, name);
    100 
    101    memset(& fields, 0, sizeof(fields));
    102 
    103    matrix_columns = vector_elements = 1;
    104 }
    105 
    106 glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
    107                      const char *name, bool packed,
    108                      unsigned explicit_alignment) :
    109    gl_type(0),
    110    base_type(GLSL_TYPE_STRUCT), sampled_type(GLSL_TYPE_VOID),
    111    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
    112    interface_packing(0), interface_row_major(0), packed(packed),
    113    vector_elements(0), matrix_columns(0),
    114    length(num_fields), explicit_stride(0),
    115    explicit_alignment(explicit_alignment)
    116 {
    117    unsigned int i;
    118 
    119    assert(util_is_power_of_two_or_zero(explicit_alignment));
    120 
    121    this->mem_ctx = ralloc_context(NULL);
    122    assert(this->mem_ctx != NULL);
    123 
    124    assert(name != NULL);
    125    this->name = ralloc_strdup(this->mem_ctx, name);
    126    /* Zero-fill to prevent spurious Valgrind errors when serializing NIR
    127     * due to uninitialized unused bits in bit fields. */
    128    this->fields.structure = rzalloc_array(this->mem_ctx,
    129                                           glsl_struct_field, length);
    130 
    131    for (i = 0; i < length; i++) {
    132       this->fields.structure[i] = fields[i];
    133       this->fields.structure[i].name = ralloc_strdup(this->fields.structure,
    134                                                      fields[i].name);
    135    }
    136 }
    137 
    138 glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
    139                      enum glsl_interface_packing packing,
    140                      bool row_major, const char *name) :
    141    gl_type(0),
    142    base_type(GLSL_TYPE_INTERFACE), sampled_type(GLSL_TYPE_VOID),
    143    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
    144    interface_packing((unsigned) packing),
    145    interface_row_major((unsigned) row_major), packed(0),
    146    vector_elements(0), matrix_columns(0),
    147    length(num_fields), explicit_stride(0), explicit_alignment(0)
    148 {
    149    unsigned int i;
    150 
    151    this->mem_ctx = ralloc_context(NULL);
    152    assert(this->mem_ctx != NULL);
    153 
    154    assert(name != NULL);
    155    this->name = ralloc_strdup(this->mem_ctx, name);
    156    this->fields.structure = rzalloc_array(this->mem_ctx,
    157                                           glsl_struct_field, length);
    158    for (i = 0; i < length; i++) {
    159       this->fields.structure[i] = fields[i];
    160       this->fields.structure[i].name = ralloc_strdup(this->fields.structure,
    161                                                      fields[i].name);
    162    }
    163 }
    164 
    165 glsl_type::glsl_type(const glsl_type *return_type,
    166                      const glsl_function_param *params, unsigned num_params) :
    167    gl_type(0),
    168    base_type(GLSL_TYPE_FUNCTION), sampled_type(GLSL_TYPE_VOID),
    169    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
    170    interface_packing(0), interface_row_major(0), packed(0),
    171    vector_elements(0), matrix_columns(0),
    172    length(num_params), explicit_stride(0), explicit_alignment(0)
    173 {
    174    unsigned int i;
    175 
    176    this->mem_ctx = ralloc_context(NULL);
    177    assert(this->mem_ctx != NULL);
    178 
    179    this->name = ralloc_strdup(this->mem_ctx, "");
    180 
    181    this->fields.parameters = rzalloc_array(this->mem_ctx,
    182                                            glsl_function_param, num_params + 1);
    183 
    184    /* We store the return type as the first parameter */
    185    this->fields.parameters[0].type = return_type;
    186    this->fields.parameters[0].in = false;
    187    this->fields.parameters[0].out = true;
    188 
    189    /* We store the i'th parameter in slot i+1 */
    190    for (i = 0; i < length; i++) {
    191       this->fields.parameters[i + 1].type = params[i].type;
    192       this->fields.parameters[i + 1].in = params[i].in;
    193       this->fields.parameters[i + 1].out = params[i].out;
    194    }
    195 }
    196 
    197 glsl_type::glsl_type(const char *subroutine_name) :
    198    gl_type(0),
    199    base_type(GLSL_TYPE_SUBROUTINE), sampled_type(GLSL_TYPE_VOID),
    200    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
    201    interface_packing(0), interface_row_major(0), packed(0),
    202    vector_elements(1), matrix_columns(1),
    203    length(0), explicit_stride(0), explicit_alignment(0)
    204 {
    205    this->mem_ctx = ralloc_context(NULL);
    206    assert(this->mem_ctx != NULL);
    207 
    208    assert(subroutine_name != NULL);
    209    this->name = ralloc_strdup(this->mem_ctx, subroutine_name);
    210 }
    211 
    212 glsl_type::~glsl_type()
    213 {
    214     ralloc_free(this->mem_ctx);
    215 }
    216 
    217 bool
    218 glsl_type::contains_sampler() const
    219 {
    220    if (this->is_array()) {
    221       return this->fields.array->contains_sampler();
    222    } else if (this->is_struct() || this->is_interface()) {
    223       for (unsigned int i = 0; i < this->length; i++) {
    224          if (this->fields.structure[i].type->contains_sampler())
    225             return true;
    226       }
    227       return false;
    228    } else {
    229       return this->is_sampler();
    230    }
    231 }
    232 
    233 bool
    234 glsl_type::contains_array() const
    235 {
    236    if (this->is_struct() || this->is_interface()) {
    237       for (unsigned int i = 0; i < this->length; i++) {
    238          if (this->fields.structure[i].type->contains_array())
    239             return true;
    240       }
    241       return false;
    242    } else {
    243       return this->is_array();
    244    }
    245 }
    246 
    247 bool
    248 glsl_type::contains_integer() const
    249 {
    250    if (this->is_array()) {
    251       return this->fields.array->contains_integer();
    252    } else if (this->is_struct() || this->is_interface()) {
    253       for (unsigned int i = 0; i < this->length; i++) {
    254          if (this->fields.structure[i].type->contains_integer())
    255             return true;
    256       }
    257       return false;
    258    } else {
    259       return this->is_integer();
    260    }
    261 }
    262 
    263 bool
    264 glsl_type::contains_double() const
    265 {
    266    if (this->is_array()) {
    267       return this->fields.array->contains_double();
    268    } else if (this->is_struct() || this->is_interface()) {
    269       for (unsigned int i = 0; i < this->length; i++) {
    270          if (this->fields.structure[i].type->contains_double())
    271             return true;
    272       }
    273       return false;
    274    } else {
    275       return this->is_double();
    276    }
    277 }
    278 
    279 bool
    280 glsl_type::contains_64bit() const
    281 {
    282    if (this->is_array()) {
    283       return this->fields.array->contains_64bit();
    284    } else if (this->is_struct() || this->is_interface()) {
    285       for (unsigned int i = 0; i < this->length; i++) {
    286          if (this->fields.structure[i].type->contains_64bit())
    287             return true;
    288       }
    289       return false;
    290    } else {
    291       return this->is_64bit();
    292    }
    293 }
    294 
    295 bool
    296 glsl_type::contains_opaque() const {
    297    switch (base_type) {
    298    case GLSL_TYPE_SAMPLER:
    299    case GLSL_TYPE_IMAGE:
    300    case GLSL_TYPE_ATOMIC_UINT:
    301       return true;
    302    case GLSL_TYPE_ARRAY:
    303       return fields.array->contains_opaque();
    304    case GLSL_TYPE_STRUCT:
    305    case GLSL_TYPE_INTERFACE:
    306       for (unsigned int i = 0; i < length; i++) {
    307          if (fields.structure[i].type->contains_opaque())
    308             return true;
    309       }
    310       return false;
    311    default:
    312       return false;
    313    }
    314 }
    315 
    316 bool
    317 glsl_type::contains_subroutine() const
    318 {
    319    if (this->is_array()) {
    320       return this->fields.array->contains_subroutine();
    321    } else if (this->is_struct() || this->is_interface()) {
    322       for (unsigned int i = 0; i < this->length; i++) {
    323          if (this->fields.structure[i].type->contains_subroutine())
    324             return true;
    325       }
    326       return false;
    327    } else {
    328       return this->is_subroutine();
    329    }
    330 }
    331 
    332 gl_texture_index
    333 glsl_type::sampler_index() const
    334 {
    335    const glsl_type *const t = (this->is_array()) ? this->fields.array : this;
    336 
    337    assert(t->is_sampler() || t->is_image());
    338 
    339    switch (t->sampler_dimensionality) {
    340    case GLSL_SAMPLER_DIM_1D:
    341       return (t->sampler_array) ? TEXTURE_1D_ARRAY_INDEX : TEXTURE_1D_INDEX;
    342    case GLSL_SAMPLER_DIM_2D:
    343       return (t->sampler_array) ? TEXTURE_2D_ARRAY_INDEX : TEXTURE_2D_INDEX;
    344    case GLSL_SAMPLER_DIM_3D:
    345       return TEXTURE_3D_INDEX;
    346    case GLSL_SAMPLER_DIM_CUBE:
    347       return (t->sampler_array) ? TEXTURE_CUBE_ARRAY_INDEX : TEXTURE_CUBE_INDEX;
    348    case GLSL_SAMPLER_DIM_RECT:
    349       return TEXTURE_RECT_INDEX;
    350    case GLSL_SAMPLER_DIM_BUF:
    351       return TEXTURE_BUFFER_INDEX;
    352    case GLSL_SAMPLER_DIM_EXTERNAL:
    353       return TEXTURE_EXTERNAL_INDEX;
    354    case GLSL_SAMPLER_DIM_MS:
    355       return (t->sampler_array) ? TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX : TEXTURE_2D_MULTISAMPLE_INDEX;
    356    default:
    357       assert(!"Should not get here.");
    358       return TEXTURE_BUFFER_INDEX;
    359    }
    360 }
    361 
    362 bool
    363 glsl_type::contains_image() const
    364 {
    365    if (this->is_array()) {
    366       return this->fields.array->contains_image();
    367    } else if (this->is_struct() || this->is_interface()) {
    368       for (unsigned int i = 0; i < this->length; i++) {
    369          if (this->fields.structure[i].type->contains_image())
    370             return true;
    371       }
    372       return false;
    373    } else {
    374       return this->is_image();
    375    }
    376 }
    377 
    378 const glsl_type *glsl_type::get_base_type() const
    379 {
    380    switch (base_type) {
    381    case GLSL_TYPE_UINT:
    382       return uint_type;
    383    case GLSL_TYPE_UINT16:
    384       return uint16_t_type;
    385    case GLSL_TYPE_UINT8:
    386       return uint8_t_type;
    387    case GLSL_TYPE_INT:
    388       return int_type;
    389    case GLSL_TYPE_INT16:
    390       return int16_t_type;
    391    case GLSL_TYPE_INT8:
    392       return int8_t_type;
    393    case GLSL_TYPE_FLOAT:
    394       return float_type;
    395    case GLSL_TYPE_FLOAT16:
    396       return float16_t_type;
    397    case GLSL_TYPE_DOUBLE:
    398       return double_type;
    399    case GLSL_TYPE_BOOL:
    400       return bool_type;
    401    case GLSL_TYPE_UINT64:
    402       return uint64_t_type;
    403    case GLSL_TYPE_INT64:
    404       return int64_t_type;
    405    default:
    406       return error_type;
    407    }
    408 }
    409 
    410 
    411 const glsl_type *glsl_type::get_scalar_type() const
    412 {
    413    const glsl_type *type = this;
    414 
    415    /* Handle arrays */
    416    while (type->base_type == GLSL_TYPE_ARRAY)
    417       type = type->fields.array;
    418 
    419    const glsl_type *scalar_type = type->get_base_type();
    420    if (scalar_type == error_type)
    421       return type;
    422 
    423    return scalar_type;
    424 }
    425 
    426 
    427 const glsl_type *glsl_type::get_bare_type() const
    428 {
    429    switch (this->base_type) {
    430    case GLSL_TYPE_UINT8:
    431    case GLSL_TYPE_INT8:
    432    case GLSL_TYPE_UINT16:
    433    case GLSL_TYPE_INT16:
    434    case GLSL_TYPE_FLOAT16:
    435    case GLSL_TYPE_UINT:
    436    case GLSL_TYPE_INT:
    437    case GLSL_TYPE_FLOAT:
    438    case GLSL_TYPE_BOOL:
    439    case GLSL_TYPE_DOUBLE:
    440    case GLSL_TYPE_UINT64:
    441    case GLSL_TYPE_INT64:
    442       return get_instance(this->base_type, this->vector_elements,
    443                           this->matrix_columns);
    444 
    445    case GLSL_TYPE_STRUCT:
    446    case GLSL_TYPE_INTERFACE: {
    447       glsl_struct_field *bare_fields = new glsl_struct_field[this->length];
    448       for (unsigned i = 0; i < this->length; i++) {
    449          bare_fields[i].type = this->fields.structure[i].type->get_bare_type();
    450          bare_fields[i].name = this->fields.structure[i].name;
    451       }
    452       const glsl_type *bare_type =
    453          get_struct_instance(bare_fields, this->length, this->name);
    454       delete[] bare_fields;
    455       return bare_type;
    456    }
    457 
    458    case GLSL_TYPE_ARRAY:
    459       return get_array_instance(this->fields.array->get_bare_type(),
    460                                 this->length);
    461 
    462    case GLSL_TYPE_SAMPLER:
    463    case GLSL_TYPE_IMAGE:
    464    case GLSL_TYPE_ATOMIC_UINT:
    465    case GLSL_TYPE_VOID:
    466    case GLSL_TYPE_SUBROUTINE:
    467    case GLSL_TYPE_FUNCTION:
    468    case GLSL_TYPE_ERROR:
    469       return this;
    470    }
    471 
    472    unreachable("Invalid base type");
    473 }
    474 
    475 const glsl_type *glsl_type::get_float16_type() const
    476 {
    477    assert(this->base_type == GLSL_TYPE_FLOAT);
    478 
    479    return get_instance(GLSL_TYPE_FLOAT16,
    480                        this->vector_elements,
    481                        this->matrix_columns,
    482                        this->explicit_stride,
    483                        this->interface_row_major);
    484 }
    485 
    486 const glsl_type *glsl_type::get_int16_type() const
    487 {
    488    assert(this->base_type == GLSL_TYPE_INT);
    489 
    490    return get_instance(GLSL_TYPE_INT16,
    491                        this->vector_elements,
    492                        this->matrix_columns,
    493                        this->explicit_stride,
    494                        this->interface_row_major);
    495 }
    496 
    497 const glsl_type *glsl_type::get_uint16_type() const
    498 {
    499    assert(this->base_type == GLSL_TYPE_UINT);
    500 
    501    return get_instance(GLSL_TYPE_UINT16,
    502                        this->vector_elements,
    503                        this->matrix_columns,
    504                        this->explicit_stride,
    505                        this->interface_row_major);
    506 }
    507 
    508 static void
    509 hash_free_type_function(struct hash_entry *entry)
    510 {
    511    glsl_type *type = (glsl_type *) entry->data;
    512 
    513    if (type->is_array())
    514       free((void*)entry->key);
    515 
    516    delete type;
    517 }
    518 
    519 void
    520 glsl_type_singleton_init_or_ref()
    521 {
    522    /* This is required for _mesa_half_to_float() which is
    523     * required for constant-folding 16-bit float ops.
    524     */
    525    util_cpu_detect();
    526 
    527    mtx_lock(&glsl_type::hash_mutex);
    528    glsl_type_users++;
    529    mtx_unlock(&glsl_type::hash_mutex);
    530 }
    531 
    532 void
    533 glsl_type_singleton_decref()
    534 {
    535    mtx_lock(&glsl_type::hash_mutex);
    536    assert(glsl_type_users > 0);
    537 
    538    /* Do not release glsl_types if they are still used. */
    539    if (--glsl_type_users) {
    540       mtx_unlock(&glsl_type::hash_mutex);
    541       return;
    542    }
    543 
    544    if (glsl_type::explicit_matrix_types != NULL) {
    545       _mesa_hash_table_destroy(glsl_type::explicit_matrix_types,
    546                                hash_free_type_function);
    547       glsl_type::explicit_matrix_types = NULL;
    548    }
    549 
    550    if (glsl_type::array_types != NULL) {
    551       _mesa_hash_table_destroy(glsl_type::array_types, hash_free_type_function);
    552       glsl_type::array_types = NULL;
    553    }
    554 
    555    if (glsl_type::struct_types != NULL) {
    556       _mesa_hash_table_destroy(glsl_type::struct_types, hash_free_type_function);
    557       glsl_type::struct_types = NULL;
    558    }
    559 
    560    if (glsl_type::interface_types != NULL) {
    561       _mesa_hash_table_destroy(glsl_type::interface_types, hash_free_type_function);
    562       glsl_type::interface_types = NULL;
    563    }
    564 
    565    if (glsl_type::function_types != NULL) {
    566       _mesa_hash_table_destroy(glsl_type::function_types, hash_free_type_function);
    567       glsl_type::function_types = NULL;
    568    }
    569 
    570    if (glsl_type::subroutine_types != NULL) {
    571       _mesa_hash_table_destroy(glsl_type::subroutine_types, hash_free_type_function);
    572       glsl_type::subroutine_types = NULL;
    573    }
    574 
    575    mtx_unlock(&glsl_type::hash_mutex);
    576 }
    577 
    578 
    579 glsl_type::glsl_type(const glsl_type *array, unsigned length,
    580                      unsigned explicit_stride) :
    581    base_type(GLSL_TYPE_ARRAY), sampled_type(GLSL_TYPE_VOID),
    582    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
    583    interface_packing(0), interface_row_major(0), packed(0),
    584    vector_elements(0), matrix_columns(0),
    585    length(length), name(NULL), explicit_stride(explicit_stride),
    586    explicit_alignment(array->explicit_alignment)
    587 {
    588    this->fields.array = array;
    589    /* Inherit the gl type of the base. The GL type is used for
    590     * uniform/statevar handling in Mesa and the arrayness of the type
    591     * is represented by the size rather than the type.
    592     */
    593    this->gl_type = array->gl_type;
    594 
    595    /* Allow a maximum of 10 characters for the array size.  This is enough
    596     * for 32-bits of ~0.  The extra 3 are for the '[', ']', and terminating
    597     * NUL.
    598     */
    599    const unsigned name_length = strlen(array->name) + 10 + 3;
    600 
    601    this->mem_ctx = ralloc_context(NULL);
    602    assert(this->mem_ctx != NULL);
    603 
    604    char *const n = (char *) ralloc_size(this->mem_ctx, name_length);
    605 
    606    if (length == 0)
    607       snprintf(n, name_length, "%s[]", array->name);
    608    else {
    609       /* insert outermost dimensions in the correct spot
    610        * otherwise the dimension order will be backwards
    611        */
    612       const char *pos = strchr(array->name, '[');
    613       if (pos) {
    614          int idx = pos - array->name;
    615          snprintf(n, idx+1, "%s", array->name);
    616          snprintf(n + idx, name_length - idx, "[%u]%s",
    617                        length, array->name + idx);
    618       } else {
    619          snprintf(n, name_length, "%s[%u]", array->name, length);
    620       }
    621    }
    622 
    623    this->name = n;
    624 }
    625 
    626 const glsl_type *
    627 glsl_type::vec(unsigned components, const glsl_type *const ts[])
    628 {
    629    unsigned n = components;
    630 
    631    if (components == 8)
    632       n = 5;
    633    else if (components == 16)
    634       n = 6;
    635 
    636    if (n == 0 || n > 6)
    637       return error_type;
    638 
    639    return ts[n - 1];
    640 }
    641 
    642 #define VECN(components, sname, vname)           \
    643 const glsl_type *                                \
    644 glsl_type:: vname (unsigned components)          \
    645 {                                                \
    646    static const glsl_type *const ts[] = {        \
    647       sname ## _type, vname ## 2_type,           \
    648       vname ## 3_type, vname ## 4_type,          \
    649       vname ## 8_type, vname ## 16_type,         \
    650    };                                            \
    651    return glsl_type::vec(components, ts);        \
    652 }
    653 
    654 VECN(components, float, vec)
    655 VECN(components, float16_t, f16vec)
    656 VECN(components, double, dvec)
    657 VECN(components, int, ivec)
    658 VECN(components, uint, uvec)
    659 VECN(components, bool, bvec)
    660 VECN(components, int64_t, i64vec)
    661 VECN(components, uint64_t, u64vec)
    662 VECN(components, int16_t, i16vec)
    663 VECN(components, uint16_t, u16vec)
    664 VECN(components, int8_t, i8vec)
    665 VECN(components, uint8_t, u8vec)
    666 
    667 const glsl_type *
    668 glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns,
    669                         unsigned explicit_stride, bool row_major,
    670                         unsigned explicit_alignment)
    671 {
    672    if (base_type == GLSL_TYPE_VOID) {
    673       assert(explicit_stride == 0 && explicit_alignment == 0 && !row_major);
    674       return void_type;
    675    }
    676 
    677    /* Matrix and vector types with explicit strides or alignment have to be
    678     * looked up in a table so they're handled separately.
    679     */
    680    if (explicit_stride > 0 || explicit_alignment > 0) {
    681       if (explicit_alignment > 0) {
    682          assert(util_is_power_of_two_nonzero(explicit_alignment));
    683          assert(explicit_stride % explicit_alignment == 0);
    684       }
    685 
    686       const glsl_type *bare_type = get_instance(base_type, rows, columns);
    687 
    688       assert(columns > 1 || (rows > 1 && !row_major));
    689 
    690       char name[128];
    691       snprintf(name, sizeof(name), "%sx%ua%uB%s", bare_type->name,
    692                explicit_stride, explicit_alignment, row_major ? "RM" : "");
    693 
    694       mtx_lock(&glsl_type::hash_mutex);
    695       assert(glsl_type_users > 0);
    696 
    697       if (explicit_matrix_types == NULL) {
    698          explicit_matrix_types =
    699             _mesa_hash_table_create(NULL, _mesa_hash_string,
    700                                     _mesa_key_string_equal);
    701       }
    702 
    703       const struct hash_entry *entry =
    704          _mesa_hash_table_search(explicit_matrix_types, name);
    705       if (entry == NULL) {
    706          const glsl_type *t = new glsl_type(bare_type->gl_type,
    707                                             (glsl_base_type)base_type,
    708                                             rows, columns, name,
    709                                             explicit_stride, row_major,
    710                                             explicit_alignment);
    711 
    712          entry = _mesa_hash_table_insert(explicit_matrix_types,
    713                                          t->name, (void *)t);
    714       }
    715 
    716       assert(((glsl_type *) entry->data)->base_type == base_type);
    717       assert(((glsl_type *) entry->data)->vector_elements == rows);
    718       assert(((glsl_type *) entry->data)->matrix_columns == columns);
    719       assert(((glsl_type *) entry->data)->explicit_stride == explicit_stride);
    720       assert(((glsl_type *) entry->data)->explicit_alignment == explicit_alignment);
    721 
    722       const glsl_type *t = (const glsl_type *) entry->data;
    723 
    724       mtx_unlock(&glsl_type::hash_mutex);
    725 
    726       return t;
    727    }
    728 
    729    assert(!row_major);
    730 
    731    /* Treat GLSL vectors as Nx1 matrices.
    732     */
    733    if (columns == 1) {
    734       switch (base_type) {
    735       case GLSL_TYPE_UINT:
    736          return uvec(rows);
    737       case GLSL_TYPE_INT:
    738          return ivec(rows);
    739       case GLSL_TYPE_FLOAT:
    740          return vec(rows);
    741       case GLSL_TYPE_FLOAT16:
    742          return f16vec(rows);
    743       case GLSL_TYPE_DOUBLE:
    744          return dvec(rows);
    745       case GLSL_TYPE_BOOL:
    746          return bvec(rows);
    747       case GLSL_TYPE_UINT64:
    748          return u64vec(rows);
    749       case GLSL_TYPE_INT64:
    750          return i64vec(rows);
    751       case GLSL_TYPE_UINT16:
    752          return u16vec(rows);
    753       case GLSL_TYPE_INT16:
    754          return i16vec(rows);
    755       case GLSL_TYPE_UINT8:
    756          return u8vec(rows);
    757       case GLSL_TYPE_INT8:
    758          return i8vec(rows);
    759       default:
    760          return error_type;
    761       }
    762    } else {
    763       if ((base_type != GLSL_TYPE_FLOAT &&
    764            base_type != GLSL_TYPE_DOUBLE &&
    765            base_type != GLSL_TYPE_FLOAT16) || (rows == 1))
    766          return error_type;
    767 
    768       /* GLSL matrix types are named mat{COLUMNS}x{ROWS}.  Only the following
    769        * combinations are valid:
    770        *
    771        *   1 2 3 4
    772        * 1
    773        * 2   x x x
    774        * 3   x x x
    775        * 4   x x x
    776        */
    777 #define IDX(c,r) (((c-1)*3) + (r-1))
    778 
    779       switch (base_type) {
    780       case GLSL_TYPE_DOUBLE: {
    781          switch (IDX(columns, rows)) {
    782          case IDX(2,2): return dmat2_type;
    783          case IDX(2,3): return dmat2x3_type;
    784          case IDX(2,4): return dmat2x4_type;
    785          case IDX(3,2): return dmat3x2_type;
    786          case IDX(3,3): return dmat3_type;
    787          case IDX(3,4): return dmat3x4_type;
    788          case IDX(4,2): return dmat4x2_type;
    789          case IDX(4,3): return dmat4x3_type;
    790          case IDX(4,4): return dmat4_type;
    791          default: return error_type;
    792          }
    793       }
    794       case GLSL_TYPE_FLOAT: {
    795          switch (IDX(columns, rows)) {
    796          case IDX(2,2): return mat2_type;
    797          case IDX(2,3): return mat2x3_type;
    798          case IDX(2,4): return mat2x4_type;
    799          case IDX(3,2): return mat3x2_type;
    800          case IDX(3,3): return mat3_type;
    801          case IDX(3,4): return mat3x4_type;
    802          case IDX(4,2): return mat4x2_type;
    803          case IDX(4,3): return mat4x3_type;
    804          case IDX(4,4): return mat4_type;
    805          default: return error_type;
    806          }
    807       }
    808       case GLSL_TYPE_FLOAT16: {
    809          switch (IDX(columns, rows)) {
    810          case IDX(2,2): return f16mat2_type;
    811          case IDX(2,3): return f16mat2x3_type;
    812          case IDX(2,4): return f16mat2x4_type;
    813          case IDX(3,2): return f16mat3x2_type;
    814          case IDX(3,3): return f16mat3_type;
    815          case IDX(3,4): return f16mat3x4_type;
    816          case IDX(4,2): return f16mat4x2_type;
    817          case IDX(4,3): return f16mat4x3_type;
    818          case IDX(4,4): return f16mat4_type;
    819          default: return error_type;
    820          }
    821       }
    822       default: return error_type;
    823       }
    824    }
    825 
    826    assert(!"Should not get here.");
    827    return error_type;
    828 }
    829 
    830 const glsl_type *
    831 glsl_type::get_sampler_instance(enum glsl_sampler_dim dim,
    832                                 bool shadow,
    833                                 bool array,
    834                                 glsl_base_type type)
    835 {
    836    switch (type) {
    837    case GLSL_TYPE_FLOAT:
    838       switch (dim) {
    839       case GLSL_SAMPLER_DIM_1D:
    840          if (shadow)
    841             return (array ? sampler1DArrayShadow_type : sampler1DShadow_type);
    842          else
    843             return (array ? sampler1DArray_type : sampler1D_type);
    844       case GLSL_SAMPLER_DIM_2D:
    845          if (shadow)
    846             return (array ? sampler2DArrayShadow_type : sampler2DShadow_type);
    847          else
    848             return (array ? sampler2DArray_type : sampler2D_type);
    849       case GLSL_SAMPLER_DIM_3D:
    850          if (shadow || array)
    851             return error_type;
    852          else
    853             return sampler3D_type;
    854       case GLSL_SAMPLER_DIM_CUBE:
    855          if (shadow)
    856             return (array ? samplerCubeArrayShadow_type : samplerCubeShadow_type);
    857          else
    858             return (array ? samplerCubeArray_type : samplerCube_type);
    859       case GLSL_SAMPLER_DIM_RECT:
    860          if (array)
    861             return error_type;
    862          if (shadow)
    863             return sampler2DRectShadow_type;
    864          else
    865             return sampler2DRect_type;
    866       case GLSL_SAMPLER_DIM_BUF:
    867          if (shadow || array)
    868             return error_type;
    869          else
    870             return samplerBuffer_type;
    871       case GLSL_SAMPLER_DIM_MS:
    872          if (shadow)
    873             return error_type;
    874          return (array ? sampler2DMSArray_type : sampler2DMS_type);
    875       case GLSL_SAMPLER_DIM_EXTERNAL:
    876          if (shadow || array)
    877             return error_type;
    878          else
    879             return samplerExternalOES_type;
    880       case GLSL_SAMPLER_DIM_SUBPASS:
    881       case GLSL_SAMPLER_DIM_SUBPASS_MS:
    882          return error_type;
    883       }
    884    case GLSL_TYPE_INT:
    885       if (shadow)
    886          return error_type;
    887       switch (dim) {
    888       case GLSL_SAMPLER_DIM_1D:
    889          return (array ? isampler1DArray_type : isampler1D_type);
    890       case GLSL_SAMPLER_DIM_2D:
    891          return (array ? isampler2DArray_type : isampler2D_type);
    892       case GLSL_SAMPLER_DIM_3D:
    893          if (array)
    894             return error_type;
    895          return isampler3D_type;
    896       case GLSL_SAMPLER_DIM_CUBE:
    897          return (array ? isamplerCubeArray_type : isamplerCube_type);
    898       case GLSL_SAMPLER_DIM_RECT:
    899          if (array)
    900             return error_type;
    901          return isampler2DRect_type;
    902       case GLSL_SAMPLER_DIM_BUF:
    903          if (array)
    904             return error_type;
    905          return isamplerBuffer_type;
    906       case GLSL_SAMPLER_DIM_MS:
    907          return (array ? isampler2DMSArray_type : isampler2DMS_type);
    908       case GLSL_SAMPLER_DIM_EXTERNAL:
    909          return error_type;
    910       case GLSL_SAMPLER_DIM_SUBPASS:
    911       case GLSL_SAMPLER_DIM_SUBPASS_MS:
    912          return error_type;
    913       }
    914    case GLSL_TYPE_UINT:
    915       if (shadow)
    916          return error_type;
    917       switch (dim) {
    918       case GLSL_SAMPLER_DIM_1D:
    919          return (array ? usampler1DArray_type : usampler1D_type);
    920       case GLSL_SAMPLER_DIM_2D:
    921          return (array ? usampler2DArray_type : usampler2D_type);
    922       case GLSL_SAMPLER_DIM_3D:
    923          if (array)
    924             return error_type;
    925          return usampler3D_type;
    926       case GLSL_SAMPLER_DIM_CUBE:
    927          return (array ? usamplerCubeArray_type : usamplerCube_type);
    928       case GLSL_SAMPLER_DIM_RECT:
    929          if (array)
    930             return error_type;
    931          return usampler2DRect_type;
    932       case GLSL_SAMPLER_DIM_BUF:
    933          if (array)
    934             return error_type;
    935          return usamplerBuffer_type;
    936       case GLSL_SAMPLER_DIM_MS:
    937          return (array ? usampler2DMSArray_type : usampler2DMS_type);
    938       case GLSL_SAMPLER_DIM_EXTERNAL:
    939          return error_type;
    940       case GLSL_SAMPLER_DIM_SUBPASS:
    941       case GLSL_SAMPLER_DIM_SUBPASS_MS:
    942          return error_type;
    943       }
    944    case GLSL_TYPE_VOID:
    945       return shadow ? samplerShadow_type : sampler_type;
    946    default:
    947       return error_type;
    948    }
    949 
    950    unreachable("switch statement above should be complete");
    951 }
    952 
    953 const glsl_type *
    954 glsl_type::get_image_instance(enum glsl_sampler_dim dim,
    955                               bool array, glsl_base_type type)
    956 {
    957    switch (type) {
    958    case GLSL_TYPE_FLOAT:
    959       switch (dim) {
    960       case GLSL_SAMPLER_DIM_1D:
    961          return (array ? image1DArray_type : image1D_type);
    962       case GLSL_SAMPLER_DIM_2D:
    963          return (array ? image2DArray_type : image2D_type);
    964       case GLSL_SAMPLER_DIM_3D:
    965          return image3D_type;
    966       case GLSL_SAMPLER_DIM_CUBE:
    967          return (array ? imageCubeArray_type : imageCube_type);
    968       case GLSL_SAMPLER_DIM_RECT:
    969          if (array)
    970             return error_type;
    971          else
    972             return image2DRect_type;
    973       case GLSL_SAMPLER_DIM_BUF:
    974          if (array)
    975             return error_type;
    976          else
    977             return imageBuffer_type;
    978       case GLSL_SAMPLER_DIM_MS:
    979          return (array ? image2DMSArray_type : image2DMS_type);
    980       case GLSL_SAMPLER_DIM_SUBPASS:
    981          return subpassInput_type;
    982       case GLSL_SAMPLER_DIM_SUBPASS_MS:
    983          return subpassInputMS_type;
    984       case GLSL_SAMPLER_DIM_EXTERNAL:
    985          return error_type;
    986       }
    987    case GLSL_TYPE_INT:
    988       switch (dim) {
    989       case GLSL_SAMPLER_DIM_1D:
    990          return (array ? iimage1DArray_type : iimage1D_type);
    991       case GLSL_SAMPLER_DIM_2D:
    992          return (array ? iimage2DArray_type : iimage2D_type);
    993       case GLSL_SAMPLER_DIM_3D:
    994          if (array)
    995             return error_type;
    996          return iimage3D_type;
    997       case GLSL_SAMPLER_DIM_CUBE:
    998          return (array ? iimageCubeArray_type : iimageCube_type);
    999       case GLSL_SAMPLER_DIM_RECT:
   1000          if (array)
   1001             return error_type;
   1002          return iimage2DRect_type;
   1003       case GLSL_SAMPLER_DIM_BUF:
   1004          if (array)
   1005             return error_type;
   1006          return iimageBuffer_type;
   1007       case GLSL_SAMPLER_DIM_MS:
   1008          return (array ? iimage2DMSArray_type : iimage2DMS_type);
   1009       case GLSL_SAMPLER_DIM_SUBPASS:
   1010          return isubpassInput_type;
   1011       case GLSL_SAMPLER_DIM_SUBPASS_MS:
   1012          return isubpassInputMS_type;
   1013       case GLSL_SAMPLER_DIM_EXTERNAL:
   1014          return error_type;
   1015       }
   1016    case GLSL_TYPE_UINT:
   1017       switch (dim) {
   1018       case GLSL_SAMPLER_DIM_1D:
   1019          return (array ? uimage1DArray_type : uimage1D_type);
   1020       case GLSL_SAMPLER_DIM_2D:
   1021          return (array ? uimage2DArray_type : uimage2D_type);
   1022       case GLSL_SAMPLER_DIM_3D:
   1023          if (array)
   1024             return error_type;
   1025          return uimage3D_type;
   1026       case GLSL_SAMPLER_DIM_CUBE:
   1027          return (array ? uimageCubeArray_type : uimageCube_type);
   1028       case GLSL_SAMPLER_DIM_RECT:
   1029          if (array)
   1030             return error_type;
   1031          return uimage2DRect_type;
   1032       case GLSL_SAMPLER_DIM_BUF:
   1033          if (array)
   1034             return error_type;
   1035          return uimageBuffer_type;
   1036       case GLSL_SAMPLER_DIM_MS:
   1037          return (array ? uimage2DMSArray_type : uimage2DMS_type);
   1038       case GLSL_SAMPLER_DIM_SUBPASS:
   1039          return usubpassInput_type;
   1040       case GLSL_SAMPLER_DIM_SUBPASS_MS:
   1041          return usubpassInputMS_type;
   1042       case GLSL_SAMPLER_DIM_EXTERNAL:
   1043          return error_type;
   1044       }
   1045    case GLSL_TYPE_INT64:
   1046       switch (dim) {
   1047       case GLSL_SAMPLER_DIM_1D:
   1048          return (array ? i64image1DArray_type : i64image1D_type);
   1049       case GLSL_SAMPLER_DIM_2D:
   1050          return (array ? i64image2DArray_type : i64image2D_type);
   1051       case GLSL_SAMPLER_DIM_3D:
   1052          if (array)
   1053             return error_type;
   1054          return i64image3D_type;
   1055       case GLSL_SAMPLER_DIM_CUBE:
   1056          return (array ? i64imageCubeArray_type : i64imageCube_type);
   1057       case GLSL_SAMPLER_DIM_RECT:
   1058          if (array)
   1059             return error_type;
   1060          return i64image2DRect_type;
   1061       case GLSL_SAMPLER_DIM_BUF:
   1062          if (array)
   1063             return error_type;
   1064          return i64imageBuffer_type;
   1065       case GLSL_SAMPLER_DIM_MS:
   1066          return (array ? i64image2DMSArray_type : i64image2DMS_type);
   1067       case GLSL_SAMPLER_DIM_SUBPASS:
   1068       case GLSL_SAMPLER_DIM_SUBPASS_MS:
   1069       case GLSL_SAMPLER_DIM_EXTERNAL:
   1070          return error_type;
   1071       }
   1072    case GLSL_TYPE_UINT64:
   1073       switch (dim) {
   1074       case GLSL_SAMPLER_DIM_1D:
   1075          return (array ? u64image1DArray_type : u64image1D_type);
   1076       case GLSL_SAMPLER_DIM_2D:
   1077          return (array ? u64image2DArray_type : u64image2D_type);
   1078       case GLSL_SAMPLER_DIM_3D:
   1079          if (array)
   1080             return error_type;
   1081          return u64image3D_type;
   1082       case GLSL_SAMPLER_DIM_CUBE:
   1083          return (array ? u64imageCubeArray_type : u64imageCube_type);
   1084       case GLSL_SAMPLER_DIM_RECT:
   1085          if (array)
   1086             return error_type;
   1087          return u64image2DRect_type;
   1088       case GLSL_SAMPLER_DIM_BUF:
   1089          if (array)
   1090             return error_type;
   1091          return u64imageBuffer_type;
   1092       case GLSL_SAMPLER_DIM_MS:
   1093          return (array ? u64image2DMSArray_type : u64image2DMS_type);
   1094       case GLSL_SAMPLER_DIM_SUBPASS:
   1095       case GLSL_SAMPLER_DIM_SUBPASS_MS:
   1096       case GLSL_SAMPLER_DIM_EXTERNAL:
   1097          return error_type;
   1098       }
   1099    case GLSL_TYPE_VOID:
   1100       switch (dim) {
   1101       case GLSL_SAMPLER_DIM_1D:
   1102          return (array ? vimage1DArray_type : vimage1D_type);
   1103       case GLSL_SAMPLER_DIM_2D:
   1104          return (array ? vimage2DArray_type : vimage2D_type);
   1105       case GLSL_SAMPLER_DIM_3D:
   1106          return (array ? error_type : vimage3D_type);
   1107       case GLSL_SAMPLER_DIM_BUF:
   1108          return (array ? error_type : vbuffer_type);
   1109       default:
   1110          return error_type;
   1111       }
   1112    default:
   1113       return error_type;
   1114    }
   1115 
   1116    unreachable("switch statement above should be complete");
   1117 }
   1118 
   1119 const glsl_type *
   1120 glsl_type::get_array_instance(const glsl_type *base,
   1121                               unsigned array_size,
   1122                               unsigned explicit_stride)
   1123 {
   1124    /* Generate a name using the base type pointer in the key.  This is
   1125     * done because the name of the base type may not be unique across
   1126     * shaders.  For example, two shaders may have different record types
   1127     * named 'foo'.
   1128     */
   1129    char key[128];
   1130    snprintf(key, sizeof(key), "%p[%u]x%uB", (void *) base, array_size,
   1131             explicit_stride);
   1132 
   1133    mtx_lock(&glsl_type::hash_mutex);
   1134    assert(glsl_type_users > 0);
   1135 
   1136    if (array_types == NULL) {
   1137       array_types = _mesa_hash_table_create(NULL, _mesa_hash_string,
   1138                                             _mesa_key_string_equal);
   1139    }
   1140 
   1141    const struct hash_entry *entry = _mesa_hash_table_search(array_types, key);
   1142    if (entry == NULL) {
   1143       const glsl_type *t = new glsl_type(base, array_size, explicit_stride);
   1144 
   1145       entry = _mesa_hash_table_insert(array_types,
   1146                                       strdup(key),
   1147                                       (void *) t);
   1148    }
   1149 
   1150    assert(((glsl_type *) entry->data)->base_type == GLSL_TYPE_ARRAY);
   1151    assert(((glsl_type *) entry->data)->length == array_size);
   1152    assert(((glsl_type *) entry->data)->fields.array == base);
   1153 
   1154    glsl_type *t = (glsl_type *) entry->data;
   1155 
   1156    mtx_unlock(&glsl_type::hash_mutex);
   1157 
   1158    return t;
   1159 }
   1160 
   1161 bool
   1162 glsl_type::compare_no_precision(const glsl_type *b) const
   1163 {
   1164    if (this == b)
   1165       return true;
   1166 
   1167    if (this->is_array()) {
   1168       if (!b->is_array() || this->length != b->length)
   1169          return false;
   1170 
   1171       const glsl_type *b_no_array = b->fields.array;
   1172 
   1173       return this->fields.array->compare_no_precision(b_no_array);
   1174    }
   1175 
   1176    if (this->is_struct()) {
   1177       if (!b->is_struct())
   1178          return false;
   1179    } else if (this->is_interface()) {
   1180       if (!b->is_interface())
   1181          return false;
   1182    } else {
   1183       return false;
   1184    }
   1185 
   1186    return record_compare(b,
   1187                          true, /* match_name */
   1188                          true, /* match_locations */
   1189                          false /* match_precision */);
   1190 }
   1191 
   1192 bool
   1193 glsl_type::record_compare(const glsl_type *b, bool match_name,
   1194                           bool match_locations, bool match_precision) const
   1195 {
   1196    if (this->length != b->length)
   1197       return false;
   1198 
   1199    if (this->interface_packing != b->interface_packing)
   1200       return false;
   1201 
   1202    if (this->interface_row_major != b->interface_row_major)
   1203       return false;
   1204 
   1205    if (this->explicit_alignment != b->explicit_alignment)
   1206       return false;
   1207 
   1208    if (this->packed != b->packed)
   1209       return false;
   1210 
   1211    /* From the GLSL 4.20 specification (Sec 4.2):
   1212     *
   1213     *     "Structures must have the same name, sequence of type names, and
   1214     *     type definitions, and field names to be considered the same type."
   1215     *
   1216     * GLSL ES behaves the same (Ver 1.00 Sec 4.2.4, Ver 3.00 Sec 4.2.5).
   1217     *
   1218     * Section 7.4.1 (Shader Interface Matching) of the OpenGL 4.30 spec says:
   1219     *
   1220     *     "Variables or block members declared as structures are considered
   1221     *     to match in type if and only if structure members match in name,
   1222     *     type, qualification, and declaration order."
   1223     */
   1224    if (match_name)
   1225       if (strcmp(this->name, b->name) != 0)
   1226          return false;
   1227 
   1228    for (unsigned i = 0; i < this->length; i++) {
   1229       if (match_precision) {
   1230          if (this->fields.structure[i].type != b->fields.structure[i].type)
   1231             return false;
   1232       } else {
   1233          const glsl_type *ta = this->fields.structure[i].type;
   1234          const glsl_type *tb = b->fields.structure[i].type;
   1235          if (!ta->compare_no_precision(tb))
   1236             return false;
   1237       }
   1238       if (strcmp(this->fields.structure[i].name,
   1239                  b->fields.structure[i].name) != 0)
   1240          return false;
   1241       if (this->fields.structure[i].matrix_layout
   1242          != b->fields.structure[i].matrix_layout)
   1243         return false;
   1244       if (match_locations && this->fields.structure[i].location
   1245           != b->fields.structure[i].location)
   1246          return false;
   1247       if (this->fields.structure[i].component
   1248           != b->fields.structure[i].component)
   1249          return false;
   1250       if (this->fields.structure[i].offset
   1251           != b->fields.structure[i].offset)
   1252          return false;
   1253       if (this->fields.structure[i].interpolation
   1254           != b->fields.structure[i].interpolation)
   1255          return false;
   1256       if (this->fields.structure[i].centroid
   1257           != b->fields.structure[i].centroid)
   1258          return false;
   1259       if (this->fields.structure[i].sample
   1260           != b->fields.structure[i].sample)
   1261          return false;
   1262       if (this->fields.structure[i].patch
   1263           != b->fields.structure[i].patch)
   1264          return false;
   1265       if (this->fields.structure[i].memory_read_only
   1266           != b->fields.structure[i].memory_read_only)
   1267          return false;
   1268       if (this->fields.structure[i].memory_write_only
   1269           != b->fields.structure[i].memory_write_only)
   1270          return false;
   1271       if (this->fields.structure[i].memory_coherent
   1272           != b->fields.structure[i].memory_coherent)
   1273          return false;
   1274       if (this->fields.structure[i].memory_volatile
   1275           != b->fields.structure[i].memory_volatile)
   1276          return false;
   1277       if (this->fields.structure[i].memory_restrict
   1278           != b->fields.structure[i].memory_restrict)
   1279          return false;
   1280       if (this->fields.structure[i].image_format
   1281           != b->fields.structure[i].image_format)
   1282          return false;
   1283       if (match_precision &&
   1284           this->fields.structure[i].precision
   1285           != b->fields.structure[i].precision)
   1286          return false;
   1287       if (this->fields.structure[i].explicit_xfb_buffer
   1288           != b->fields.structure[i].explicit_xfb_buffer)
   1289          return false;
   1290       if (this->fields.structure[i].xfb_buffer
   1291           != b->fields.structure[i].xfb_buffer)
   1292          return false;
   1293       if (this->fields.structure[i].xfb_stride
   1294           != b->fields.structure[i].xfb_stride)
   1295          return false;
   1296    }
   1297 
   1298    return true;
   1299 }
   1300 
   1301 
   1302 bool
   1303 glsl_type::record_key_compare(const void *a, const void *b)
   1304 {
   1305    const glsl_type *const key1 = (glsl_type *) a;
   1306    const glsl_type *const key2 = (glsl_type *) b;
   1307 
   1308    return strcmp(key1->name, key2->name) == 0 &&
   1309                  key1->record_compare(key2, true);
   1310 }
   1311 
   1312 
   1313 /**
   1314  * Generate an integer hash value for a glsl_type structure type.
   1315  */
   1316 unsigned
   1317 glsl_type::record_key_hash(const void *a)
   1318 {
   1319    const glsl_type *const key = (glsl_type *) a;
   1320    uintptr_t hash = key->length;
   1321    unsigned retval;
   1322 
   1323    for (unsigned i = 0; i < key->length; i++) {
   1324       /* casting pointer to uintptr_t */
   1325       hash = (hash * 13 ) + (uintptr_t) key->fields.structure[i].type;
   1326    }
   1327 
   1328    if (sizeof(hash) == 8)
   1329       retval = (hash & 0xffffffff) ^ ((uint64_t) hash >> 32);
   1330    else
   1331       retval = hash;
   1332 
   1333    return retval;
   1334 }
   1335 
   1336 
   1337 const glsl_type *
   1338 glsl_type::get_struct_instance(const glsl_struct_field *fields,
   1339                                unsigned num_fields,
   1340                                const char *name,
   1341                                bool packed, unsigned explicit_alignment)
   1342 {
   1343    const glsl_type key(fields, num_fields, name, packed, explicit_alignment);
   1344 
   1345    mtx_lock(&glsl_type::hash_mutex);
   1346    assert(glsl_type_users > 0);
   1347 
   1348    if (struct_types == NULL) {
   1349       struct_types = _mesa_hash_table_create(NULL, record_key_hash,
   1350                                              record_key_compare);
   1351    }
   1352 
   1353    const struct hash_entry *entry = _mesa_hash_table_search(struct_types,
   1354                                                             &key);
   1355    if (entry == NULL) {
   1356       const glsl_type *t = new glsl_type(fields, num_fields, name, packed,
   1357                                          explicit_alignment);
   1358 
   1359       entry = _mesa_hash_table_insert(struct_types, t, (void *) t);
   1360    }
   1361 
   1362    assert(((glsl_type *) entry->data)->base_type == GLSL_TYPE_STRUCT);
   1363    assert(((glsl_type *) entry->data)->length == num_fields);
   1364    assert(strcmp(((glsl_type *) entry->data)->name, name) == 0);
   1365    assert(((glsl_type *) entry->data)->packed == packed);
   1366    assert(((glsl_type *) entry->data)->explicit_alignment == explicit_alignment);
   1367 
   1368    glsl_type *t = (glsl_type *) entry->data;
   1369 
   1370    mtx_unlock(&glsl_type::hash_mutex);
   1371 
   1372    return t;
   1373 }
   1374 
   1375 
   1376 const glsl_type *
   1377 glsl_type::get_interface_instance(const glsl_struct_field *fields,
   1378                                   unsigned num_fields,
   1379                                   enum glsl_interface_packing packing,
   1380                                   bool row_major,
   1381                                   const char *block_name)
   1382 {
   1383    const glsl_type key(fields, num_fields, packing, row_major, block_name);
   1384 
   1385    mtx_lock(&glsl_type::hash_mutex);
   1386    assert(glsl_type_users > 0);
   1387 
   1388    if (interface_types == NULL) {
   1389       interface_types = _mesa_hash_table_create(NULL, record_key_hash,
   1390                                                 record_key_compare);
   1391    }
   1392 
   1393    const struct hash_entry *entry = _mesa_hash_table_search(interface_types,
   1394                                                             &key);
   1395    if (entry == NULL) {
   1396       const glsl_type *t = new glsl_type(fields, num_fields,
   1397                                          packing, row_major, block_name);
   1398 
   1399       entry = _mesa_hash_table_insert(interface_types, t, (void *) t);
   1400    }
   1401 
   1402    assert(((glsl_type *) entry->data)->base_type == GLSL_TYPE_INTERFACE);
   1403    assert(((glsl_type *) entry->data)->length == num_fields);
   1404    assert(strcmp(((glsl_type *) entry->data)->name, block_name) == 0);
   1405 
   1406    glsl_type *t = (glsl_type *) entry->data;
   1407 
   1408    mtx_unlock(&glsl_type::hash_mutex);
   1409 
   1410    return t;
   1411 }
   1412 
   1413 const glsl_type *
   1414 glsl_type::get_subroutine_instance(const char *subroutine_name)
   1415 {
   1416    const glsl_type key(subroutine_name);
   1417 
   1418    mtx_lock(&glsl_type::hash_mutex);
   1419    assert(glsl_type_users > 0);
   1420 
   1421    if (subroutine_types == NULL) {
   1422       subroutine_types = _mesa_hash_table_create(NULL, record_key_hash,
   1423                                                  record_key_compare);
   1424    }
   1425 
   1426    const struct hash_entry *entry = _mesa_hash_table_search(subroutine_types,
   1427                                                             &key);
   1428    if (entry == NULL) {
   1429       const glsl_type *t = new glsl_type(subroutine_name);
   1430 
   1431       entry = _mesa_hash_table_insert(subroutine_types, t, (void *) t);
   1432    }
   1433 
   1434    assert(((glsl_type *) entry->data)->base_type == GLSL_TYPE_SUBROUTINE);
   1435    assert(strcmp(((glsl_type *) entry->data)->name, subroutine_name) == 0);
   1436 
   1437    glsl_type *t = (glsl_type *) entry->data;
   1438 
   1439    mtx_unlock(&glsl_type::hash_mutex);
   1440 
   1441    return t;
   1442 }
   1443 
   1444 
   1445 static bool
   1446 function_key_compare(const void *a, const void *b)
   1447 {
   1448    const glsl_type *const key1 = (glsl_type *) a;
   1449    const glsl_type *const key2 = (glsl_type *) b;
   1450 
   1451    if (key1->length != key2->length)
   1452       return false;
   1453 
   1454    return memcmp(key1->fields.parameters, key2->fields.parameters,
   1455                  (key1->length + 1) * sizeof(*key1->fields.parameters)) == 0;
   1456 }
   1457 
   1458 
   1459 static uint32_t
   1460 function_key_hash(const void *a)
   1461 {
   1462    const glsl_type *const key = (glsl_type *) a;
   1463    return _mesa_hash_data(key->fields.parameters,
   1464                           (key->length + 1) * sizeof(*key->fields.parameters));
   1465 }
   1466 
   1467 const glsl_type *
   1468 glsl_type::get_function_instance(const glsl_type *return_type,
   1469                                  const glsl_function_param *params,
   1470                                  unsigned num_params)
   1471 {
   1472    const glsl_type key(return_type, params, num_params);
   1473 
   1474    mtx_lock(&glsl_type::hash_mutex);
   1475    assert(glsl_type_users > 0);
   1476 
   1477    if (function_types == NULL) {
   1478       function_types = _mesa_hash_table_create(NULL, function_key_hash,
   1479                                                function_key_compare);
   1480    }
   1481 
   1482    struct hash_entry *entry = _mesa_hash_table_search(function_types, &key);
   1483    if (entry == NULL) {
   1484       const glsl_type *t = new glsl_type(return_type, params, num_params);
   1485 
   1486       entry = _mesa_hash_table_insert(function_types, t, (void *) t);
   1487    }
   1488 
   1489    const glsl_type *t = (const glsl_type *)entry->data;
   1490 
   1491    assert(t->base_type == GLSL_TYPE_FUNCTION);
   1492    assert(t->length == num_params);
   1493 
   1494    mtx_unlock(&glsl_type::hash_mutex);
   1495 
   1496    return t;
   1497 }
   1498 
   1499 
   1500 const glsl_type *
   1501 glsl_type::get_mul_type(const glsl_type *type_a, const glsl_type *type_b)
   1502 {
   1503    if (type_a->is_matrix() && type_b->is_matrix()) {
   1504       /* Matrix multiply.  The columns of A must match the rows of B.  Given
   1505        * the other previously tested constraints, this means the vector type
   1506        * of a row from A must be the same as the vector type of a column from
   1507        * B.
   1508        */
   1509       if (type_a->row_type() == type_b->column_type()) {
   1510          /* The resulting matrix has the number of columns of matrix B and
   1511           * the number of rows of matrix A.  We get the row count of A by
   1512           * looking at the size of a vector that makes up a column.  The
   1513           * transpose (size of a row) is done for B.
   1514           */
   1515          const glsl_type *const type =
   1516             get_instance(type_a->base_type,
   1517                          type_a->column_type()->vector_elements,
   1518                          type_b->row_type()->vector_elements);
   1519          assert(type != error_type);
   1520 
   1521          return type;
   1522       }
   1523    } else if (type_a == type_b) {
   1524       return type_a;
   1525    } else if (type_a->is_matrix()) {
   1526       /* A is a matrix and B is a column vector.  Columns of A must match
   1527        * rows of B.  Given the other previously tested constraints, this
   1528        * means the vector type of a row from A must be the same as the
   1529        * vector the type of B.
   1530        */
   1531       if (type_a->row_type() == type_b) {
   1532          /* The resulting vector has a number of elements equal to
   1533           * the number of rows of matrix A. */
   1534          const glsl_type *const type =
   1535             get_instance(type_a->base_type,
   1536                          type_a->column_type()->vector_elements,
   1537                          1);
   1538          assert(type != error_type);
   1539 
   1540          return type;
   1541       }
   1542    } else {
   1543       assert(type_b->is_matrix());
   1544 
   1545       /* A is a row vector and B is a matrix.  Columns of A must match rows
   1546        * of B.  Given the other previously tested constraints, this means
   1547        * the type of A must be the same as the vector type of a column from
   1548        * B.
   1549        */
   1550       if (type_a == type_b->column_type()) {
   1551          /* The resulting vector has a number of elements equal to
   1552           * the number of columns of matrix B. */
   1553          const glsl_type *const type =
   1554             get_instance(type_a->base_type,
   1555                          type_b->row_type()->vector_elements,
   1556                          1);
   1557          assert(type != error_type);
   1558 
   1559          return type;
   1560       }
   1561    }
   1562 
   1563    return error_type;
   1564 }
   1565 
   1566 
   1567 const glsl_type *
   1568 glsl_type::field_type(const char *name) const
   1569 {
   1570    if (this->base_type != GLSL_TYPE_STRUCT
   1571        && this->base_type != GLSL_TYPE_INTERFACE)
   1572       return error_type;
   1573 
   1574    for (unsigned i = 0; i < this->length; i++) {
   1575       if (strcmp(name, this->fields.structure[i].name) == 0)
   1576          return this->fields.structure[i].type;
   1577    }
   1578 
   1579    return error_type;
   1580 }
   1581 
   1582 
   1583 int
   1584 glsl_type::field_index(const char *name) const
   1585 {
   1586    if (this->base_type != GLSL_TYPE_STRUCT
   1587        && this->base_type != GLSL_TYPE_INTERFACE)
   1588       return -1;
   1589 
   1590    for (unsigned i = 0; i < this->length; i++) {
   1591       if (strcmp(name, this->fields.structure[i].name) == 0)
   1592          return i;
   1593    }
   1594 
   1595    return -1;
   1596 }
   1597 
   1598 
   1599 unsigned
   1600 glsl_type::component_slots() const
   1601 {
   1602    switch (this->base_type) {
   1603    case GLSL_TYPE_UINT:
   1604    case GLSL_TYPE_INT:
   1605    case GLSL_TYPE_UINT8:
   1606    case GLSL_TYPE_INT8:
   1607    case GLSL_TYPE_UINT16:
   1608    case GLSL_TYPE_INT16:
   1609    case GLSL_TYPE_FLOAT:
   1610    case GLSL_TYPE_FLOAT16:
   1611    case GLSL_TYPE_BOOL:
   1612       return this->components();
   1613 
   1614    case GLSL_TYPE_DOUBLE:
   1615    case GLSL_TYPE_UINT64:
   1616    case GLSL_TYPE_INT64:
   1617       return 2 * this->components();
   1618 
   1619    case GLSL_TYPE_STRUCT:
   1620    case GLSL_TYPE_INTERFACE: {
   1621       unsigned size = 0;
   1622 
   1623       for (unsigned i = 0; i < this->length; i++)
   1624          size += this->fields.structure[i].type->component_slots();
   1625 
   1626       return size;
   1627    }
   1628 
   1629    case GLSL_TYPE_ARRAY:
   1630       return this->length * this->fields.array->component_slots();
   1631 
   1632    case GLSL_TYPE_SAMPLER:
   1633    case GLSL_TYPE_IMAGE:
   1634       return 2;
   1635 
   1636    case GLSL_TYPE_SUBROUTINE:
   1637       return 1;
   1638 
   1639    case GLSL_TYPE_FUNCTION:
   1640    case GLSL_TYPE_ATOMIC_UINT:
   1641    case GLSL_TYPE_VOID:
   1642    case GLSL_TYPE_ERROR:
   1643       break;
   1644    }
   1645 
   1646    return 0;
   1647 }
   1648 
   1649 unsigned
   1650 glsl_type::component_slots_aligned(unsigned offset) const
   1651 {
   1652    /* Align 64bit type only if it crosses attribute slot boundary. */
   1653    switch (this->base_type) {
   1654    case GLSL_TYPE_UINT:
   1655    case GLSL_TYPE_INT:
   1656    case GLSL_TYPE_UINT8:
   1657    case GLSL_TYPE_INT8:
   1658    case GLSL_TYPE_UINT16:
   1659    case GLSL_TYPE_INT16:
   1660    case GLSL_TYPE_FLOAT:
   1661    case GLSL_TYPE_FLOAT16:
   1662    case GLSL_TYPE_BOOL:
   1663       return this->components();
   1664 
   1665    case GLSL_TYPE_DOUBLE:
   1666    case GLSL_TYPE_UINT64:
   1667    case GLSL_TYPE_INT64: {
   1668       unsigned size = 2 * this->components();
   1669       if (offset % 2 == 1 && (offset % 4 + size) > 4) {
   1670          size++;
   1671       }
   1672 
   1673       return size;
   1674    }
   1675 
   1676    case GLSL_TYPE_STRUCT:
   1677    case GLSL_TYPE_INTERFACE: {
   1678       unsigned size = 0;
   1679 
   1680       for (unsigned i = 0; i < this->length; i++) {
   1681          const glsl_type *member = this->fields.structure[i].type;
   1682          size += member->component_slots_aligned(size + offset);
   1683       }
   1684 
   1685       return size;
   1686    }
   1687 
   1688    case GLSL_TYPE_ARRAY: {
   1689       unsigned size = 0;
   1690 
   1691       for (unsigned i = 0; i < this->length; i++) {
   1692          size += this->fields.array->component_slots_aligned(size + offset);
   1693       }
   1694 
   1695       return size;
   1696    }
   1697 
   1698    case GLSL_TYPE_SAMPLER:
   1699    case GLSL_TYPE_IMAGE:
   1700       return 2 + ((offset % 4) == 3 ? 1 : 0);
   1701 
   1702    case GLSL_TYPE_SUBROUTINE:
   1703       return 1;
   1704 
   1705    case GLSL_TYPE_FUNCTION:
   1706    case GLSL_TYPE_ATOMIC_UINT:
   1707    case GLSL_TYPE_VOID:
   1708    case GLSL_TYPE_ERROR:
   1709       break;
   1710    }
   1711 
   1712    return 0;
   1713 }
   1714 
   1715 unsigned
   1716 glsl_type::struct_location_offset(unsigned length) const
   1717 {
   1718    unsigned offset = 0;
   1719    const glsl_type *t = this->without_array();
   1720    if (t->is_struct()) {
   1721       assert(length <= t->length);
   1722 
   1723       for (unsigned i = 0; i < length; i++) {
   1724          const glsl_type *st = t->fields.structure[i].type;
   1725          const glsl_type *wa = st->without_array();
   1726          if (wa->is_struct()) {
   1727             unsigned r_offset = wa->struct_location_offset(wa->length);
   1728             offset += st->is_array() ?
   1729                st->arrays_of_arrays_size() * r_offset : r_offset;
   1730          } else if (st->is_array() && st->fields.array->is_array()) {
   1731             unsigned outer_array_size = st->length;
   1732             const glsl_type *base_type = st->fields.array;
   1733 
   1734             /* For arrays of arrays the outer arrays take up a uniform
   1735              * slot for each element. The innermost array elements share a
   1736              * single slot so we ignore the innermost array when calculating
   1737              * the offset.
   1738              */
   1739             while (base_type->fields.array->is_array()) {
   1740                outer_array_size = outer_array_size * base_type->length;
   1741                base_type = base_type->fields.array;
   1742             }
   1743             offset += outer_array_size;
   1744          } else {
   1745             /* We dont worry about arrays here because unless the array
   1746              * contains a structure or another array it only takes up a single
   1747              * uniform slot.
   1748              */
   1749             offset += 1;
   1750          }
   1751       }
   1752    }
   1753    return offset;
   1754 }
   1755 
   1756 unsigned
   1757 glsl_type::uniform_locations() const
   1758 {
   1759    unsigned size = 0;
   1760 
   1761    switch (this->base_type) {
   1762    case GLSL_TYPE_UINT:
   1763    case GLSL_TYPE_INT:
   1764    case GLSL_TYPE_FLOAT:
   1765    case GLSL_TYPE_FLOAT16:
   1766    case GLSL_TYPE_DOUBLE:
   1767    case GLSL_TYPE_UINT16:
   1768    case GLSL_TYPE_UINT8:
   1769    case GLSL_TYPE_INT16:
   1770    case GLSL_TYPE_INT8:
   1771    case GLSL_TYPE_UINT64:
   1772    case GLSL_TYPE_INT64:
   1773    case GLSL_TYPE_BOOL:
   1774    case GLSL_TYPE_SAMPLER:
   1775    case GLSL_TYPE_IMAGE:
   1776    case GLSL_TYPE_SUBROUTINE:
   1777       return 1;
   1778 
   1779    case GLSL_TYPE_STRUCT:
   1780    case GLSL_TYPE_INTERFACE:
   1781       for (unsigned i = 0; i < this->length; i++)
   1782          size += this->fields.structure[i].type->uniform_locations();
   1783       return size;
   1784    case GLSL_TYPE_ARRAY:
   1785       return this->length * this->fields.array->uniform_locations();
   1786    default:
   1787       return 0;
   1788    }
   1789 }
   1790 
   1791 unsigned
   1792 glsl_type::varying_count() const
   1793 {
   1794    unsigned size = 0;
   1795 
   1796    switch (this->base_type) {
   1797    case GLSL_TYPE_UINT:
   1798    case GLSL_TYPE_INT:
   1799    case GLSL_TYPE_FLOAT:
   1800    case GLSL_TYPE_FLOAT16:
   1801    case GLSL_TYPE_DOUBLE:
   1802    case GLSL_TYPE_BOOL:
   1803    case GLSL_TYPE_UINT16:
   1804    case GLSL_TYPE_UINT8:
   1805    case GLSL_TYPE_INT16:
   1806    case GLSL_TYPE_INT8:
   1807    case GLSL_TYPE_UINT64:
   1808    case GLSL_TYPE_INT64:
   1809       return 1;
   1810 
   1811    case GLSL_TYPE_STRUCT:
   1812    case GLSL_TYPE_INTERFACE:
   1813       for (unsigned i = 0; i < this->length; i++)
   1814          size += this->fields.structure[i].type->varying_count();
   1815       return size;
   1816    case GLSL_TYPE_ARRAY:
   1817       /* Don't count innermost array elements */
   1818       if (this->without_array()->is_struct() ||
   1819           this->without_array()->is_interface() ||
   1820           this->fields.array->is_array())
   1821          return this->length * this->fields.array->varying_count();
   1822       else
   1823          return this->fields.array->varying_count();
   1824    default:
   1825       assert(!"unsupported varying type");
   1826       return 0;
   1827    }
   1828 }
   1829 
   1830 bool
   1831 glsl_type::can_implicitly_convert_to(const glsl_type *desired,
   1832                                      _mesa_glsl_parse_state *state) const
   1833 {
   1834    if (this == desired)
   1835       return true;
   1836 
   1837    /* GLSL 1.10 and ESSL do not allow implicit conversions. If there is no
   1838     * state, we're doing intra-stage function linking where these checks have
   1839     * already been done.
   1840     */
   1841    if (state && !state->has_implicit_conversions())
   1842       return false;
   1843 
   1844    /* There is no conversion among matrix types. */
   1845    if (this->matrix_columns > 1 || desired->matrix_columns > 1)
   1846       return false;
   1847 
   1848    /* Vector size must match. */
   1849    if (this->vector_elements != desired->vector_elements)
   1850       return false;
   1851 
   1852    /* int and uint can be converted to float. */
   1853    if (desired->is_float() && this->is_integer_32())
   1854       return true;
   1855 
   1856    /* With GLSL 4.0, ARB_gpu_shader5, or MESA_shader_integer_functions, int
   1857     * can be converted to uint.  Note that state may be NULL here, when
   1858     * resolving function calls in the linker. By this time, all the
   1859     * state-dependent checks have already happened though, so allow anything
   1860     * that's allowed in any shader version.
   1861     */
   1862    if ((!state || state->has_implicit_int_to_uint_conversion()) &&
   1863          desired->base_type == GLSL_TYPE_UINT && this->base_type == GLSL_TYPE_INT)
   1864       return true;
   1865 
   1866    /* No implicit conversions from double. */
   1867    if ((!state || state->has_double()) && this->is_double())
   1868       return false;
   1869 
   1870    /* Conversions from different types to double. */
   1871    if ((!state || state->has_double()) && desired->is_double()) {
   1872       if (this->is_float())
   1873          return true;
   1874       if (this->is_integer_32())
   1875          return true;
   1876    }
   1877 
   1878    return false;
   1879 }
   1880 
   1881 unsigned
   1882 glsl_type::std140_base_alignment(bool row_major) const
   1883 {
   1884    unsigned N = is_64bit() ? 8 : 4;
   1885 
   1886    /* (1) If the member is a scalar consuming <N> basic machine units, the
   1887     *     base alignment is <N>.
   1888     *
   1889     * (2) If the member is a two- or four-component vector with components
   1890     *     consuming <N> basic machine units, the base alignment is 2<N> or
   1891     *     4<N>, respectively.
   1892     *
   1893     * (3) If the member is a three-component vector with components consuming
   1894     *     <N> basic machine units, the base alignment is 4<N>.
   1895     */
   1896    if (this->is_scalar() || this->is_vector()) {
   1897       switch (this->vector_elements) {
   1898       case 1:
   1899          return N;
   1900       case 2:
   1901          return 2 * N;
   1902       case 3:
   1903       case 4:
   1904          return 4 * N;
   1905       }
   1906    }
   1907 
   1908    /* (4) If the member is an array of scalars or vectors, the base alignment
   1909     *     and array stride are set to match the base alignment of a single
   1910     *     array element, according to rules (1), (2), and (3), and rounded up
   1911     *     to the base alignment of a vec4. The array may have padding at the
   1912     *     end; the base offset of the member following the array is rounded up
   1913     *     to the next multiple of the base alignment.
   1914     *
   1915     * (6) If the member is an array of <S> column-major matrices with <C>
   1916     *     columns and <R> rows, the matrix is stored identically to a row of
   1917     *     <S>*<C> column vectors with <R> components each, according to rule
   1918     *     (4).
   1919     *
   1920     * (8) If the member is an array of <S> row-major matrices with <C> columns
   1921     *     and <R> rows, the matrix is stored identically to a row of <S>*<R>
   1922     *     row vectors with <C> components each, according to rule (4).
   1923     *
   1924     * (10) If the member is an array of <S> structures, the <S> elements of
   1925     *      the array are laid out in order, according to rule (9).
   1926     */
   1927    if (this->is_array()) {
   1928       if (this->fields.array->is_scalar() ||
   1929           this->fields.array->is_vector() ||
   1930           this->fields.array->is_matrix()) {
   1931          return MAX2(this->fields.array->std140_base_alignment(row_major), 16);
   1932       } else {
   1933          assert(this->fields.array->is_struct() ||
   1934                 this->fields.array->is_array());
   1935          return this->fields.array->std140_base_alignment(row_major);
   1936       }
   1937    }
   1938 
   1939    /* (5) If the member is a column-major matrix with <C> columns and
   1940     *     <R> rows, the matrix is stored identically to an array of
   1941     *     <C> column vectors with <R> components each, according to
   1942     *     rule (4).
   1943     *
   1944     * (7) If the member is a row-major matrix with <C> columns and <R>
   1945     *     rows, the matrix is stored identically to an array of <R>
   1946     *     row vectors with <C> components each, according to rule (4).
   1947     */
   1948    if (this->is_matrix()) {
   1949       const struct glsl_type *vec_type, *array_type;
   1950       int c = this->matrix_columns;
   1951       int r = this->vector_elements;
   1952 
   1953       if (row_major) {
   1954          vec_type = get_instance(base_type, c, 1);
   1955          array_type = glsl_type::get_array_instance(vec_type, r);
   1956       } else {
   1957          vec_type = get_instance(base_type, r, 1);
   1958          array_type = glsl_type::get_array_instance(vec_type, c);
   1959       }
   1960 
   1961       return array_type->std140_base_alignment(false);
   1962    }
   1963 
   1964    /* (9) If the member is a structure, the base alignment of the
   1965     *     structure is <N>, where <N> is the largest base alignment
   1966     *     value of any of its members, and rounded up to the base
   1967     *     alignment of a vec4. The individual members of this
   1968     *     sub-structure are then assigned offsets by applying this set
   1969     *     of rules recursively, where the base offset of the first
   1970     *     member of the sub-structure is equal to the aligned offset
   1971     *     of the structure. The structure may have padding at the end;
   1972     *     the base offset of the member following the sub-structure is
   1973     *     rounded up to the next multiple of the base alignment of the
   1974     *     structure.
   1975     */
   1976    if (this->is_struct()) {
   1977       unsigned base_alignment = 16;
   1978       for (unsigned i = 0; i < this->length; i++) {
   1979          bool field_row_major = row_major;
   1980          const enum glsl_matrix_layout matrix_layout =
   1981             glsl_matrix_layout(this->fields.structure[i].matrix_layout);
   1982          if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) {
   1983             field_row_major = true;
   1984          } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) {
   1985             field_row_major = false;
   1986          }
   1987 
   1988          const struct glsl_type *field_type = this->fields.structure[i].type;
   1989          base_alignment = MAX2(base_alignment,
   1990                                field_type->std140_base_alignment(field_row_major));
   1991       }
   1992       return base_alignment;
   1993    }
   1994 
   1995    assert(!"not reached");
   1996    return -1;
   1997 }
   1998 
   1999 unsigned
   2000 glsl_type::std140_size(bool row_major) const
   2001 {
   2002    unsigned N = is_64bit() ? 8 : 4;
   2003 
   2004    /* (1) If the member is a scalar consuming <N> basic machine units, the
   2005     *     base alignment is <N>.
   2006     *
   2007     * (2) If the member is a two- or four-component vector with components
   2008     *     consuming <N> basic machine units, the base alignment is 2<N> or
   2009     *     4<N>, respectively.
   2010     *
   2011     * (3) If the member is a three-component vector with components consuming
   2012     *     <N> basic machine units, the base alignment is 4<N>.
   2013     */
   2014    if (this->is_scalar() || this->is_vector()) {
   2015       assert(this->explicit_stride == 0);
   2016       return this->vector_elements * N;
   2017    }
   2018 
   2019    /* (5) If the member is a column-major matrix with <C> columns and
   2020     *     <R> rows, the matrix is stored identically to an array of
   2021     *     <C> column vectors with <R> components each, according to
   2022     *     rule (4).
   2023     *
   2024     * (6) If the member is an array of <S> column-major matrices with <C>
   2025     *     columns and <R> rows, the matrix is stored identically to a row of
   2026     *     <S>*<C> column vectors with <R> components each, according to rule
   2027     *     (4).
   2028     *
   2029     * (7) If the member is a row-major matrix with <C> columns and <R>
   2030     *     rows, the matrix is stored identically to an array of <R>
   2031     *     row vectors with <C> components each, according to rule (4).
   2032     *
   2033     * (8) If the member is an array of <S> row-major matrices with <C> columns
   2034     *     and <R> rows, the matrix is stored identically to a row of <S>*<R>
   2035     *     row vectors with <C> components each, according to rule (4).
   2036     */
   2037    if (this->without_array()->is_matrix()) {
   2038       const struct glsl_type *element_type;
   2039       const struct glsl_type *vec_type;
   2040       unsigned int array_len;
   2041 
   2042       if (this->is_array()) {
   2043          element_type = this->without_array();
   2044          array_len = this->arrays_of_arrays_size();
   2045       } else {
   2046          element_type = this;
   2047          array_len = 1;
   2048       }
   2049 
   2050       if (row_major) {
   2051          vec_type = get_instance(element_type->base_type,
   2052                                  element_type->matrix_columns, 1);
   2053 
   2054          array_len *= element_type->vector_elements;
   2055       } else {
   2056          vec_type = get_instance(element_type->base_type,
   2057                                  element_type->vector_elements, 1);
   2058          array_len *= element_type->matrix_columns;
   2059       }
   2060       const glsl_type *array_type = glsl_type::get_array_instance(vec_type,
   2061                                                                   array_len);
   2062 
   2063       return array_type->std140_size(false);
   2064    }
   2065 
   2066    /* (4) If the member is an array of scalars or vectors, the base alignment
   2067     *     and array stride are set to match the base alignment of a single
   2068     *     array element, according to rules (1), (2), and (3), and rounded up
   2069     *     to the base alignment of a vec4. The array may have padding at the
   2070     *     end; the base offset of the member following the array is rounded up
   2071     *     to the next multiple of the base alignment.
   2072     *
   2073     * (10) If the member is an array of <S> structures, the <S> elements of
   2074     *      the array are laid out in order, according to rule (9).
   2075     */
   2076    if (this->is_array()) {
   2077       unsigned stride;
   2078       if (this->without_array()->is_struct()) {
   2079 	 stride = this->without_array()->std140_size(row_major);
   2080       } else {
   2081 	 unsigned element_base_align =
   2082 	    this->without_array()->std140_base_alignment(row_major);
   2083          stride = MAX2(element_base_align, 16);
   2084       }
   2085 
   2086       unsigned size = this->arrays_of_arrays_size() * stride;
   2087       assert(this->explicit_stride == 0 ||
   2088              size == this->length * this->explicit_stride);
   2089       return size;
   2090    }
   2091 
   2092    /* (9) If the member is a structure, the base alignment of the
   2093     *     structure is <N>, where <N> is the largest base alignment
   2094     *     value of any of its members, and rounded up to the base
   2095     *     alignment of a vec4. The individual members of this
   2096     *     sub-structure are then assigned offsets by applying this set
   2097     *     of rules recursively, where the base offset of the first
   2098     *     member of the sub-structure is equal to the aligned offset
   2099     *     of the structure. The structure may have padding at the end;
   2100     *     the base offset of the member following the sub-structure is
   2101     *     rounded up to the next multiple of the base alignment of the
   2102     *     structure.
   2103     */
   2104    if (this->is_struct() || this->is_interface()) {
   2105       unsigned size = 0;
   2106       unsigned max_align = 0;
   2107 
   2108       for (unsigned i = 0; i < this->length; i++) {
   2109          bool field_row_major = row_major;
   2110          const enum glsl_matrix_layout matrix_layout =
   2111             glsl_matrix_layout(this->fields.structure[i].matrix_layout);
   2112          if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) {
   2113             field_row_major = true;
   2114          } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) {
   2115             field_row_major = false;
   2116          }
   2117 
   2118          const struct glsl_type *field_type = this->fields.structure[i].type;
   2119          unsigned align = field_type->std140_base_alignment(field_row_major);
   2120 
   2121          /* Ignore unsized arrays when calculating size */
   2122          if (field_type->is_unsized_array())
   2123             continue;
   2124 
   2125          size = glsl_align(size, align);
   2126          size += field_type->std140_size(field_row_major);
   2127 
   2128          max_align = MAX2(align, max_align);
   2129 
   2130          if (field_type->is_struct() && (i + 1 < this->length))
   2131             size = glsl_align(size, 16);
   2132       }
   2133       size = glsl_align(size, MAX2(max_align, 16));
   2134       return size;
   2135    }
   2136 
   2137    assert(!"not reached");
   2138    return -1;
   2139 }
   2140 
   2141 const glsl_type *
   2142 glsl_type::get_explicit_std140_type(bool row_major) const
   2143 {
   2144    if (this->is_vector() || this->is_scalar()) {
   2145       return this;
   2146    } else if (this->is_matrix()) {
   2147       const glsl_type *vec_type;
   2148       if (row_major)
   2149          vec_type = get_instance(this->base_type, this->matrix_columns, 1);
   2150       else
   2151          vec_type = get_instance(this->base_type, this->vector_elements, 1);
   2152       unsigned elem_size = vec_type->std140_size(false);
   2153       unsigned stride = glsl_align(elem_size, 16);
   2154       return get_instance(this->base_type, this->vector_elements,
   2155                           this->matrix_columns, stride, row_major);
   2156    } else if (this->is_array()) {
   2157       unsigned elem_size = this->fields.array->std140_size(row_major);
   2158       const glsl_type *elem_type =
   2159          this->fields.array->get_explicit_std140_type(row_major);
   2160       unsigned stride = glsl_align(elem_size, 16);
   2161       return get_array_instance(elem_type, this->length, stride);
   2162    } else if (this->is_struct() || this->is_interface()) {
   2163       glsl_struct_field *fields = new glsl_struct_field[this->length];
   2164       unsigned offset = 0;
   2165       for (unsigned i = 0; i < length; i++) {
   2166          fields[i] = this->fields.structure[i];
   2167 
   2168          bool field_row_major = row_major;
   2169          if (fields[i].matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) {
   2170             field_row_major = false;
   2171          } else if (fields[i].matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) {
   2172             field_row_major = true;
   2173          }
   2174          fields[i].type =
   2175             fields[i].type->get_explicit_std140_type(field_row_major);
   2176 
   2177          unsigned fsize = fields[i].type->std140_size(field_row_major);
   2178          unsigned falign = fields[i].type->std140_base_alignment(field_row_major);
   2179          /* From the GLSL 460 spec section "Uniform and Shader Storage Block
   2180           * Layout Qualifiers":
   2181           *
   2182           *    "The actual offset of a member is computed as follows: If
   2183           *    offset was declared, start with that offset, otherwise start
   2184           *    with the next available offset. If the resulting offset is not
   2185           *    a multiple of the actual alignment, increase it to the first
   2186           *    offset that is a multiple of the actual alignment. This results
   2187           *    in the actual offset the member will have."
   2188           */
   2189          if (fields[i].offset >= 0) {
   2190             assert((unsigned)fields[i].offset >= offset);
   2191             offset = fields[i].offset;
   2192          }
   2193          offset = glsl_align(offset, falign);
   2194          fields[i].offset = offset;
   2195          offset += fsize;
   2196       }
   2197 
   2198       const glsl_type *type;
   2199       if (this->is_struct())
   2200          type = get_struct_instance(fields, this->length, this->name);
   2201       else
   2202          type = get_interface_instance(fields, this->length,
   2203                                        (enum glsl_interface_packing)this->interface_packing,
   2204                                        this->interface_row_major,
   2205                                        this->name);
   2206 
   2207       delete[] fields;
   2208       return type;
   2209    } else {
   2210       unreachable("Invalid type for UBO or SSBO");
   2211    }
   2212 }
   2213 
   2214 unsigned
   2215 glsl_type::std430_base_alignment(bool row_major) const
   2216 {
   2217 
   2218    unsigned N = is_64bit() ? 8 : 4;
   2219 
   2220    /* (1) If the member is a scalar consuming <N> basic machine units, the
   2221     *     base alignment is <N>.
   2222     *
   2223     * (2) If the member is a two- or four-component vector with components
   2224     *     consuming <N> basic machine units, the base alignment is 2<N> or
   2225     *     4<N>, respectively.
   2226     *
   2227     * (3) If the member is a three-component vector with components consuming
   2228     *     <N> basic machine units, the base alignment is 4<N>.
   2229     */
   2230    if (this->is_scalar() || this->is_vector()) {
   2231       switch (this->vector_elements) {
   2232       case 1:
   2233          return N;
   2234       case 2:
   2235          return 2 * N;
   2236       case 3:
   2237       case 4:
   2238          return 4 * N;
   2239       }
   2240    }
   2241 
   2242    /* OpenGL 4.30 spec, section 7.6.2.2 "Standard Uniform Block Layout":
   2243     *
   2244     * "When using the std430 storage layout, shader storage blocks will be
   2245     * laid out in buffer storage identically to uniform and shader storage
   2246     * blocks using the std140 layout, except that the base alignment and
   2247     * stride of arrays of scalars and vectors in rule 4 and of structures
   2248     * in rule 9 are not rounded up a multiple of the base alignment of a vec4.
   2249     */
   2250 
   2251    /* (1) If the member is a scalar consuming <N> basic machine units, the
   2252     *     base alignment is <N>.
   2253     *
   2254     * (2) If the member is a two- or four-component vector with components
   2255     *     consuming <N> basic machine units, the base alignment is 2<N> or
   2256     *     4<N>, respectively.
   2257     *
   2258     * (3) If the member is a three-component vector with components consuming
   2259     *     <N> basic machine units, the base alignment is 4<N>.
   2260     */
   2261    if (this->is_array())
   2262       return this->fields.array->std430_base_alignment(row_major);
   2263 
   2264    /* (5) If the member is a column-major matrix with <C> columns and
   2265     *     <R> rows, the matrix is stored identically to an array of
   2266     *     <C> column vectors with <R> components each, according to
   2267     *     rule (4).
   2268     *
   2269     * (7) If the member is a row-major matrix with <C> columns and <R>
   2270     *     rows, the matrix is stored identically to an array of <R>
   2271     *     row vectors with <C> components each, according to rule (4).
   2272     */
   2273    if (this->is_matrix()) {
   2274       const struct glsl_type *vec_type, *array_type;
   2275       int c = this->matrix_columns;
   2276       int r = this->vector_elements;
   2277 
   2278       if (row_major) {
   2279          vec_type = get_instance(base_type, c, 1);
   2280          array_type = glsl_type::get_array_instance(vec_type, r);
   2281       } else {
   2282          vec_type = get_instance(base_type, r, 1);
   2283          array_type = glsl_type::get_array_instance(vec_type, c);
   2284       }
   2285 
   2286       return array_type->std430_base_alignment(false);
   2287    }
   2288 
   2289       /* (9) If the member is a structure, the base alignment of the
   2290     *     structure is <N>, where <N> is the largest base alignment
   2291     *     value of any of its members, and rounded up to the base
   2292     *     alignment of a vec4. The individual members of this
   2293     *     sub-structure are then assigned offsets by applying this set
   2294     *     of rules recursively, where the base offset of the first
   2295     *     member of the sub-structure is equal to the aligned offset
   2296     *     of the structure. The structure may have padding at the end;
   2297     *     the base offset of the member following the sub-structure is
   2298     *     rounded up to the next multiple of the base alignment of the
   2299     *     structure.
   2300     */
   2301    if (this->is_struct()) {
   2302       unsigned base_alignment = 0;
   2303       for (unsigned i = 0; i < this->length; i++) {
   2304          bool field_row_major = row_major;
   2305          const enum glsl_matrix_layout matrix_layout =
   2306             glsl_matrix_layout(this->fields.structure[i].matrix_layout);
   2307          if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) {
   2308             field_row_major = true;
   2309          } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) {
   2310             field_row_major = false;
   2311          }
   2312 
   2313          const struct glsl_type *field_type = this->fields.structure[i].type;
   2314          base_alignment = MAX2(base_alignment,
   2315                                field_type->std430_base_alignment(field_row_major));
   2316       }
   2317       assert(base_alignment > 0);
   2318       return base_alignment;
   2319    }
   2320    assert(!"not reached");
   2321    return -1;
   2322 }
   2323 
   2324 unsigned
   2325 glsl_type::std430_array_stride(bool row_major) const
   2326 {
   2327    unsigned N = is_64bit() ? 8 : 4;
   2328 
   2329    /* Notice that the array stride of a vec3 is not 3 * N but 4 * N.
   2330     * See OpenGL 4.30 spec, section 7.6.2.2 "Standard Uniform Block Layout"
   2331     *
   2332     * (3) If the member is a three-component vector with components consuming
   2333     *     <N> basic machine units, the base alignment is 4<N>.
   2334     */
   2335    if (this->is_vector() && this->vector_elements == 3)
   2336       return 4 * N;
   2337 
   2338    /* By default use std430_size(row_major) */
   2339    unsigned stride = this->std430_size(row_major);
   2340    assert(this->explicit_stride == 0 || this->explicit_stride == stride);
   2341    return stride;
   2342 }
   2343 
   2344 /* Note that the value returned by this method is only correct if the
   2345  * explit offset, and stride values are set, so only with SPIR-V shaders.
   2346  * Should not be used with GLSL shaders.
   2347  */
   2348 
   2349 unsigned
   2350 glsl_type::explicit_size(bool align_to_stride) const
   2351 {
   2352    if (this->is_struct() || this->is_interface()) {
   2353       if (this->length > 0) {
   2354          unsigned size = 0;
   2355 
   2356          for (unsigned i = 0; i < this->length; i++) {
   2357             assert(this->fields.structure[i].offset >= 0);
   2358             unsigned last_byte = this->fields.structure[i].offset +
   2359                this->fields.structure[i].type->explicit_size();
   2360             size = MAX2(size, last_byte);
   2361          }
   2362 
   2363          return size;
   2364       } else {
   2365          return 0;
   2366       }
   2367    } else if (this->is_array()) {
   2368       /* From ARB_program_interface_query spec:
   2369        *
   2370        *   "For the property of BUFFER_DATA_SIZE, then the implementation-dependent
   2371        *   minimum total buffer object size, in basic machine units, required to
   2372        *   hold all active variables associated with an active uniform block, shader
   2373        *   storage block, or atomic counter buffer is written to <params>.  If the
   2374        *   final member of an active shader storage block is array with no declared
   2375        *   size, the minimum buffer size is computed assuming the array was declared
   2376        *   as an array with one element."
   2377        *
   2378        */
   2379       if (this->is_unsized_array())
   2380          return this->explicit_stride;
   2381 
   2382       assert(this->length > 0);
   2383       unsigned elem_size = align_to_stride ? this->explicit_stride : this->fields.array->explicit_size();
   2384       assert(this->explicit_stride >= elem_size);
   2385 
   2386       return this->explicit_stride * (this->length - 1) + elem_size;
   2387    } else if (this->is_matrix()) {
   2388       const struct glsl_type *elem_type;
   2389       unsigned length;
   2390 
   2391       if (this->interface_row_major) {
   2392          elem_type = get_instance(this->base_type,
   2393                                   this->matrix_columns, 1);
   2394          length = this->vector_elements;
   2395       } else {
   2396          elem_type = get_instance(this->base_type,
   2397                                   this->vector_elements, 1);
   2398          length = this->matrix_columns;
   2399       }
   2400 
   2401       unsigned elem_size = align_to_stride ? this->explicit_stride : elem_type->explicit_size();
   2402 
   2403       assert(this->explicit_stride);
   2404       return this->explicit_stride * (length - 1) + elem_size;
   2405    }
   2406 
   2407    unsigned N = this->bit_size() / 8;
   2408 
   2409    return this->vector_elements * N;
   2410 }
   2411 
   2412 unsigned
   2413 glsl_type::std430_size(bool row_major) const
   2414 {
   2415    unsigned N = is_64bit() ? 8 : 4;
   2416 
   2417    /* OpenGL 4.30 spec, section 7.6.2.2 "Standard Uniform Block Layout":
   2418     *
   2419     * "When using the std430 storage layout, shader storage blocks will be
   2420     * laid out in buffer storage identically to uniform and shader storage
   2421     * blocks using the std140 layout, except that the base alignment and
   2422     * stride of arrays of scalars and vectors in rule 4 and of structures
   2423     * in rule 9 are not rounded up a multiple of the base alignment of a vec4.
   2424     */
   2425    if (this->is_scalar() || this->is_vector()) {
   2426       assert(this->explicit_stride == 0);
   2427       return this->vector_elements * N;
   2428    }
   2429 
   2430    if (this->without_array()->is_matrix()) {
   2431       const struct glsl_type *element_type;
   2432       const struct glsl_type *vec_type;
   2433       unsigned int array_len;
   2434 
   2435       if (this->is_array()) {
   2436          element_type = this->without_array();
   2437          array_len = this->arrays_of_arrays_size();
   2438       } else {
   2439          element_type = this;
   2440          array_len = 1;
   2441       }
   2442 
   2443       if (row_major) {
   2444          vec_type = get_instance(element_type->base_type,
   2445                                  element_type->matrix_columns, 1);
   2446 
   2447          array_len *= element_type->vector_elements;
   2448       } else {
   2449          vec_type = get_instance(element_type->base_type,
   2450                                  element_type->vector_elements, 1);
   2451          array_len *= element_type->matrix_columns;
   2452       }
   2453       const glsl_type *array_type = glsl_type::get_array_instance(vec_type,
   2454                                                                   array_len);
   2455 
   2456       return array_type->std430_size(false);
   2457    }
   2458 
   2459    if (this->is_array()) {
   2460       unsigned stride;
   2461       if (this->without_array()->is_struct())
   2462          stride = this->without_array()->std430_size(row_major);
   2463       else
   2464          stride = this->without_array()->std430_base_alignment(row_major);
   2465 
   2466       unsigned size = this->arrays_of_arrays_size() * stride;
   2467       assert(this->explicit_stride == 0 ||
   2468              size == this->length * this->explicit_stride);
   2469       return size;
   2470    }
   2471 
   2472    if (this->is_struct() || this->is_interface()) {
   2473       unsigned size = 0;
   2474       unsigned max_align = 0;
   2475 
   2476       for (unsigned i = 0; i < this->length; i++) {
   2477          bool field_row_major = row_major;
   2478          const enum glsl_matrix_layout matrix_layout =
   2479             glsl_matrix_layout(this->fields.structure[i].matrix_layout);
   2480          if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) {
   2481             field_row_major = true;
   2482          } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) {
   2483             field_row_major = false;
   2484          }
   2485 
   2486          const struct glsl_type *field_type = this->fields.structure[i].type;
   2487          unsigned align = field_type->std430_base_alignment(field_row_major);
   2488          size = glsl_align(size, align);
   2489          size += field_type->std430_size(field_row_major);
   2490 
   2491          max_align = MAX2(align, max_align);
   2492       }
   2493       size = glsl_align(size, max_align);
   2494       return size;
   2495    }
   2496 
   2497    assert(!"not reached");
   2498    return -1;
   2499 }
   2500 
   2501 const glsl_type *
   2502 glsl_type::get_explicit_std430_type(bool row_major) const
   2503 {
   2504    if (this->is_vector() || this->is_scalar()) {
   2505       return this;
   2506    } else if (this->is_matrix()) {
   2507       const glsl_type *vec_type;
   2508       if (row_major)
   2509          vec_type = get_instance(this->base_type, this->matrix_columns, 1);
   2510       else
   2511          vec_type = get_instance(this->base_type, this->vector_elements, 1);
   2512       unsigned stride = vec_type->std430_array_stride(false);
   2513       return get_instance(this->base_type, this->vector_elements,
   2514                           this->matrix_columns, stride, row_major);
   2515    } else if (this->is_array()) {
   2516       const glsl_type *elem_type =
   2517          this->fields.array->get_explicit_std430_type(row_major);
   2518       unsigned stride = this->fields.array->std430_array_stride(row_major);
   2519       return get_array_instance(elem_type, this->length, stride);
   2520    } else if (this->is_struct() || this->is_interface()) {
   2521       glsl_struct_field *fields = new glsl_struct_field[this->length];
   2522       unsigned offset = 0;
   2523       for (unsigned i = 0; i < length; i++) {
   2524          fields[i] = this->fields.structure[i];
   2525 
   2526          bool field_row_major = row_major;
   2527          if (fields[i].matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) {
   2528             field_row_major = false;
   2529          } else if (fields[i].matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) {
   2530             field_row_major = true;
   2531          }
   2532          fields[i].type =
   2533             fields[i].type->get_explicit_std430_type(field_row_major);
   2534 
   2535          unsigned fsize = fields[i].type->std430_size(field_row_major);
   2536          unsigned falign = fields[i].type->std430_base_alignment(field_row_major);
   2537          /* From the GLSL 460 spec section "Uniform and Shader Storage Block
   2538           * Layout Qualifiers":
   2539           *
   2540           *    "The actual offset of a member is computed as follows: If
   2541           *    offset was declared, start with that offset, otherwise start
   2542           *    with the next available offset. If the resulting offset is not
   2543           *    a multiple of the actual alignment, increase it to the first
   2544           *    offset that is a multiple of the actual alignment. This results
   2545           *    in the actual offset the member will have."
   2546           */
   2547          if (fields[i].offset >= 0) {
   2548             assert((unsigned)fields[i].offset >= offset);
   2549             offset = fields[i].offset;
   2550          }
   2551          offset = glsl_align(offset, falign);
   2552          fields[i].offset = offset;
   2553          offset += fsize;
   2554       }
   2555 
   2556       const glsl_type *type;
   2557       if (this->is_struct())
   2558          type = get_struct_instance(fields, this->length, this->name);
   2559       else
   2560          type = get_interface_instance(fields, this->length,
   2561                                        (enum glsl_interface_packing)this->interface_packing,
   2562                                        this->interface_row_major,
   2563                                        this->name);
   2564 
   2565       delete[] fields;
   2566       return type;
   2567    } else {
   2568       unreachable("Invalid type for SSBO");
   2569    }
   2570 }
   2571 
   2572 const glsl_type *
   2573 glsl_type::get_explicit_interface_type(bool supports_std430) const
   2574 {
   2575    enum glsl_interface_packing packing =
   2576       this->get_internal_ifc_packing(supports_std430);
   2577    if (packing == GLSL_INTERFACE_PACKING_STD140) {
   2578       return this->get_explicit_std140_type(this->interface_row_major);
   2579    } else {
   2580       assert(packing == GLSL_INTERFACE_PACKING_STD430);
   2581       return this->get_explicit_std430_type(this->interface_row_major);
   2582    }
   2583 }
   2584 
   2585 static unsigned
   2586 explicit_type_scalar_byte_size(const glsl_type *type)
   2587 {
   2588    if (type->base_type == GLSL_TYPE_BOOL)
   2589       return 4;
   2590    else
   2591       return glsl_base_type_get_bit_size(type->base_type) / 8;
   2592 }
   2593 
   2594 /* This differs from get_explicit_std430_type() in that it:
   2595  * - can size arrays slightly smaller ("stride * (len - 1) + elem_size" instead
   2596  *   of "stride * len")
   2597  * - consumes a glsl_type_size_align_func which allows 8 and 16-bit values to be
   2598  *   packed more tightly
   2599  * - overrides any struct field offsets but get_explicit_std430_type() tries to
   2600  *   respect any existing ones
   2601  */
   2602 const glsl_type *
   2603 glsl_type::get_explicit_type_for_size_align(glsl_type_size_align_func type_info,
   2604                                             unsigned *size, unsigned *alignment) const
   2605 {
   2606    if (this->is_image() || this->is_sampler()) {
   2607       type_info(this, size, alignment);
   2608       assert(*alignment > 0);
   2609       return this;
   2610    } else if (this->is_scalar()) {
   2611       type_info(this, size, alignment);
   2612       assert(*size == explicit_type_scalar_byte_size(this));
   2613       assert(*alignment == explicit_type_scalar_byte_size(this));
   2614       return this;
   2615    } else if (this->is_vector()) {
   2616       type_info(this, size, alignment);
   2617       assert(*alignment > 0);
   2618       assert(*alignment % explicit_type_scalar_byte_size(this) == 0);
   2619       return glsl_type::get_instance(this->base_type, this->vector_elements,
   2620                                      1, 0, false, *alignment);
   2621    } else if (this->is_array()) {
   2622       unsigned elem_size, elem_align;
   2623       const struct glsl_type *explicit_element =
   2624          this->fields.array->get_explicit_type_for_size_align(type_info, &elem_size, &elem_align);
   2625 
   2626       unsigned stride = align(elem_size, elem_align);
   2627 
   2628       *size = stride * (this->length - 1) + elem_size;
   2629       *alignment = elem_align;
   2630       return glsl_type::get_array_instance(explicit_element, this->length, stride);
   2631    } else if (this->is_struct() || this->is_interface()) {
   2632       struct glsl_struct_field *fields = (struct glsl_struct_field *)
   2633          malloc(sizeof(struct glsl_struct_field) * this->length);
   2634 
   2635       *size = 0;
   2636       *alignment = 0;
   2637       for (unsigned i = 0; i < this->length; i++) {
   2638          fields[i] = this->fields.structure[i];
   2639          assert(fields[i].matrix_layout != GLSL_MATRIX_LAYOUT_ROW_MAJOR);
   2640 
   2641          unsigned field_size, field_align;
   2642          fields[i].type =
   2643             fields[i].type->get_explicit_type_for_size_align(type_info, &field_size, &field_align);
   2644          field_align = this->packed ? 1 : field_align;
   2645          fields[i].offset = align(*size, field_align);
   2646 
   2647          *size = fields[i].offset + field_size;
   2648          *alignment = MAX2(*alignment, field_align);
   2649       }
   2650 
   2651       const glsl_type *type;
   2652       if (this->is_struct()) {
   2653          type = get_struct_instance(fields, this->length, this->name,
   2654                                     this->packed, *alignment);
   2655       } else {
   2656          assert(!this->packed);
   2657          type = get_interface_instance(fields, this->length,
   2658                                        (enum glsl_interface_packing)this->interface_packing,
   2659                                        this->interface_row_major,
   2660                                        this->name);
   2661       }
   2662       free(fields);
   2663       return type;
   2664    } else if (this->is_matrix()) {
   2665       unsigned col_size, col_align;
   2666       type_info(this->column_type(), &col_size, &col_align);
   2667       unsigned stride = align(col_size, col_align);
   2668 
   2669       *size = this->matrix_columns * stride;
   2670       /* Matrix and column alignments match. See glsl_type::column_type() */
   2671       assert(col_align > 0);
   2672       *alignment = col_align;
   2673       return glsl_type::get_instance(this->base_type, this->vector_elements,
   2674                                      this->matrix_columns, stride, false, *alignment);
   2675    } else {
   2676       unreachable("Unhandled type.");
   2677    }
   2678 }
   2679 
   2680 const glsl_type *
   2681 glsl_type::replace_vec3_with_vec4() const
   2682 {
   2683    if (this->is_scalar() || this->is_vector() || this->is_matrix()) {
   2684       if (this->interface_row_major) {
   2685          if (this->matrix_columns == 3) {
   2686             return glsl_type::get_instance(this->base_type,
   2687                                            this->vector_elements,
   2688                                            4, /* matrix columns */
   2689                                            this->explicit_stride,
   2690                                            this->interface_row_major,
   2691                                            this->explicit_alignment);
   2692          } else {
   2693             return this;
   2694          }
   2695       } else {
   2696          if (this->vector_elements == 3) {
   2697             return glsl_type::get_instance(this->base_type,
   2698                                            4, /* vector elements */
   2699                                            this->matrix_columns,
   2700                                            this->explicit_stride,
   2701                                            this->interface_row_major,
   2702                                            this->explicit_alignment);
   2703          } else {
   2704             return this;
   2705          }
   2706       }
   2707    } else if (this->is_array()) {
   2708       const glsl_type *vec4_elem_type =
   2709          this->fields.array->replace_vec3_with_vec4();
   2710       if (vec4_elem_type == this->fields.array)
   2711          return this;
   2712       return glsl_type::get_array_instance(vec4_elem_type,
   2713                                            this->length,
   2714                                            this->explicit_stride);
   2715    } else if (this->is_struct() || this->is_interface()) {
   2716       struct glsl_struct_field *fields = (struct glsl_struct_field *)
   2717          malloc(sizeof(struct glsl_struct_field) * this->length);
   2718 
   2719       bool needs_new_type = false;
   2720       for (unsigned i = 0; i < this->length; i++) {
   2721          fields[i] = this->fields.structure[i];
   2722          assert(fields[i].matrix_layout != GLSL_MATRIX_LAYOUT_ROW_MAJOR);
   2723          fields[i].type = fields[i].type->replace_vec3_with_vec4();
   2724          if (fields[i].type != this->fields.structure[i].type)
   2725             needs_new_type = true;
   2726       }
   2727 
   2728       const glsl_type *type;
   2729       if (!needs_new_type) {
   2730          type = this;
   2731       } else if (this->is_struct()) {
   2732          type = get_struct_instance(fields, this->length, this->name,
   2733                                     this->packed, this->explicit_alignment);
   2734       } else {
   2735          assert(!this->packed);
   2736          type = get_interface_instance(fields, this->length,
   2737                                        (enum glsl_interface_packing)this->interface_packing,
   2738                                        this->interface_row_major,
   2739                                        this->name);
   2740       }
   2741       free(fields);
   2742       return type;
   2743    } else {
   2744       unreachable("Unhandled type.");
   2745    }
   2746 }
   2747 
   2748 unsigned
   2749 glsl_type::count_vec4_slots(bool is_gl_vertex_input, bool is_bindless) const
   2750 {
   2751    /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec:
   2752     *
   2753     *     "A scalar input counts the same amount against this limit as a vec4,
   2754     *     so applications may want to consider packing groups of four
   2755     *     unrelated float inputs together into a vector to better utilize the
   2756     *     capabilities of the underlying hardware. A matrix input will use up
   2757     *     multiple locations.  The number of locations used will equal the
   2758     *     number of columns in the matrix."
   2759     *
   2760     * The spec does not explicitly say how arrays are counted.  However, it
   2761     * should be safe to assume the total number of slots consumed by an array
   2762     * is the number of entries in the array multiplied by the number of slots
   2763     * consumed by a single element of the array.
   2764     *
   2765     * The spec says nothing about how structs are counted, because vertex
   2766     * attributes are not allowed to be (or contain) structs.  However, Mesa
   2767     * allows varying structs, the number of varying slots taken up by a
   2768     * varying struct is simply equal to the sum of the number of slots taken
   2769     * up by each element.
   2770     *
   2771     * Doubles are counted different depending on whether they are vertex
   2772     * inputs or everything else. Vertex inputs from ARB_vertex_attrib_64bit
   2773     * take one location no matter what size they are, otherwise dvec3/4
   2774     * take two locations.
   2775     */
   2776    switch (this->base_type) {
   2777    case GLSL_TYPE_UINT:
   2778    case GLSL_TYPE_INT:
   2779    case GLSL_TYPE_UINT8:
   2780    case GLSL_TYPE_INT8:
   2781    case GLSL_TYPE_UINT16:
   2782    case GLSL_TYPE_INT16:
   2783    case GLSL_TYPE_FLOAT:
   2784    case GLSL_TYPE_FLOAT16:
   2785    case GLSL_TYPE_BOOL:
   2786       return this->matrix_columns;
   2787    case GLSL_TYPE_DOUBLE:
   2788    case GLSL_TYPE_UINT64:
   2789    case GLSL_TYPE_INT64:
   2790       if (this->vector_elements > 2 && !is_gl_vertex_input)
   2791          return this->matrix_columns * 2;
   2792       else
   2793          return this->matrix_columns;
   2794    case GLSL_TYPE_STRUCT:
   2795    case GLSL_TYPE_INTERFACE: {
   2796       unsigned size = 0;
   2797 
   2798       for (unsigned i = 0; i < this->length; i++) {
   2799          const glsl_type *member_type = this->fields.structure[i].type;
   2800          size += member_type->count_vec4_slots(is_gl_vertex_input, is_bindless);
   2801       }
   2802 
   2803       return size;
   2804    }
   2805 
   2806    case GLSL_TYPE_ARRAY: {
   2807       const glsl_type *element = this->fields.array;
   2808       return this->length * element->count_vec4_slots(is_gl_vertex_input,
   2809                                                       is_bindless);
   2810    }
   2811 
   2812    case GLSL_TYPE_SAMPLER:
   2813    case GLSL_TYPE_IMAGE:
   2814       if (!is_bindless)
   2815          return 0;
   2816       else
   2817          return 1;
   2818 
   2819    case GLSL_TYPE_SUBROUTINE:
   2820       return 1;
   2821 
   2822    case GLSL_TYPE_FUNCTION:
   2823    case GLSL_TYPE_ATOMIC_UINT:
   2824    case GLSL_TYPE_VOID:
   2825    case GLSL_TYPE_ERROR:
   2826       break;
   2827    }
   2828 
   2829    assert(!"Unexpected type in count_attribute_slots()");
   2830 
   2831    return 0;
   2832 }
   2833 
   2834 unsigned
   2835 glsl_type::count_dword_slots(bool is_bindless) const
   2836 {
   2837    switch (this->base_type) {
   2838    case GLSL_TYPE_UINT:
   2839    case GLSL_TYPE_INT:
   2840    case GLSL_TYPE_FLOAT:
   2841    case GLSL_TYPE_BOOL:
   2842       return this->components();
   2843    case GLSL_TYPE_UINT16:
   2844    case GLSL_TYPE_INT16:
   2845    case GLSL_TYPE_FLOAT16:
   2846       return DIV_ROUND_UP(this->components(), 2);
   2847    case GLSL_TYPE_UINT8:
   2848    case GLSL_TYPE_INT8:
   2849       return DIV_ROUND_UP(this->components(), 4);
   2850    case GLSL_TYPE_IMAGE:
   2851    case GLSL_TYPE_SAMPLER:
   2852       if (!is_bindless)
   2853          return 0;
   2854       FALLTHROUGH;
   2855    case GLSL_TYPE_DOUBLE:
   2856    case GLSL_TYPE_UINT64:
   2857    case GLSL_TYPE_INT64:
   2858       return this->components() * 2;
   2859    case GLSL_TYPE_ARRAY:
   2860       return this->fields.array->count_dword_slots(is_bindless) *
   2861              this->length;
   2862 
   2863    case GLSL_TYPE_INTERFACE:
   2864    case GLSL_TYPE_STRUCT: {
   2865       unsigned size = 0;
   2866       for (unsigned i = 0; i < this->length; i++) {
   2867          size += this->fields.structure[i].type->count_dword_slots(is_bindless);
   2868       }
   2869       return size;
   2870    }
   2871 
   2872    case GLSL_TYPE_ATOMIC_UINT:
   2873       return 0;
   2874    case GLSL_TYPE_SUBROUTINE:
   2875       return 1;
   2876    case GLSL_TYPE_VOID:
   2877    case GLSL_TYPE_ERROR:
   2878    case GLSL_TYPE_FUNCTION:
   2879    default:
   2880       unreachable("invalid type in st_glsl_type_dword_size()");
   2881    }
   2882 
   2883    return 0;
   2884 }
   2885 
   2886 int
   2887 glsl_type::coordinate_components() const
   2888 {
   2889    enum glsl_sampler_dim dim = (enum glsl_sampler_dim)sampler_dimensionality;
   2890    int size = glsl_get_sampler_dim_coordinate_components(dim);
   2891 
   2892    /* Array textures need an additional component for the array index, except
   2893     * for cubemap array images that behave like a 2D array of interleaved
   2894     * cubemap faces.
   2895     */
   2896    if (sampler_array &&
   2897        !(is_image() && sampler_dimensionality == GLSL_SAMPLER_DIM_CUBE))
   2898       size += 1;
   2899 
   2900    return size;
   2901 }
   2902 
   2903 /**
   2904  * Declarations of type flyweights (glsl_type::_foo_type) and
   2905  * convenience pointers (glsl_type::foo_type).
   2906  * @{
   2907  */
   2908 #define DECL_TYPE(NAME, ...)                                    \
   2909    const glsl_type glsl_type::_##NAME##_type = glsl_type(__VA_ARGS__, #NAME); \
   2910    const glsl_type *const glsl_type::NAME##_type = &glsl_type::_##NAME##_type;
   2911 
   2912 #define STRUCT_TYPE(NAME)
   2913 
   2914 #include "compiler/builtin_type_macros.h"
   2915 /** @} */
   2916 
   2917 union packed_type {
   2918    uint32_t u32;
   2919    struct {
   2920       unsigned base_type:5;
   2921       unsigned interface_row_major:1;
   2922       unsigned vector_elements:3;
   2923       unsigned matrix_columns:3;
   2924       unsigned explicit_stride:16;
   2925       unsigned explicit_alignment:4;
   2926    } basic;
   2927    struct {
   2928       unsigned base_type:5;
   2929       unsigned dimensionality:4;
   2930       unsigned shadow:1;
   2931       unsigned array:1;
   2932       unsigned sampled_type:5;
   2933       unsigned _pad:16;
   2934    } sampler;
   2935    struct {
   2936       unsigned base_type:5;
   2937       unsigned length:13;
   2938       unsigned explicit_stride:14;
   2939    } array;
   2940    struct {
   2941       unsigned base_type:5;
   2942       unsigned interface_packing_or_packed:2;
   2943       unsigned interface_row_major:1;
   2944       unsigned length:20;
   2945       unsigned explicit_alignment:4;
   2946    } strct;
   2947 };
   2948 
   2949 static void
   2950 encode_glsl_struct_field(blob *blob, const glsl_struct_field *struct_field)
   2951 {
   2952    encode_type_to_blob(blob, struct_field->type);
   2953    blob_write_string(blob, struct_field->name);
   2954    blob_write_uint32(blob, struct_field->location);
   2955    blob_write_uint32(blob, struct_field->component);
   2956    blob_write_uint32(blob, struct_field->offset);
   2957    blob_write_uint32(blob, struct_field->xfb_buffer);
   2958    blob_write_uint32(blob, struct_field->xfb_stride);
   2959    blob_write_uint32(blob, struct_field->image_format);
   2960    blob_write_uint32(blob, struct_field->flags);
   2961 }
   2962 
   2963 static void
   2964 decode_glsl_struct_field_from_blob(blob_reader *blob, glsl_struct_field *struct_field)
   2965 {
   2966    struct_field->type = decode_type_from_blob(blob);
   2967    struct_field->name = blob_read_string(blob);
   2968    struct_field->location = blob_read_uint32(blob);
   2969    struct_field->component = blob_read_uint32(blob);
   2970    struct_field->offset = blob_read_uint32(blob);
   2971    struct_field->xfb_buffer = blob_read_uint32(blob);
   2972    struct_field->xfb_stride = blob_read_uint32(blob);
   2973    struct_field->image_format = (pipe_format)blob_read_uint32(blob);
   2974    struct_field->flags = blob_read_uint32(blob);
   2975 }
   2976 
   2977 void
   2978 encode_type_to_blob(struct blob *blob, const glsl_type *type)
   2979 {
   2980    if (!type) {
   2981       blob_write_uint32(blob, 0);
   2982       return;
   2983    }
   2984 
   2985    STATIC_ASSERT(sizeof(union packed_type) == 4);
   2986    union packed_type encoded;
   2987    encoded.u32 = 0;
   2988    encoded.basic.base_type = type->base_type;
   2989 
   2990    switch (type->base_type) {
   2991    case GLSL_TYPE_UINT:
   2992    case GLSL_TYPE_INT:
   2993    case GLSL_TYPE_FLOAT:
   2994    case GLSL_TYPE_FLOAT16:
   2995    case GLSL_TYPE_DOUBLE:
   2996    case GLSL_TYPE_UINT8:
   2997    case GLSL_TYPE_INT8:
   2998    case GLSL_TYPE_UINT16:
   2999    case GLSL_TYPE_INT16:
   3000    case GLSL_TYPE_UINT64:
   3001    case GLSL_TYPE_INT64:
   3002    case GLSL_TYPE_BOOL:
   3003       encoded.basic.interface_row_major = type->interface_row_major;
   3004       assert(type->matrix_columns < 8);
   3005       if (type->vector_elements <= 4)
   3006          encoded.basic.vector_elements = type->vector_elements;
   3007       else if (type->vector_elements == 8)
   3008          encoded.basic.vector_elements = 5;
   3009       else if (type->vector_elements == 16)
   3010          encoded.basic.vector_elements = 6;
   3011       encoded.basic.matrix_columns = type->matrix_columns;
   3012       encoded.basic.explicit_stride = MIN2(type->explicit_stride, 0xffff);
   3013       encoded.basic.explicit_alignment =
   3014          MIN2(ffs(type->explicit_alignment), 0xf);
   3015       blob_write_uint32(blob, encoded.u32);
   3016       /* If we don't have enough bits for explicit_stride, store it
   3017        * separately.
   3018        */
   3019       if (encoded.basic.explicit_stride == 0xffff)
   3020          blob_write_uint32(blob, type->explicit_stride);
   3021       if (encoded.basic.explicit_alignment == 0xf)
   3022          blob_write_uint32(blob, type->explicit_alignment);
   3023       return;
   3024    case GLSL_TYPE_SAMPLER:
   3025       encoded.sampler.dimensionality = type->sampler_dimensionality;
   3026       encoded.sampler.shadow = type->sampler_shadow;
   3027       encoded.sampler.array = type->sampler_array;
   3028       encoded.sampler.sampled_type = type->sampled_type;
   3029       break;
   3030    case GLSL_TYPE_SUBROUTINE:
   3031       blob_write_uint32(blob, encoded.u32);
   3032       blob_write_string(blob, type->name);
   3033       return;
   3034    case GLSL_TYPE_IMAGE:
   3035       encoded.sampler.dimensionality = type->sampler_dimensionality;
   3036       encoded.sampler.array = type->sampler_array;
   3037       encoded.sampler.sampled_type = type->sampled_type;
   3038       break;
   3039    case GLSL_TYPE_ATOMIC_UINT:
   3040       break;
   3041    case GLSL_TYPE_ARRAY:
   3042       encoded.array.length = MIN2(type->length, 0x1fff);
   3043       encoded.array.explicit_stride = MIN2(type->explicit_stride, 0x3fff);
   3044       blob_write_uint32(blob, encoded.u32);
   3045       /* If we don't have enough bits for length or explicit_stride, store it
   3046        * separately.
   3047        */
   3048       if (encoded.array.length == 0x1fff)
   3049          blob_write_uint32(blob, type->length);
   3050       if (encoded.array.explicit_stride == 0x3fff)
   3051          blob_write_uint32(blob, type->explicit_stride);
   3052       encode_type_to_blob(blob, type->fields.array);
   3053       return;
   3054    case GLSL_TYPE_STRUCT:
   3055    case GLSL_TYPE_INTERFACE:
   3056       encoded.strct.length = MIN2(type->length, 0xfffff);
   3057       encoded.strct.explicit_alignment =
   3058          MIN2(ffs(type->explicit_alignment), 0xf);
   3059       if (type->is_interface()) {
   3060          encoded.strct.interface_packing_or_packed = type->interface_packing;
   3061          encoded.strct.interface_row_major = type->interface_row_major;
   3062       } else {
   3063          encoded.strct.interface_packing_or_packed = type->packed;
   3064       }
   3065       blob_write_uint32(blob, encoded.u32);
   3066       blob_write_string(blob, type->name);
   3067 
   3068       /* If we don't have enough bits for length, store it separately. */
   3069       if (encoded.strct.length == 0xfffff)
   3070          blob_write_uint32(blob, type->length);
   3071       if (encoded.strct.explicit_alignment == 0xf)
   3072          blob_write_uint32(blob, type->explicit_alignment);
   3073 
   3074       for (unsigned i = 0; i < type->length; i++)
   3075          encode_glsl_struct_field(blob, &type->fields.structure[i]);
   3076       return;
   3077    case GLSL_TYPE_VOID:
   3078       break;
   3079    case GLSL_TYPE_ERROR:
   3080    default:
   3081       assert(!"Cannot encode type!");
   3082       encoded.u32 = 0;
   3083       break;
   3084    }
   3085 
   3086    blob_write_uint32(blob, encoded.u32);
   3087 }
   3088 
   3089 const glsl_type *
   3090 decode_type_from_blob(struct blob_reader *blob)
   3091 {
   3092    union packed_type encoded;
   3093    encoded.u32 = blob_read_uint32(blob);
   3094 
   3095    if (encoded.u32 == 0) {
   3096       return NULL;
   3097    }
   3098 
   3099    glsl_base_type base_type = (glsl_base_type)encoded.basic.base_type;
   3100 
   3101    switch (base_type) {
   3102    case GLSL_TYPE_UINT:
   3103    case GLSL_TYPE_INT:
   3104    case GLSL_TYPE_FLOAT:
   3105    case GLSL_TYPE_FLOAT16:
   3106    case GLSL_TYPE_DOUBLE:
   3107    case GLSL_TYPE_UINT8:
   3108    case GLSL_TYPE_INT8:
   3109    case GLSL_TYPE_UINT16:
   3110    case GLSL_TYPE_INT16:
   3111    case GLSL_TYPE_UINT64:
   3112    case GLSL_TYPE_INT64:
   3113    case GLSL_TYPE_BOOL: {
   3114       unsigned explicit_stride = encoded.basic.explicit_stride;
   3115       if (explicit_stride == 0xffff)
   3116          explicit_stride = blob_read_uint32(blob);
   3117       unsigned explicit_alignment = encoded.basic.explicit_alignment;
   3118       if (explicit_alignment == 0xf)
   3119          explicit_alignment = blob_read_uint32(blob);
   3120       else if (explicit_alignment > 0)
   3121          explicit_alignment = 1 << (explicit_alignment - 1);
   3122       uint32_t vector_elements = encoded.basic.vector_elements;
   3123       if (vector_elements == 5)
   3124          vector_elements = 8;
   3125       else if (vector_elements == 6)
   3126          vector_elements = 16;
   3127       return glsl_type::get_instance(base_type, encoded.basic.vector_elements,
   3128                                      encoded.basic.matrix_columns,
   3129                                      explicit_stride,
   3130                                      encoded.basic.interface_row_major,
   3131                                      explicit_alignment);
   3132    }
   3133    case GLSL_TYPE_SAMPLER:
   3134       return glsl_type::get_sampler_instance((enum glsl_sampler_dim)encoded.sampler.dimensionality,
   3135                                              encoded.sampler.shadow,
   3136                                              encoded.sampler.array,
   3137                                              (glsl_base_type) encoded.sampler.sampled_type);
   3138    case GLSL_TYPE_SUBROUTINE:
   3139       return glsl_type::get_subroutine_instance(blob_read_string(blob));
   3140    case GLSL_TYPE_IMAGE:
   3141       return glsl_type::get_image_instance((enum glsl_sampler_dim)encoded.sampler.dimensionality,
   3142                                            encoded.sampler.array,
   3143                                            (glsl_base_type) encoded.sampler.sampled_type);
   3144    case GLSL_TYPE_ATOMIC_UINT:
   3145       return glsl_type::atomic_uint_type;
   3146    case GLSL_TYPE_ARRAY: {
   3147       unsigned length = encoded.array.length;
   3148       if (length == 0x1fff)
   3149          length = blob_read_uint32(blob);
   3150       unsigned explicit_stride = encoded.array.explicit_stride;
   3151       if (explicit_stride == 0x3fff)
   3152          explicit_stride = blob_read_uint32(blob);
   3153       return glsl_type::get_array_instance(decode_type_from_blob(blob),
   3154                                            length, explicit_stride);
   3155    }
   3156    case GLSL_TYPE_STRUCT:
   3157    case GLSL_TYPE_INTERFACE: {
   3158       char *name = blob_read_string(blob);
   3159       unsigned num_fields = encoded.strct.length;
   3160       if (num_fields == 0xfffff)
   3161          num_fields = blob_read_uint32(blob);
   3162       unsigned explicit_alignment = encoded.strct.explicit_alignment;
   3163       if (explicit_alignment == 0xf)
   3164          explicit_alignment = blob_read_uint32(blob);
   3165       else if (explicit_alignment > 0)
   3166          explicit_alignment = 1 << (explicit_alignment - 1);
   3167 
   3168       glsl_struct_field *fields =
   3169          (glsl_struct_field *) malloc(sizeof(glsl_struct_field) * num_fields);
   3170       for (unsigned i = 0; i < num_fields; i++)
   3171          decode_glsl_struct_field_from_blob(blob, &fields[i]);
   3172 
   3173       const glsl_type *t;
   3174       if (base_type == GLSL_TYPE_INTERFACE) {
   3175          assert(explicit_alignment == 0);
   3176          enum glsl_interface_packing packing =
   3177             (glsl_interface_packing) encoded.strct.interface_packing_or_packed;
   3178          bool row_major = encoded.strct.interface_row_major;
   3179          t = glsl_type::get_interface_instance(fields, num_fields, packing,
   3180                                                row_major, name);
   3181       } else {
   3182          unsigned packed = encoded.strct.interface_packing_or_packed;
   3183          t = glsl_type::get_struct_instance(fields, num_fields, name, packed,
   3184                                             explicit_alignment);
   3185       }
   3186 
   3187       free(fields);
   3188       return t;
   3189    }
   3190    case GLSL_TYPE_VOID:
   3191       return glsl_type::void_type;
   3192    case GLSL_TYPE_ERROR:
   3193    default:
   3194       assert(!"Cannot decode type!");
   3195       return NULL;
   3196    }
   3197 }
   3198 
   3199 unsigned
   3200 glsl_type::cl_alignment() const
   3201 {
   3202    /* vectors unlike arrays are aligned to their size */
   3203    if (this->is_scalar() || this->is_vector())
   3204       return this->cl_size();
   3205    else if (this->is_array())
   3206       return this->without_array()->cl_alignment();
   3207    else if (this->is_struct()) {
   3208       /* Packed Structs are 0x1 aligned despite their size. */
   3209       if (this->packed)
   3210          return 1;
   3211 
   3212       unsigned res = 1;
   3213       for (unsigned i = 0; i < this->length; ++i) {
   3214          struct glsl_struct_field &field = this->fields.structure[i];
   3215          res = MAX2(res, field.type->cl_alignment());
   3216       }
   3217       return res;
   3218    }
   3219    return 1;
   3220 }
   3221 
   3222 unsigned
   3223 glsl_type::cl_size() const
   3224 {
   3225    if (this->is_scalar() || this->is_vector()) {
   3226       return util_next_power_of_two(this->vector_elements) *
   3227              explicit_type_scalar_byte_size(this);
   3228    } else if (this->is_array()) {
   3229       unsigned size = this->without_array()->cl_size();
   3230       return size * this->length;
   3231    } else if (this->is_struct()) {
   3232       unsigned size = 0;
   3233       for (unsigned i = 0; i < this->length; ++i) {
   3234          struct glsl_struct_field &field = this->fields.structure[i];
   3235          /* if a struct is packed, members don't get aligned */
   3236          if (!this->packed)
   3237             size = align(size, field.type->cl_alignment());
   3238          size += field.type->cl_size();
   3239       }
   3240       return size;
   3241    }
   3242    return 1;
   3243 }
   3244 
   3245 extern "C" {
   3246 
   3247 int
   3248 glsl_get_sampler_dim_coordinate_components(enum glsl_sampler_dim dim)
   3249 {
   3250    switch (dim) {
   3251    case GLSL_SAMPLER_DIM_1D:
   3252    case GLSL_SAMPLER_DIM_BUF:
   3253       return 1;
   3254    case GLSL_SAMPLER_DIM_2D:
   3255    case GLSL_SAMPLER_DIM_RECT:
   3256    case GLSL_SAMPLER_DIM_MS:
   3257    case GLSL_SAMPLER_DIM_EXTERNAL:
   3258    case GLSL_SAMPLER_DIM_SUBPASS:
   3259    case GLSL_SAMPLER_DIM_SUBPASS_MS:
   3260       return 2;
   3261    case GLSL_SAMPLER_DIM_3D:
   3262    case GLSL_SAMPLER_DIM_CUBE:
   3263       return 3;
   3264    default:
   3265       unreachable("Unknown sampler dim");
   3266    }
   3267 }
   3268 
   3269 void
   3270 glsl_print_type(FILE *f, const glsl_type *t)
   3271 {
   3272    if (t->is_array()) {
   3273       fprintf(f, "(array ");
   3274       glsl_print_type(f, t->fields.array);
   3275       fprintf(f, " %u)", t->length);
   3276    } else if (t->is_struct() && !is_gl_identifier(t->name)) {
   3277       fprintf(f, "%s@%p", t->name, (void *) t);
   3278    } else {
   3279       fprintf(f, "%s", t->name);
   3280    }
   3281 }
   3282 
   3283 }
   3284