Home | History | Annotate | 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 
     30 
     31 mtx_t glsl_type::hash_mutex = _MTX_INITIALIZER_NP;
     32 hash_table *glsl_type::array_types = NULL;
     33 hash_table *glsl_type::record_types = NULL;
     34 hash_table *glsl_type::interface_types = NULL;
     35 hash_table *glsl_type::function_types = NULL;
     36 hash_table *glsl_type::subroutine_types = NULL;
     37 
     38 glsl_type::glsl_type(GLenum gl_type,
     39                      glsl_base_type base_type, unsigned vector_elements,
     40                      unsigned matrix_columns, const char *name) :
     41    gl_type(gl_type),
     42    base_type(base_type), sampled_type(GLSL_TYPE_VOID),
     43    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
     44    interface_packing(0), interface_row_major(0),
     45    vector_elements(vector_elements), matrix_columns(matrix_columns),
     46    length(0)
     47 {
     48    /* Values of these types must fit in the two bits of
     49     * glsl_type::sampled_type.
     50     */
     51    STATIC_ASSERT((unsigned(GLSL_TYPE_UINT)  & 3) == unsigned(GLSL_TYPE_UINT));
     52    STATIC_ASSERT((unsigned(GLSL_TYPE_INT)   & 3) == unsigned(GLSL_TYPE_INT));
     53    STATIC_ASSERT((unsigned(GLSL_TYPE_FLOAT) & 3) == unsigned(GLSL_TYPE_FLOAT));
     54 
     55    ASSERT_BITFIELD_SIZE(glsl_type, base_type, GLSL_TYPE_ERROR);
     56    ASSERT_BITFIELD_SIZE(glsl_type, sampled_type, GLSL_TYPE_ERROR);
     57    ASSERT_BITFIELD_SIZE(glsl_type, sampler_dimensionality,
     58                         GLSL_SAMPLER_DIM_SUBPASS_MS);
     59 
     60    this->mem_ctx = ralloc_context(NULL);
     61    assert(this->mem_ctx != NULL);
     62 
     63    assert(name != NULL);
     64    this->name = ralloc_strdup(this->mem_ctx, name);
     65 
     66    /* Neither dimension is zero or both dimensions are zero.
     67     */
     68    assert((vector_elements == 0) == (matrix_columns == 0));
     69    memset(& fields, 0, sizeof(fields));
     70 }
     71 
     72 glsl_type::glsl_type(GLenum gl_type, glsl_base_type base_type,
     73                      enum glsl_sampler_dim dim, bool shadow, bool array,
     74                      glsl_base_type type, const char *name) :
     75    gl_type(gl_type),
     76    base_type(base_type), sampled_type(type),
     77    sampler_dimensionality(dim), sampler_shadow(shadow),
     78    sampler_array(array), interface_packing(0),
     79    interface_row_major(0), length(0)
     80 {
     81    this->mem_ctx = ralloc_context(NULL);
     82    assert(this->mem_ctx != NULL);
     83 
     84    assert(name != NULL);
     85    this->name = ralloc_strdup(this->mem_ctx, name);
     86 
     87    memset(& fields, 0, sizeof(fields));
     88 
     89    matrix_columns = vector_elements = 1;
     90 }
     91 
     92 glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
     93                      const char *name) :
     94    gl_type(0),
     95    base_type(GLSL_TYPE_STRUCT), sampled_type(GLSL_TYPE_VOID),
     96    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
     97    interface_packing(0), interface_row_major(0),
     98    vector_elements(0), matrix_columns(0),
     99    length(num_fields)
    100 {
    101    unsigned int i;
    102 
    103    this->mem_ctx = ralloc_context(NULL);
    104    assert(this->mem_ctx != NULL);
    105 
    106    assert(name != NULL);
    107    this->name = ralloc_strdup(this->mem_ctx, name);
    108    this->fields.structure = ralloc_array(this->mem_ctx,
    109                                          glsl_struct_field, length);
    110 
    111    for (i = 0; i < length; i++) {
    112       this->fields.structure[i] = fields[i];
    113       this->fields.structure[i].name = ralloc_strdup(this->fields.structure,
    114                                                      fields[i].name);
    115    }
    116 }
    117 
    118 glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
    119                      enum glsl_interface_packing packing,
    120                      bool row_major, const char *name) :
    121    gl_type(0),
    122    base_type(GLSL_TYPE_INTERFACE), sampled_type(GLSL_TYPE_VOID),
    123    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
    124    interface_packing((unsigned) packing),
    125    interface_row_major((unsigned) row_major),
    126    vector_elements(0), matrix_columns(0),
    127    length(num_fields)
    128 {
    129    unsigned int i;
    130 
    131    this->mem_ctx = ralloc_context(NULL);
    132    assert(this->mem_ctx != NULL);
    133 
    134    assert(name != NULL);
    135    this->name = ralloc_strdup(this->mem_ctx, name);
    136    this->fields.structure = rzalloc_array(this->mem_ctx,
    137                                           glsl_struct_field, length);
    138    for (i = 0; i < length; i++) {
    139       this->fields.structure[i] = fields[i];
    140       this->fields.structure[i].name = ralloc_strdup(this->fields.structure,
    141                                                      fields[i].name);
    142    }
    143 }
    144 
    145 glsl_type::glsl_type(const glsl_type *return_type,
    146                      const glsl_function_param *params, unsigned num_params) :
    147    gl_type(0),
    148    base_type(GLSL_TYPE_FUNCTION), sampled_type(GLSL_TYPE_VOID),
    149    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
    150    interface_packing(0), interface_row_major(0),
    151    vector_elements(0), matrix_columns(0),
    152    length(num_params)
    153 {
    154    unsigned int i;
    155 
    156    this->mem_ctx = ralloc_context(NULL);
    157    assert(this->mem_ctx != NULL);
    158 
    159    this->fields.parameters = rzalloc_array(this->mem_ctx,
    160                                            glsl_function_param, num_params + 1);
    161 
    162    /* We store the return type as the first parameter */
    163    this->fields.parameters[0].type = return_type;
    164    this->fields.parameters[0].in = false;
    165    this->fields.parameters[0].out = true;
    166 
    167    /* We store the i'th parameter in slot i+1 */
    168    for (i = 0; i < length; i++) {
    169       this->fields.parameters[i + 1].type = params[i].type;
    170       this->fields.parameters[i + 1].in = params[i].in;
    171       this->fields.parameters[i + 1].out = params[i].out;
    172    }
    173 }
    174 
    175 glsl_type::glsl_type(const char *subroutine_name) :
    176    gl_type(0),
    177    base_type(GLSL_TYPE_SUBROUTINE), sampled_type(GLSL_TYPE_VOID),
    178    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
    179    interface_packing(0), interface_row_major(0),
    180    vector_elements(1), matrix_columns(1),
    181    length(0)
    182 {
    183    this->mem_ctx = ralloc_context(NULL);
    184    assert(this->mem_ctx != NULL);
    185 
    186    assert(subroutine_name != NULL);
    187    this->name = ralloc_strdup(this->mem_ctx, subroutine_name);
    188 }
    189 
    190 glsl_type::~glsl_type()
    191 {
    192     ralloc_free(this->mem_ctx);
    193 }
    194 
    195 bool
    196 glsl_type::contains_sampler() const
    197 {
    198    if (this->is_array()) {
    199       return this->fields.array->contains_sampler();
    200    } else if (this->is_record() || this->is_interface()) {
    201       for (unsigned int i = 0; i < this->length; i++) {
    202          if (this->fields.structure[i].type->contains_sampler())
    203             return true;
    204       }
    205       return false;
    206    } else {
    207       return this->is_sampler();
    208    }
    209 }
    210 
    211 bool
    212 glsl_type::contains_array() const
    213 {
    214    if (this->is_record() || this->is_interface()) {
    215       for (unsigned int i = 0; i < this->length; i++) {
    216          if (this->fields.structure[i].type->contains_array())
    217             return true;
    218       }
    219       return false;
    220    } else {
    221       return this->is_array();
    222    }
    223 }
    224 
    225 bool
    226 glsl_type::contains_integer() const
    227 {
    228    if (this->is_array()) {
    229       return this->fields.array->contains_integer();
    230    } else if (this->is_record() || this->is_interface()) {
    231       for (unsigned int i = 0; i < this->length; i++) {
    232          if (this->fields.structure[i].type->contains_integer())
    233             return true;
    234       }
    235       return false;
    236    } else {
    237       return this->is_integer();
    238    }
    239 }
    240 
    241 bool
    242 glsl_type::contains_double() const
    243 {
    244    if (this->is_array()) {
    245       return this->fields.array->contains_double();
    246    } else if (this->is_record() || this->is_interface()) {
    247       for (unsigned int i = 0; i < this->length; i++) {
    248          if (this->fields.structure[i].type->contains_double())
    249             return true;
    250       }
    251       return false;
    252    } else {
    253       return this->is_double();
    254    }
    255 }
    256 
    257 bool
    258 glsl_type::contains_opaque() const {
    259    switch (base_type) {
    260    case GLSL_TYPE_SAMPLER:
    261    case GLSL_TYPE_IMAGE:
    262    case GLSL_TYPE_ATOMIC_UINT:
    263       return true;
    264    case GLSL_TYPE_ARRAY:
    265       return fields.array->contains_opaque();
    266    case GLSL_TYPE_STRUCT:
    267    case GLSL_TYPE_INTERFACE:
    268       for (unsigned int i = 0; i < length; i++) {
    269          if (fields.structure[i].type->contains_opaque())
    270             return true;
    271       }
    272       return false;
    273    default:
    274       return false;
    275    }
    276 }
    277 
    278 bool
    279 glsl_type::contains_subroutine() const
    280 {
    281    if (this->is_array()) {
    282       return this->fields.array->contains_subroutine();
    283    } else if (this->is_record() || this->is_interface()) {
    284       for (unsigned int i = 0; i < this->length; i++) {
    285          if (this->fields.structure[i].type->contains_subroutine())
    286             return true;
    287       }
    288       return false;
    289    } else {
    290       return this->is_subroutine();
    291    }
    292 }
    293 
    294 gl_texture_index
    295 glsl_type::sampler_index() const
    296 {
    297    const glsl_type *const t = (this->is_array()) ? this->fields.array : this;
    298 
    299    assert(t->is_sampler() || t->is_image());
    300 
    301    switch (t->sampler_dimensionality) {
    302    case GLSL_SAMPLER_DIM_1D:
    303       return (t->sampler_array) ? TEXTURE_1D_ARRAY_INDEX : TEXTURE_1D_INDEX;
    304    case GLSL_SAMPLER_DIM_2D:
    305       return (t->sampler_array) ? TEXTURE_2D_ARRAY_INDEX : TEXTURE_2D_INDEX;
    306    case GLSL_SAMPLER_DIM_3D:
    307       return TEXTURE_3D_INDEX;
    308    case GLSL_SAMPLER_DIM_CUBE:
    309       return (t->sampler_array) ? TEXTURE_CUBE_ARRAY_INDEX : TEXTURE_CUBE_INDEX;
    310    case GLSL_SAMPLER_DIM_RECT:
    311       return TEXTURE_RECT_INDEX;
    312    case GLSL_SAMPLER_DIM_BUF:
    313       return TEXTURE_BUFFER_INDEX;
    314    case GLSL_SAMPLER_DIM_EXTERNAL:
    315       return TEXTURE_EXTERNAL_INDEX;
    316    case GLSL_SAMPLER_DIM_MS:
    317       return (t->sampler_array) ? TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX : TEXTURE_2D_MULTISAMPLE_INDEX;
    318    default:
    319       assert(!"Should not get here.");
    320       return TEXTURE_BUFFER_INDEX;
    321    }
    322 }
    323 
    324 bool
    325 glsl_type::contains_image() const
    326 {
    327    if (this->is_array()) {
    328       return this->fields.array->contains_image();
    329    } else if (this->is_record() || this->is_interface()) {
    330       for (unsigned int i = 0; i < this->length; i++) {
    331          if (this->fields.structure[i].type->contains_image())
    332             return true;
    333       }
    334       return false;
    335    } else {
    336       return this->is_image();
    337    }
    338 }
    339 
    340 const glsl_type *glsl_type::get_base_type() const
    341 {
    342    switch (base_type) {
    343    case GLSL_TYPE_UINT:
    344       return uint_type;
    345    case GLSL_TYPE_UINT16:
    346       return uint16_t_type;
    347    case GLSL_TYPE_INT:
    348       return int_type;
    349    case GLSL_TYPE_INT16:
    350       return int16_t_type;
    351    case GLSL_TYPE_FLOAT:
    352       return float_type;
    353    case GLSL_TYPE_FLOAT16:
    354       return float16_t_type;
    355    case GLSL_TYPE_DOUBLE:
    356       return double_type;
    357    case GLSL_TYPE_BOOL:
    358       return bool_type;
    359    case GLSL_TYPE_UINT64:
    360       return uint64_t_type;
    361    case GLSL_TYPE_INT64:
    362       return int64_t_type;
    363    default:
    364       return error_type;
    365    }
    366 }
    367 
    368 
    369 const glsl_type *glsl_type::get_scalar_type() const
    370 {
    371    const glsl_type *type = this;
    372 
    373    /* Handle arrays */
    374    while (type->base_type == GLSL_TYPE_ARRAY)
    375       type = type->fields.array;
    376 
    377    /* Handle vectors and matrices */
    378    switch (type->base_type) {
    379    case GLSL_TYPE_UINT:
    380       return uint_type;
    381    case GLSL_TYPE_UINT16:
    382       return uint16_t_type;
    383    case GLSL_TYPE_INT:
    384       return int_type;
    385    case GLSL_TYPE_INT16:
    386       return int16_t_type;
    387    case GLSL_TYPE_FLOAT:
    388       return float_type;
    389    case GLSL_TYPE_FLOAT16:
    390       return float16_t_type;
    391    case GLSL_TYPE_DOUBLE:
    392       return double_type;
    393    case GLSL_TYPE_BOOL:
    394       return bool_type;
    395    case GLSL_TYPE_UINT64:
    396       return uint64_t_type;
    397    case GLSL_TYPE_INT64:
    398       return int64_t_type;
    399    default:
    400       /* Handle everything else */
    401       return type;
    402    }
    403 }
    404 
    405 
    406 static void
    407 hash_free_type_function(struct hash_entry *entry)
    408 {
    409    glsl_type *type = (glsl_type *) entry->data;
    410 
    411    if (type->is_array())
    412       free((void*)entry->key);
    413 
    414    delete type;
    415 }
    416 
    417 void
    418 _mesa_glsl_release_types(void)
    419 {
    420    /* Should only be called during atexit (either when unloading shared
    421     * object, or if process terminates), so no mutex-locking should be
    422     * necessary.
    423     */
    424    if (glsl_type::array_types != NULL) {
    425       _mesa_hash_table_destroy(glsl_type::array_types, hash_free_type_function);
    426       glsl_type::array_types = NULL;
    427    }
    428 
    429    if (glsl_type::record_types != NULL) {
    430       _mesa_hash_table_destroy(glsl_type::record_types, hash_free_type_function);
    431       glsl_type::record_types = NULL;
    432    }
    433 
    434    if (glsl_type::interface_types != NULL) {
    435       _mesa_hash_table_destroy(glsl_type::interface_types, hash_free_type_function);
    436       glsl_type::interface_types = NULL;
    437    }
    438 
    439    if (glsl_type::function_types != NULL) {
    440       _mesa_hash_table_destroy(glsl_type::function_types, hash_free_type_function);
    441       glsl_type::function_types = NULL;
    442    }
    443 
    444    if (glsl_type::subroutine_types != NULL) {
    445       _mesa_hash_table_destroy(glsl_type::subroutine_types, hash_free_type_function);
    446       glsl_type::subroutine_types = NULL;
    447    }
    448 }
    449 
    450 
    451 glsl_type::glsl_type(const glsl_type *array, unsigned length) :
    452    base_type(GLSL_TYPE_ARRAY), sampled_type(GLSL_TYPE_VOID),
    453    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
    454    interface_packing(0), interface_row_major(0),
    455    vector_elements(0), matrix_columns(0),
    456    length(length), name(NULL)
    457 {
    458    this->fields.array = array;
    459    /* Inherit the gl type of the base. The GL type is used for
    460     * uniform/statevar handling in Mesa and the arrayness of the type
    461     * is represented by the size rather than the type.
    462     */
    463    this->gl_type = array->gl_type;
    464 
    465    /* Allow a maximum of 10 characters for the array size.  This is enough
    466     * for 32-bits of ~0.  The extra 3 are for the '[', ']', and terminating
    467     * NUL.
    468     */
    469    const unsigned name_length = strlen(array->name) + 10 + 3;
    470 
    471    this->mem_ctx = ralloc_context(NULL);
    472    assert(this->mem_ctx != NULL);
    473 
    474    char *const n = (char *) ralloc_size(this->mem_ctx, name_length);
    475 
    476    if (length == 0)
    477       snprintf(n, name_length, "%s[]", array->name);
    478    else {
    479       /* insert outermost dimensions in the correct spot
    480        * otherwise the dimension order will be backwards
    481        */
    482       const char *pos = strchr(array->name, '[');
    483       if (pos) {
    484          int idx = pos - array->name;
    485          snprintf(n, idx+1, "%s", array->name);
    486          snprintf(n + idx, name_length - idx, "[%u]%s",
    487                   length, array->name + idx);
    488       } else {
    489          snprintf(n, name_length, "%s[%u]", array->name, length);
    490       }
    491    }
    492 
    493    this->name = n;
    494 }
    495 
    496 
    497 const glsl_type *
    498 glsl_type::vec(unsigned components)
    499 {
    500    if (components == 0 || components > 4)
    501       return error_type;
    502 
    503    static const glsl_type *const ts[] = {
    504       float_type, vec2_type, vec3_type, vec4_type
    505    };
    506    return ts[components - 1];
    507 }
    508 
    509 const glsl_type *
    510 glsl_type::f16vec(unsigned components)
    511 {
    512    if (components == 0 || components > 4)
    513       return error_type;
    514 
    515    static const glsl_type *const ts[] = {
    516       float16_t_type, f16vec2_type, f16vec3_type, f16vec4_type
    517    };
    518    return ts[components - 1];
    519 }
    520 
    521 const glsl_type *
    522 glsl_type::dvec(unsigned components)
    523 {
    524    if (components == 0 || components > 4)
    525       return error_type;
    526 
    527    static const glsl_type *const ts[] = {
    528       double_type, dvec2_type, dvec3_type, dvec4_type
    529    };
    530    return ts[components - 1];
    531 }
    532 
    533 const glsl_type *
    534 glsl_type::ivec(unsigned components)
    535 {
    536    if (components == 0 || components > 4)
    537       return error_type;
    538 
    539    static const glsl_type *const ts[] = {
    540       int_type, ivec2_type, ivec3_type, ivec4_type
    541    };
    542    return ts[components - 1];
    543 }
    544 
    545 
    546 const glsl_type *
    547 glsl_type::uvec(unsigned components)
    548 {
    549    if (components == 0 || components > 4)
    550       return error_type;
    551 
    552    static const glsl_type *const ts[] = {
    553       uint_type, uvec2_type, uvec3_type, uvec4_type
    554    };
    555    return ts[components - 1];
    556 }
    557 
    558 
    559 const glsl_type *
    560 glsl_type::bvec(unsigned components)
    561 {
    562    if (components == 0 || components > 4)
    563       return error_type;
    564 
    565    static const glsl_type *const ts[] = {
    566       bool_type, bvec2_type, bvec3_type, bvec4_type
    567    };
    568    return ts[components - 1];
    569 }
    570 
    571 
    572 const glsl_type *
    573 glsl_type::i64vec(unsigned components)
    574 {
    575    if (components == 0 || components > 4)
    576       return error_type;
    577 
    578    static const glsl_type *const ts[] = {
    579       int64_t_type, i64vec2_type, i64vec3_type, i64vec4_type
    580    };
    581    return ts[components - 1];
    582 }
    583 
    584 
    585 const glsl_type *
    586 glsl_type::u64vec(unsigned components)
    587 {
    588    if (components == 0 || components > 4)
    589       return error_type;
    590 
    591    static const glsl_type *const ts[] = {
    592       uint64_t_type, u64vec2_type, u64vec3_type, u64vec4_type
    593    };
    594    return ts[components - 1];
    595 }
    596 
    597 const glsl_type *
    598 glsl_type::i16vec(unsigned components)
    599 {
    600    if (components == 0 || components > 4)
    601       return error_type;
    602 
    603    static const glsl_type *const ts[] = {
    604       int16_t_type, i16vec2_type, i16vec3_type, i16vec4_type
    605    };
    606    return ts[components - 1];
    607 }
    608 
    609 
    610 const glsl_type *
    611 glsl_type::u16vec(unsigned components)
    612 {
    613    if (components == 0 || components > 4)
    614       return error_type;
    615 
    616    static const glsl_type *const ts[] = {
    617       uint16_t_type, u16vec2_type, u16vec3_type, u16vec4_type
    618    };
    619    return ts[components - 1];
    620 }
    621 
    622 const glsl_type *
    623 glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns)
    624 {
    625    if (base_type == GLSL_TYPE_VOID)
    626       return void_type;
    627 
    628    if ((rows < 1) || (rows > 4) || (columns < 1) || (columns > 4))
    629       return error_type;
    630 
    631    /* Treat GLSL vectors as Nx1 matrices.
    632     */
    633    if (columns == 1) {
    634       switch (base_type) {
    635       case GLSL_TYPE_UINT:
    636          return uvec(rows);
    637       case GLSL_TYPE_INT:
    638          return ivec(rows);
    639       case GLSL_TYPE_FLOAT:
    640          return vec(rows);
    641       case GLSL_TYPE_FLOAT16:
    642          return f16vec(rows);
    643       case GLSL_TYPE_DOUBLE:
    644          return dvec(rows);
    645       case GLSL_TYPE_BOOL:
    646          return bvec(rows);
    647       case GLSL_TYPE_UINT64:
    648          return u64vec(rows);
    649       case GLSL_TYPE_INT64:
    650          return i64vec(rows);
    651       case GLSL_TYPE_UINT16:
    652          return u16vec(rows);
    653       case GLSL_TYPE_INT16:
    654          return i16vec(rows);
    655       default:
    656          return error_type;
    657       }
    658    } else {
    659       if ((base_type != GLSL_TYPE_FLOAT &&
    660            base_type != GLSL_TYPE_DOUBLE &&
    661            base_type != GLSL_TYPE_FLOAT16) || (rows == 1))
    662          return error_type;
    663 
    664       /* GLSL matrix types are named mat{COLUMNS}x{ROWS}.  Only the following
    665        * combinations are valid:
    666        *
    667        *   1 2 3 4
    668        * 1
    669        * 2   x x x
    670        * 3   x x x
    671        * 4   x x x
    672        */
    673 #define IDX(c,r) (((c-1)*3) + (r-1))
    674 
    675       switch (base_type) {
    676       case GLSL_TYPE_DOUBLE: {
    677          switch (IDX(columns, rows)) {
    678          case IDX(2,2): return dmat2_type;
    679          case IDX(2,3): return dmat2x3_type;
    680          case IDX(2,4): return dmat2x4_type;
    681          case IDX(3,2): return dmat3x2_type;
    682          case IDX(3,3): return dmat3_type;
    683          case IDX(3,4): return dmat3x4_type;
    684          case IDX(4,2): return dmat4x2_type;
    685          case IDX(4,3): return dmat4x3_type;
    686          case IDX(4,4): return dmat4_type;
    687          default: return error_type;
    688          }
    689       }
    690       case GLSL_TYPE_FLOAT: {
    691          switch (IDX(columns, rows)) {
    692          case IDX(2,2): return mat2_type;
    693          case IDX(2,3): return mat2x3_type;
    694          case IDX(2,4): return mat2x4_type;
    695          case IDX(3,2): return mat3x2_type;
    696          case IDX(3,3): return mat3_type;
    697          case IDX(3,4): return mat3x4_type;
    698          case IDX(4,2): return mat4x2_type;
    699          case IDX(4,3): return mat4x3_type;
    700          case IDX(4,4): return mat4_type;
    701          default: return error_type;
    702          }
    703       }
    704       case GLSL_TYPE_FLOAT16: {
    705          switch (IDX(columns, rows)) {
    706          case IDX(2,2): return f16mat2_type;
    707          case IDX(2,3): return f16mat2x3_type;
    708          case IDX(2,4): return f16mat2x4_type;
    709          case IDX(3,2): return f16mat3x2_type;
    710          case IDX(3,3): return f16mat3_type;
    711          case IDX(3,4): return f16mat3x4_type;
    712          case IDX(4,2): return f16mat4x2_type;
    713          case IDX(4,3): return f16mat4x3_type;
    714          case IDX(4,4): return f16mat4_type;
    715          default: return error_type;
    716          }
    717       }
    718       default: return error_type;
    719       }
    720    }
    721 
    722    assert(!"Should not get here.");
    723    return error_type;
    724 }
    725 
    726 const glsl_type *
    727 glsl_type::get_sampler_instance(enum glsl_sampler_dim dim,
    728                                 bool shadow,
    729                                 bool array,
    730                                 glsl_base_type type)
    731 {
    732    switch (type) {
    733    case GLSL_TYPE_FLOAT:
    734       switch (dim) {
    735       case GLSL_SAMPLER_DIM_1D:
    736          if (shadow)
    737             return (array ? sampler1DArrayShadow_type : sampler1DShadow_type);
    738          else
    739             return (array ? sampler1DArray_type : sampler1D_type);
    740       case GLSL_SAMPLER_DIM_2D:
    741          if (shadow)
    742             return (array ? sampler2DArrayShadow_type : sampler2DShadow_type);
    743          else
    744             return (array ? sampler2DArray_type : sampler2D_type);
    745       case GLSL_SAMPLER_DIM_3D:
    746          if (shadow || array)
    747             return error_type;
    748          else
    749             return sampler3D_type;
    750       case GLSL_SAMPLER_DIM_CUBE:
    751          if (shadow)
    752             return (array ? samplerCubeArrayShadow_type : samplerCubeShadow_type);
    753          else
    754             return (array ? samplerCubeArray_type : samplerCube_type);
    755       case GLSL_SAMPLER_DIM_RECT:
    756          if (array)
    757             return error_type;
    758          if (shadow)
    759             return sampler2DRectShadow_type;
    760          else
    761             return sampler2DRect_type;
    762       case GLSL_SAMPLER_DIM_BUF:
    763          if (shadow || array)
    764             return error_type;
    765          else
    766             return samplerBuffer_type;
    767       case GLSL_SAMPLER_DIM_MS:
    768          if (shadow)
    769             return error_type;
    770          return (array ? sampler2DMSArray_type : sampler2DMS_type);
    771       case GLSL_SAMPLER_DIM_EXTERNAL:
    772          if (shadow || array)
    773             return error_type;
    774          else
    775             return samplerExternalOES_type;
    776       case GLSL_SAMPLER_DIM_SUBPASS:
    777       case GLSL_SAMPLER_DIM_SUBPASS_MS:
    778          return error_type;
    779       }
    780    case GLSL_TYPE_INT:
    781       if (shadow)
    782          return error_type;
    783       switch (dim) {
    784       case GLSL_SAMPLER_DIM_1D:
    785          return (array ? isampler1DArray_type : isampler1D_type);
    786       case GLSL_SAMPLER_DIM_2D:
    787          return (array ? isampler2DArray_type : isampler2D_type);
    788       case GLSL_SAMPLER_DIM_3D:
    789          if (array)
    790             return error_type;
    791          return isampler3D_type;
    792       case GLSL_SAMPLER_DIM_CUBE:
    793          return (array ? isamplerCubeArray_type : isamplerCube_type);
    794       case GLSL_SAMPLER_DIM_RECT:
    795          if (array)
    796             return error_type;
    797          return isampler2DRect_type;
    798       case GLSL_SAMPLER_DIM_BUF:
    799          if (array)
    800             return error_type;
    801          return isamplerBuffer_type;
    802       case GLSL_SAMPLER_DIM_MS:
    803          return (array ? isampler2DMSArray_type : isampler2DMS_type);
    804       case GLSL_SAMPLER_DIM_EXTERNAL:
    805          return error_type;
    806       case GLSL_SAMPLER_DIM_SUBPASS:
    807       case GLSL_SAMPLER_DIM_SUBPASS_MS:
    808          return error_type;
    809       }
    810    case GLSL_TYPE_UINT:
    811       if (shadow)
    812          return error_type;
    813       switch (dim) {
    814       case GLSL_SAMPLER_DIM_1D:
    815          return (array ? usampler1DArray_type : usampler1D_type);
    816       case GLSL_SAMPLER_DIM_2D:
    817          return (array ? usampler2DArray_type : usampler2D_type);
    818       case GLSL_SAMPLER_DIM_3D:
    819          if (array)
    820             return error_type;
    821          return usampler3D_type;
    822       case GLSL_SAMPLER_DIM_CUBE:
    823          return (array ? usamplerCubeArray_type : usamplerCube_type);
    824       case GLSL_SAMPLER_DIM_RECT:
    825          if (array)
    826             return error_type;
    827          return usampler2DRect_type;
    828       case GLSL_SAMPLER_DIM_BUF:
    829          if (array)
    830             return error_type;
    831          return usamplerBuffer_type;
    832       case GLSL_SAMPLER_DIM_MS:
    833          return (array ? usampler2DMSArray_type : usampler2DMS_type);
    834       case GLSL_SAMPLER_DIM_EXTERNAL:
    835          return error_type;
    836       case GLSL_SAMPLER_DIM_SUBPASS:
    837       case GLSL_SAMPLER_DIM_SUBPASS_MS:
    838          return error_type;
    839       }
    840    default:
    841       return error_type;
    842    }
    843 
    844    unreachable("switch statement above should be complete");
    845 }
    846 
    847 const glsl_type *
    848 glsl_type::get_image_instance(enum glsl_sampler_dim dim,
    849                               bool array, glsl_base_type type)
    850 {
    851    switch (type) {
    852    case GLSL_TYPE_FLOAT:
    853       switch (dim) {
    854       case GLSL_SAMPLER_DIM_1D:
    855          return (array ? image1DArray_type : image1D_type);
    856       case GLSL_SAMPLER_DIM_2D:
    857          return (array ? image2DArray_type : image2D_type);
    858       case GLSL_SAMPLER_DIM_3D:
    859          return image3D_type;
    860       case GLSL_SAMPLER_DIM_CUBE:
    861          return (array ? imageCubeArray_type : imageCube_type);
    862       case GLSL_SAMPLER_DIM_RECT:
    863          if (array)
    864             return error_type;
    865          else
    866             return image2DRect_type;
    867       case GLSL_SAMPLER_DIM_BUF:
    868          if (array)
    869             return error_type;
    870          else
    871             return imageBuffer_type;
    872       case GLSL_SAMPLER_DIM_MS:
    873          return (array ? image2DMSArray_type : image2DMS_type);
    874       case GLSL_SAMPLER_DIM_SUBPASS:
    875          return subpassInput_type;
    876       case GLSL_SAMPLER_DIM_SUBPASS_MS:
    877          return subpassInputMS_type;
    878       case GLSL_SAMPLER_DIM_EXTERNAL:
    879          return error_type;
    880       }
    881    case GLSL_TYPE_INT:
    882       switch (dim) {
    883       case GLSL_SAMPLER_DIM_1D:
    884          return (array ? iimage1DArray_type : iimage1D_type);
    885       case GLSL_SAMPLER_DIM_2D:
    886          return (array ? iimage2DArray_type : iimage2D_type);
    887       case GLSL_SAMPLER_DIM_3D:
    888          if (array)
    889             return error_type;
    890          return iimage3D_type;
    891       case GLSL_SAMPLER_DIM_CUBE:
    892          return (array ? iimageCubeArray_type : iimageCube_type);
    893       case GLSL_SAMPLER_DIM_RECT:
    894          if (array)
    895             return error_type;
    896          return iimage2DRect_type;
    897       case GLSL_SAMPLER_DIM_BUF:
    898          if (array)
    899             return error_type;
    900          return iimageBuffer_type;
    901       case GLSL_SAMPLER_DIM_MS:
    902          return (array ? iimage2DMSArray_type : iimage2DMS_type);
    903       case GLSL_SAMPLER_DIM_SUBPASS:
    904          return isubpassInput_type;
    905       case GLSL_SAMPLER_DIM_SUBPASS_MS:
    906          return isubpassInputMS_type;
    907       case GLSL_SAMPLER_DIM_EXTERNAL:
    908          return error_type;
    909       }
    910    case GLSL_TYPE_UINT:
    911       switch (dim) {
    912       case GLSL_SAMPLER_DIM_1D:
    913          return (array ? uimage1DArray_type : uimage1D_type);
    914       case GLSL_SAMPLER_DIM_2D:
    915          return (array ? uimage2DArray_type : uimage2D_type);
    916       case GLSL_SAMPLER_DIM_3D:
    917          if (array)
    918             return error_type;
    919          return uimage3D_type;
    920       case GLSL_SAMPLER_DIM_CUBE:
    921          return (array ? uimageCubeArray_type : uimageCube_type);
    922       case GLSL_SAMPLER_DIM_RECT:
    923          if (array)
    924             return error_type;
    925          return uimage2DRect_type;
    926       case GLSL_SAMPLER_DIM_BUF:
    927          if (array)
    928             return error_type;
    929          return uimageBuffer_type;
    930       case GLSL_SAMPLER_DIM_MS:
    931          return (array ? uimage2DMSArray_type : uimage2DMS_type);
    932       case GLSL_SAMPLER_DIM_SUBPASS:
    933          return usubpassInput_type;
    934       case GLSL_SAMPLER_DIM_SUBPASS_MS:
    935          return usubpassInputMS_type;
    936       case GLSL_SAMPLER_DIM_EXTERNAL:
    937          return error_type;
    938       }
    939    default:
    940       return error_type;
    941    }
    942 
    943    unreachable("switch statement above should be complete");
    944 }
    945 
    946 const glsl_type *
    947 glsl_type::get_array_instance(const glsl_type *base, unsigned array_size)
    948 {
    949    /* Generate a name using the base type pointer in the key.  This is
    950     * done because the name of the base type may not be unique across
    951     * shaders.  For example, two shaders may have different record types
    952     * named 'foo'.
    953     */
    954    char key[128];
    955    snprintf(key, sizeof(key), "%p[%u]", (void *) base, array_size);
    956 
    957    mtx_lock(&glsl_type::hash_mutex);
    958 
    959    if (array_types == NULL) {
    960       array_types = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
    961                                             _mesa_key_string_equal);
    962    }
    963 
    964    const struct hash_entry *entry = _mesa_hash_table_search(array_types, key);
    965    if (entry == NULL) {
    966       const glsl_type *t = new glsl_type(base, array_size);
    967 
    968       entry = _mesa_hash_table_insert(array_types,
    969                                       strdup(key),
    970                                       (void *) t);
    971    }
    972 
    973    assert(((glsl_type *) entry->data)->base_type == GLSL_TYPE_ARRAY);
    974    assert(((glsl_type *) entry->data)->length == array_size);
    975    assert(((glsl_type *) entry->data)->fields.array == base);
    976 
    977    mtx_unlock(&glsl_type::hash_mutex);
    978 
    979    return (glsl_type *) entry->data;
    980 }
    981 
    982 
    983 bool
    984 glsl_type::record_compare(const glsl_type *b, bool match_locations) const
    985 {
    986    if (this->length != b->length)
    987       return false;
    988 
    989    if (this->interface_packing != b->interface_packing)
    990       return false;
    991 
    992    if (this->interface_row_major != b->interface_row_major)
    993       return false;
    994 
    995    /* From the GLSL 4.20 specification (Sec 4.2):
    996     *
    997     *     "Structures must have the same name, sequence of type names, and
    998     *     type definitions, and field names to be considered the same type."
    999     *
   1000     * GLSL ES behaves the same (Ver 1.00 Sec 4.2.4, Ver 3.00 Sec 4.2.5).
   1001     */
   1002    if (strcmp(this->name, b->name) != 0)
   1003       return false;
   1004 
   1005    for (unsigned i = 0; i < this->length; i++) {
   1006       if (this->fields.structure[i].type != b->fields.structure[i].type)
   1007          return false;
   1008       if (strcmp(this->fields.structure[i].name,
   1009                  b->fields.structure[i].name) != 0)
   1010          return false;
   1011       if (this->fields.structure[i].matrix_layout
   1012          != b->fields.structure[i].matrix_layout)
   1013         return false;
   1014       if (match_locations && this->fields.structure[i].location
   1015           != b->fields.structure[i].location)
   1016          return false;
   1017       if (this->fields.structure[i].offset
   1018           != b->fields.structure[i].offset)
   1019          return false;
   1020       if (this->fields.structure[i].interpolation
   1021           != b->fields.structure[i].interpolation)
   1022          return false;
   1023       if (this->fields.structure[i].centroid
   1024           != b->fields.structure[i].centroid)
   1025          return false;
   1026       if (this->fields.structure[i].sample
   1027           != b->fields.structure[i].sample)
   1028          return false;
   1029       if (this->fields.structure[i].patch
   1030           != b->fields.structure[i].patch)
   1031          return false;
   1032       if (this->fields.structure[i].memory_read_only
   1033           != b->fields.structure[i].memory_read_only)
   1034          return false;
   1035       if (this->fields.structure[i].memory_write_only
   1036           != b->fields.structure[i].memory_write_only)
   1037          return false;
   1038       if (this->fields.structure[i].memory_coherent
   1039           != b->fields.structure[i].memory_coherent)
   1040          return false;
   1041       if (this->fields.structure[i].memory_volatile
   1042           != b->fields.structure[i].memory_volatile)
   1043          return false;
   1044       if (this->fields.structure[i].memory_restrict
   1045           != b->fields.structure[i].memory_restrict)
   1046          return false;
   1047       if (this->fields.structure[i].image_format
   1048           != b->fields.structure[i].image_format)
   1049          return false;
   1050       if (this->fields.structure[i].precision
   1051           != b->fields.structure[i].precision)
   1052          return false;
   1053       if (this->fields.structure[i].explicit_xfb_buffer
   1054           != b->fields.structure[i].explicit_xfb_buffer)
   1055          return false;
   1056       if (this->fields.structure[i].xfb_buffer
   1057           != b->fields.structure[i].xfb_buffer)
   1058          return false;
   1059       if (this->fields.structure[i].xfb_stride
   1060           != b->fields.structure[i].xfb_stride)
   1061          return false;
   1062    }
   1063 
   1064    return true;
   1065 }
   1066 
   1067 
   1068 bool
   1069 glsl_type::record_key_compare(const void *a, const void *b)
   1070 {
   1071    const glsl_type *const key1 = (glsl_type *) a;
   1072    const glsl_type *const key2 = (glsl_type *) b;
   1073 
   1074    return strcmp(key1->name, key2->name) == 0 && key1->record_compare(key2);
   1075 }
   1076 
   1077 
   1078 /**
   1079  * Generate an integer hash value for a glsl_type structure type.
   1080  */
   1081 unsigned
   1082 glsl_type::record_key_hash(const void *a)
   1083 {
   1084    const glsl_type *const key = (glsl_type *) a;
   1085    uintptr_t hash = key->length;
   1086    unsigned retval;
   1087 
   1088    for (unsigned i = 0; i < key->length; i++) {
   1089       /* casting pointer to uintptr_t */
   1090       hash = (hash * 13 ) + (uintptr_t) key->fields.structure[i].type;
   1091    }
   1092 
   1093    if (sizeof(hash) == 8)
   1094       retval = (hash & 0xffffffff) ^ ((uint64_t) hash >> 32);
   1095    else
   1096       retval = hash;
   1097 
   1098    return retval;
   1099 }
   1100 
   1101 
   1102 const glsl_type *
   1103 glsl_type::get_record_instance(const glsl_struct_field *fields,
   1104                                unsigned num_fields,
   1105                                const char *name)
   1106 {
   1107    const glsl_type key(fields, num_fields, name);
   1108 
   1109    mtx_lock(&glsl_type::hash_mutex);
   1110 
   1111    if (record_types == NULL) {
   1112       record_types = _mesa_hash_table_create(NULL, record_key_hash,
   1113                                              record_key_compare);
   1114    }
   1115 
   1116    const struct hash_entry *entry = _mesa_hash_table_search(record_types,
   1117                                                             &key);
   1118    if (entry == NULL) {
   1119       const glsl_type *t = new glsl_type(fields, num_fields, name);
   1120 
   1121       entry = _mesa_hash_table_insert(record_types, t, (void *) t);
   1122    }
   1123 
   1124    assert(((glsl_type *) entry->data)->base_type == GLSL_TYPE_STRUCT);
   1125    assert(((glsl_type *) entry->data)->length == num_fields);
   1126    assert(strcmp(((glsl_type *) entry->data)->name, name) == 0);
   1127 
   1128    mtx_unlock(&glsl_type::hash_mutex);
   1129 
   1130    return (glsl_type *) entry->data;
   1131 }
   1132 
   1133 
   1134 const glsl_type *
   1135 glsl_type::get_interface_instance(const glsl_struct_field *fields,
   1136                                   unsigned num_fields,
   1137                                   enum glsl_interface_packing packing,
   1138                                   bool row_major,
   1139                                   const char *block_name)
   1140 {
   1141    const glsl_type key(fields, num_fields, packing, row_major, block_name);
   1142 
   1143    mtx_lock(&glsl_type::hash_mutex);
   1144 
   1145    if (interface_types == NULL) {
   1146       interface_types = _mesa_hash_table_create(NULL, record_key_hash,
   1147                                                 record_key_compare);
   1148    }
   1149 
   1150    const struct hash_entry *entry = _mesa_hash_table_search(interface_types,
   1151                                                             &key);
   1152    if (entry == NULL) {
   1153       const glsl_type *t = new glsl_type(fields, num_fields,
   1154                                          packing, row_major, block_name);
   1155 
   1156       entry = _mesa_hash_table_insert(interface_types, t, (void *) t);
   1157    }
   1158 
   1159    assert(((glsl_type *) entry->data)->base_type == GLSL_TYPE_INTERFACE);
   1160    assert(((glsl_type *) entry->data)->length == num_fields);
   1161    assert(strcmp(((glsl_type *) entry->data)->name, block_name) == 0);
   1162 
   1163    mtx_unlock(&glsl_type::hash_mutex);
   1164 
   1165    return (glsl_type *) entry->data;
   1166 }
   1167 
   1168 const glsl_type *
   1169 glsl_type::get_subroutine_instance(const char *subroutine_name)
   1170 {
   1171    const glsl_type key(subroutine_name);
   1172 
   1173    mtx_lock(&glsl_type::hash_mutex);
   1174 
   1175    if (subroutine_types == NULL) {
   1176       subroutine_types = _mesa_hash_table_create(NULL, record_key_hash,
   1177                                                  record_key_compare);
   1178    }
   1179 
   1180    const struct hash_entry *entry = _mesa_hash_table_search(subroutine_types,
   1181                                                             &key);
   1182    if (entry == NULL) {
   1183       const glsl_type *t = new glsl_type(subroutine_name);
   1184 
   1185       entry = _mesa_hash_table_insert(subroutine_types, t, (void *) t);
   1186    }
   1187 
   1188    assert(((glsl_type *) entry->data)->base_type == GLSL_TYPE_SUBROUTINE);
   1189    assert(strcmp(((glsl_type *) entry->data)->name, subroutine_name) == 0);
   1190 
   1191    mtx_unlock(&glsl_type::hash_mutex);
   1192 
   1193    return (glsl_type *) entry->data;
   1194 }
   1195 
   1196 
   1197 static bool
   1198 function_key_compare(const void *a, const void *b)
   1199 {
   1200    const glsl_type *const key1 = (glsl_type *) a;
   1201    const glsl_type *const key2 = (glsl_type *) b;
   1202 
   1203    if (key1->length != key2->length)
   1204       return false;
   1205 
   1206    return memcmp(key1->fields.parameters, key2->fields.parameters,
   1207                  (key1->length + 1) * sizeof(*key1->fields.parameters)) == 0;
   1208 }
   1209 
   1210 
   1211 static uint32_t
   1212 function_key_hash(const void *a)
   1213 {
   1214    const glsl_type *const key = (glsl_type *) a;
   1215    return _mesa_hash_data(key->fields.parameters,
   1216                           (key->length + 1) * sizeof(*key->fields.parameters));
   1217 }
   1218 
   1219 const glsl_type *
   1220 glsl_type::get_function_instance(const glsl_type *return_type,
   1221                                  const glsl_function_param *params,
   1222                                  unsigned num_params)
   1223 {
   1224    const glsl_type key(return_type, params, num_params);
   1225 
   1226    mtx_lock(&glsl_type::hash_mutex);
   1227 
   1228    if (function_types == NULL) {
   1229       function_types = _mesa_hash_table_create(NULL, function_key_hash,
   1230                                                function_key_compare);
   1231    }
   1232 
   1233    struct hash_entry *entry = _mesa_hash_table_search(function_types, &key);
   1234    if (entry == NULL) {
   1235       const glsl_type *t = new glsl_type(return_type, params, num_params);
   1236 
   1237       entry = _mesa_hash_table_insert(function_types, t, (void *) t);
   1238    }
   1239 
   1240    const glsl_type *t = (const glsl_type *)entry->data;
   1241 
   1242    assert(t->base_type == GLSL_TYPE_FUNCTION);
   1243    assert(t->length == num_params);
   1244 
   1245    mtx_unlock(&glsl_type::hash_mutex);
   1246 
   1247    return t;
   1248 }
   1249 
   1250 
   1251 const glsl_type *
   1252 glsl_type::get_mul_type(const glsl_type *type_a, const glsl_type *type_b)
   1253 {
   1254    if (type_a == type_b) {
   1255       return type_a;
   1256    } else if (type_a->is_matrix() && type_b->is_matrix()) {
   1257       /* Matrix multiply.  The columns of A must match the rows of B.  Given
   1258        * the other previously tested constraints, this means the vector type
   1259        * of a row from A must be the same as the vector type of a column from
   1260        * B.
   1261        */
   1262       if (type_a->row_type() == type_b->column_type()) {
   1263          /* The resulting matrix has the number of columns of matrix B and
   1264           * the number of rows of matrix A.  We get the row count of A by
   1265           * looking at the size of a vector that makes up a column.  The
   1266           * transpose (size of a row) is done for B.
   1267           */
   1268          const glsl_type *const type =
   1269             get_instance(type_a->base_type,
   1270                          type_a->column_type()->vector_elements,
   1271                          type_b->row_type()->vector_elements);
   1272          assert(type != error_type);
   1273 
   1274          return type;
   1275       }
   1276    } else if (type_a->is_matrix()) {
   1277       /* A is a matrix and B is a column vector.  Columns of A must match
   1278        * rows of B.  Given the other previously tested constraints, this
   1279        * means the vector type of a row from A must be the same as the
   1280        * vector the type of B.
   1281        */
   1282       if (type_a->row_type() == type_b) {
   1283          /* The resulting vector has a number of elements equal to
   1284           * the number of rows of matrix A. */
   1285          const glsl_type *const type =
   1286             get_instance(type_a->base_type,
   1287                          type_a->column_type()->vector_elements,
   1288                          1);
   1289          assert(type != error_type);
   1290 
   1291          return type;
   1292       }
   1293    } else {
   1294       assert(type_b->is_matrix());
   1295 
   1296       /* A is a row vector and B is a matrix.  Columns of A must match rows
   1297        * of B.  Given the other previously tested constraints, this means
   1298        * the type of A must be the same as the vector type of a column from
   1299        * B.
   1300        */
   1301       if (type_a == type_b->column_type()) {
   1302          /* The resulting vector has a number of elements equal to
   1303           * the number of columns of matrix B. */
   1304          const glsl_type *const type =
   1305             get_instance(type_a->base_type,
   1306                          type_b->row_type()->vector_elements,
   1307                          1);
   1308          assert(type != error_type);
   1309 
   1310          return type;
   1311       }
   1312    }
   1313 
   1314    return error_type;
   1315 }
   1316 
   1317 
   1318 const glsl_type *
   1319 glsl_type::field_type(const char *name) const
   1320 {
   1321    if (this->base_type != GLSL_TYPE_STRUCT
   1322        && this->base_type != GLSL_TYPE_INTERFACE)
   1323       return error_type;
   1324 
   1325    for (unsigned i = 0; i < this->length; i++) {
   1326       if (strcmp(name, this->fields.structure[i].name) == 0)
   1327          return this->fields.structure[i].type;
   1328    }
   1329 
   1330    return error_type;
   1331 }
   1332 
   1333 
   1334 int
   1335 glsl_type::field_index(const char *name) const
   1336 {
   1337    if (this->base_type != GLSL_TYPE_STRUCT
   1338        && this->base_type != GLSL_TYPE_INTERFACE)
   1339       return -1;
   1340 
   1341    for (unsigned i = 0; i < this->length; i++) {
   1342       if (strcmp(name, this->fields.structure[i].name) == 0)
   1343          return i;
   1344    }
   1345 
   1346    return -1;
   1347 }
   1348 
   1349 
   1350 unsigned
   1351 glsl_type::component_slots() const
   1352 {
   1353    switch (this->base_type) {
   1354    case GLSL_TYPE_UINT:
   1355    case GLSL_TYPE_INT:
   1356    case GLSL_TYPE_UINT16:
   1357    case GLSL_TYPE_INT16:
   1358    case GLSL_TYPE_FLOAT:
   1359    case GLSL_TYPE_FLOAT16:
   1360    case GLSL_TYPE_BOOL:
   1361       return this->components();
   1362 
   1363    case GLSL_TYPE_DOUBLE:
   1364    case GLSL_TYPE_UINT64:
   1365    case GLSL_TYPE_INT64:
   1366       return 2 * this->components();
   1367 
   1368    case GLSL_TYPE_STRUCT:
   1369    case GLSL_TYPE_INTERFACE: {
   1370       unsigned size = 0;
   1371 
   1372       for (unsigned i = 0; i < this->length; i++)
   1373          size += this->fields.structure[i].type->component_slots();
   1374 
   1375       return size;
   1376    }
   1377 
   1378    case GLSL_TYPE_ARRAY:
   1379       return this->length * this->fields.array->component_slots();
   1380 
   1381    case GLSL_TYPE_SAMPLER:
   1382    case GLSL_TYPE_IMAGE:
   1383       return 2;
   1384 
   1385    case GLSL_TYPE_SUBROUTINE:
   1386       return 1;
   1387 
   1388    case GLSL_TYPE_FUNCTION:
   1389    case GLSL_TYPE_ATOMIC_UINT:
   1390    case GLSL_TYPE_VOID:
   1391    case GLSL_TYPE_ERROR:
   1392       break;
   1393    }
   1394 
   1395    return 0;
   1396 }
   1397 
   1398 unsigned
   1399 glsl_type::record_location_offset(unsigned length) const
   1400 {
   1401    unsigned offset = 0;
   1402    const glsl_type *t = this->without_array();
   1403    if (t->is_record()) {
   1404       assert(length <= t->length);
   1405 
   1406       for (unsigned i = 0; i < length; i++) {
   1407          const glsl_type *st = t->fields.structure[i].type;
   1408          const glsl_type *wa = st->without_array();
   1409          if (wa->is_record()) {
   1410             unsigned r_offset = wa->record_location_offset(wa->length);
   1411             offset += st->is_array() ?
   1412                st->arrays_of_arrays_size() * r_offset : r_offset;
   1413          } else if (st->is_array() && st->fields.array->is_array()) {
   1414             unsigned outer_array_size = st->length;
   1415             const glsl_type *base_type = st->fields.array;
   1416 
   1417             /* For arrays of arrays the outer arrays take up a uniform
   1418              * slot for each element. The innermost array elements share a
   1419              * single slot so we ignore the innermost array when calculating
   1420              * the offset.
   1421              */
   1422             while (base_type->fields.array->is_array()) {
   1423                outer_array_size = outer_array_size * base_type->length;
   1424                base_type = base_type->fields.array;
   1425             }
   1426             offset += outer_array_size;
   1427          } else {
   1428             /* We dont worry about arrays here because unless the array
   1429              * contains a structure or another array it only takes up a single
   1430              * uniform slot.
   1431              */
   1432             offset += 1;
   1433          }
   1434       }
   1435    }
   1436    return offset;
   1437 }
   1438 
   1439 unsigned
   1440 glsl_type::uniform_locations() const
   1441 {
   1442    unsigned size = 0;
   1443 
   1444    switch (this->base_type) {
   1445    case GLSL_TYPE_UINT:
   1446    case GLSL_TYPE_INT:
   1447    case GLSL_TYPE_FLOAT:
   1448    case GLSL_TYPE_FLOAT16:
   1449    case GLSL_TYPE_DOUBLE:
   1450    case GLSL_TYPE_UINT16:
   1451    case GLSL_TYPE_INT16:
   1452    case GLSL_TYPE_UINT64:
   1453    case GLSL_TYPE_INT64:
   1454    case GLSL_TYPE_BOOL:
   1455    case GLSL_TYPE_SAMPLER:
   1456    case GLSL_TYPE_IMAGE:
   1457    case GLSL_TYPE_SUBROUTINE:
   1458       return 1;
   1459 
   1460    case GLSL_TYPE_STRUCT:
   1461    case GLSL_TYPE_INTERFACE:
   1462       for (unsigned i = 0; i < this->length; i++)
   1463          size += this->fields.structure[i].type->uniform_locations();
   1464       return size;
   1465    case GLSL_TYPE_ARRAY:
   1466       return this->length * this->fields.array->uniform_locations();
   1467    default:
   1468       return 0;
   1469    }
   1470 }
   1471 
   1472 unsigned
   1473 glsl_type::varying_count() const
   1474 {
   1475    unsigned size = 0;
   1476 
   1477    switch (this->base_type) {
   1478    case GLSL_TYPE_UINT:
   1479    case GLSL_TYPE_INT:
   1480    case GLSL_TYPE_FLOAT:
   1481    case GLSL_TYPE_FLOAT16:
   1482    case GLSL_TYPE_DOUBLE:
   1483    case GLSL_TYPE_BOOL:
   1484    case GLSL_TYPE_UINT16:
   1485    case GLSL_TYPE_INT16:
   1486    case GLSL_TYPE_UINT64:
   1487    case GLSL_TYPE_INT64:
   1488       return 1;
   1489 
   1490    case GLSL_TYPE_STRUCT:
   1491    case GLSL_TYPE_INTERFACE:
   1492       for (unsigned i = 0; i < this->length; i++)
   1493          size += this->fields.structure[i].type->varying_count();
   1494       return size;
   1495    case GLSL_TYPE_ARRAY:
   1496       /* Don't count innermost array elements */
   1497       if (this->without_array()->is_record() ||
   1498           this->without_array()->is_interface() ||
   1499           this->fields.array->is_array())
   1500          return this->length * this->fields.array->varying_count();
   1501       else
   1502          return this->fields.array->varying_count();
   1503    default:
   1504       assert(!"unsupported varying type");
   1505       return 0;
   1506    }
   1507 }
   1508 
   1509 bool
   1510 glsl_type::can_implicitly_convert_to(const glsl_type *desired,
   1511                                      _mesa_glsl_parse_state *state) const
   1512 {
   1513    if (this == desired)
   1514       return true;
   1515 
   1516    /* GLSL 1.10 and ESSL do not allow implicit conversions. If there is no
   1517     * state, we're doing intra-stage function linking where these checks have
   1518     * already been done.
   1519     */
   1520    if (state && (state->es_shader || !state->is_version(120, 0)))
   1521       return false;
   1522 
   1523    /* There is no conversion among matrix types. */
   1524    if (this->matrix_columns > 1 || desired->matrix_columns > 1)
   1525       return false;
   1526 
   1527    /* Vector size must match. */
   1528    if (this->vector_elements != desired->vector_elements)
   1529       return false;
   1530 
   1531    /* int and uint can be converted to float. */
   1532    if (desired->is_float() && this->is_integer())
   1533       return true;
   1534 
   1535    /* With GLSL 4.0, ARB_gpu_shader5, or MESA_shader_integer_functions, int
   1536     * can be converted to uint.  Note that state may be NULL here, when
   1537     * resolving function calls in the linker. By this time, all the
   1538     * state-dependent checks have already happened though, so allow anything
   1539     * that's allowed in any shader version.
   1540     */
   1541    if ((!state || state->is_version(400, 0) || state->ARB_gpu_shader5_enable ||
   1542         state->MESA_shader_integer_functions_enable) &&
   1543          desired->base_type == GLSL_TYPE_UINT && this->base_type == GLSL_TYPE_INT)
   1544       return true;
   1545 
   1546    /* No implicit conversions from double. */
   1547    if ((!state || state->has_double()) && this->is_double())
   1548       return false;
   1549 
   1550    /* Conversions from different types to double. */
   1551    if ((!state || state->has_double()) && desired->is_double()) {
   1552       if (this->is_float())
   1553          return true;
   1554       if (this->is_integer())
   1555          return true;
   1556    }
   1557 
   1558    return false;
   1559 }
   1560 
   1561 unsigned
   1562 glsl_type::std140_base_alignment(bool row_major) const
   1563 {
   1564    unsigned N = is_64bit() ? 8 : 4;
   1565 
   1566    /* (1) If the member is a scalar consuming <N> basic machine units, the
   1567     *     base alignment is <N>.
   1568     *
   1569     * (2) If the member is a two- or four-component vector with components
   1570     *     consuming <N> basic machine units, the base alignment is 2<N> or
   1571     *     4<N>, respectively.
   1572     *
   1573     * (3) If the member is a three-component vector with components consuming
   1574     *     <N> basic machine units, the base alignment is 4<N>.
   1575     */
   1576    if (this->is_scalar() || this->is_vector()) {
   1577       switch (this->vector_elements) {
   1578       case 1:
   1579          return N;
   1580       case 2:
   1581          return 2 * N;
   1582       case 3:
   1583       case 4:
   1584          return 4 * N;
   1585       }
   1586    }
   1587 
   1588    /* (4) If the member is an array of scalars or vectors, the base alignment
   1589     *     and array stride are set to match the base alignment of a single
   1590     *     array element, according to rules (1), (2), and (3), and rounded up
   1591     *     to the base alignment of a vec4. The array may have padding at the
   1592     *     end; the base offset of the member following the array is rounded up
   1593     *     to the next multiple of the base alignment.
   1594     *
   1595     * (6) If the member is an array of <S> column-major matrices with <C>
   1596     *     columns and <R> rows, the matrix is stored identically to a row of
   1597     *     <S>*<C> column vectors with <R> components each, according to rule
   1598     *     (4).
   1599     *
   1600     * (8) If the member is an array of <S> row-major matrices with <C> columns
   1601     *     and <R> rows, the matrix is stored identically to a row of <S>*<R>
   1602     *     row vectors with <C> components each, according to rule (4).
   1603     *
   1604     * (10) If the member is an array of <S> structures, the <S> elements of
   1605     *      the array are laid out in order, according to rule (9).
   1606     */
   1607    if (this->is_array()) {
   1608       if (this->fields.array->is_scalar() ||
   1609           this->fields.array->is_vector() ||
   1610           this->fields.array->is_matrix()) {
   1611          return MAX2(this->fields.array->std140_base_alignment(row_major), 16);
   1612       } else {
   1613          assert(this->fields.array->is_record() ||
   1614                 this->fields.array->is_array());
   1615          return this->fields.array->std140_base_alignment(row_major);
   1616       }
   1617    }
   1618 
   1619    /* (5) If the member is a column-major matrix with <C> columns and
   1620     *     <R> rows, the matrix is stored identically to an array of
   1621     *     <C> column vectors with <R> components each, according to
   1622     *     rule (4).
   1623     *
   1624     * (7) If the member is a row-major matrix with <C> columns and <R>
   1625     *     rows, the matrix is stored identically to an array of <R>
   1626     *     row vectors with <C> components each, according to rule (4).
   1627     */
   1628    if (this->is_matrix()) {
   1629       const struct glsl_type *vec_type, *array_type;
   1630       int c = this->matrix_columns;
   1631       int r = this->vector_elements;
   1632 
   1633       if (row_major) {
   1634          vec_type = get_instance(base_type, c, 1);
   1635          array_type = glsl_type::get_array_instance(vec_type, r);
   1636       } else {
   1637          vec_type = get_instance(base_type, r, 1);
   1638          array_type = glsl_type::get_array_instance(vec_type, c);
   1639       }
   1640 
   1641       return array_type->std140_base_alignment(false);
   1642    }
   1643 
   1644    /* (9) If the member is a structure, the base alignment of the
   1645     *     structure is <N>, where <N> is the largest base alignment
   1646     *     value of any of its members, and rounded up to the base
   1647     *     alignment of a vec4. The individual members of this
   1648     *     sub-structure are then assigned offsets by applying this set
   1649     *     of rules recursively, where the base offset of the first
   1650     *     member of the sub-structure is equal to the aligned offset
   1651     *     of the structure. The structure may have padding at the end;
   1652     *     the base offset of the member following the sub-structure is
   1653     *     rounded up to the next multiple of the base alignment of the
   1654     *     structure.
   1655     */
   1656    if (this->is_record()) {
   1657       unsigned base_alignment = 16;
   1658       for (unsigned i = 0; i < this->length; i++) {
   1659          bool field_row_major = row_major;
   1660          const enum glsl_matrix_layout matrix_layout =
   1661             glsl_matrix_layout(this->fields.structure[i].matrix_layout);
   1662          if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) {
   1663             field_row_major = true;
   1664          } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) {
   1665             field_row_major = false;
   1666          }
   1667 
   1668          const struct glsl_type *field_type = this->fields.structure[i].type;
   1669          base_alignment = MAX2(base_alignment,
   1670                                field_type->std140_base_alignment(field_row_major));
   1671       }
   1672       return base_alignment;
   1673    }
   1674 
   1675    assert(!"not reached");
   1676    return -1;
   1677 }
   1678 
   1679 unsigned
   1680 glsl_type::std140_size(bool row_major) const
   1681 {
   1682    unsigned N = is_64bit() ? 8 : 4;
   1683 
   1684    /* (1) If the member is a scalar consuming <N> basic machine units, the
   1685     *     base alignment is <N>.
   1686     *
   1687     * (2) If the member is a two- or four-component vector with components
   1688     *     consuming <N> basic machine units, the base alignment is 2<N> or
   1689     *     4<N>, respectively.
   1690     *
   1691     * (3) If the member is a three-component vector with components consuming
   1692     *     <N> basic machine units, the base alignment is 4<N>.
   1693     */
   1694    if (this->is_scalar() || this->is_vector()) {
   1695       return this->vector_elements * N;
   1696    }
   1697 
   1698    /* (5) If the member is a column-major matrix with <C> columns and
   1699     *     <R> rows, the matrix is stored identically to an array of
   1700     *     <C> column vectors with <R> components each, according to
   1701     *     rule (4).
   1702     *
   1703     * (6) If the member is an array of <S> column-major matrices with <C>
   1704     *     columns and <R> rows, the matrix is stored identically to a row of
   1705     *     <S>*<C> column vectors with <R> components each, according to rule
   1706     *     (4).
   1707     *
   1708     * (7) If the member is a row-major matrix with <C> columns and <R>
   1709     *     rows, the matrix is stored identically to an array of <R>
   1710     *     row vectors with <C> components each, according to rule (4).
   1711     *
   1712     * (8) If the member is an array of <S> row-major matrices with <C> columns
   1713     *     and <R> rows, the matrix is stored identically to a row of <S>*<R>
   1714     *     row vectors with <C> components each, according to rule (4).
   1715     */
   1716    if (this->without_array()->is_matrix()) {
   1717       const struct glsl_type *element_type;
   1718       const struct glsl_type *vec_type;
   1719       unsigned int array_len;
   1720 
   1721       if (this->is_array()) {
   1722          element_type = this->without_array();
   1723          array_len = this->arrays_of_arrays_size();
   1724       } else {
   1725          element_type = this;
   1726          array_len = 1;
   1727       }
   1728 
   1729       if (row_major) {
   1730          vec_type = get_instance(element_type->base_type,
   1731                                  element_type->matrix_columns, 1);
   1732 
   1733          array_len *= element_type->vector_elements;
   1734       } else {
   1735          vec_type = get_instance(element_type->base_type,
   1736                                  element_type->vector_elements, 1);
   1737          array_len *= element_type->matrix_columns;
   1738       }
   1739       const glsl_type *array_type = glsl_type::get_array_instance(vec_type,
   1740                                                                   array_len);
   1741 
   1742       return array_type->std140_size(false);
   1743    }
   1744 
   1745    /* (4) If the member is an array of scalars or vectors, the base alignment
   1746     *     and array stride are set to match the base alignment of a single
   1747     *     array element, according to rules (1), (2), and (3), and rounded up
   1748     *     to the base alignment of a vec4. The array may have padding at the
   1749     *     end; the base offset of the member following the array is rounded up
   1750     *     to the next multiple of the base alignment.
   1751     *
   1752     * (10) If the member is an array of <S> structures, the <S> elements of
   1753     *      the array are laid out in order, according to rule (9).
   1754     */
   1755    if (this->is_array()) {
   1756       if (this->without_array()->is_record()) {
   1757 	 return this->arrays_of_arrays_size() *
   1758             this->without_array()->std140_size(row_major);
   1759       } else {
   1760 	 unsigned element_base_align =
   1761 	    this->without_array()->std140_base_alignment(row_major);
   1762 	 return this->arrays_of_arrays_size() * MAX2(element_base_align, 16);
   1763       }
   1764    }
   1765 
   1766    /* (9) If the member is a structure, the base alignment of the
   1767     *     structure is <N>, where <N> is the largest base alignment
   1768     *     value of any of its members, and rounded up to the base
   1769     *     alignment of a vec4. The individual members of this
   1770     *     sub-structure are then assigned offsets by applying this set
   1771     *     of rules recursively, where the base offset of the first
   1772     *     member of the sub-structure is equal to the aligned offset
   1773     *     of the structure. The structure may have padding at the end;
   1774     *     the base offset of the member following the sub-structure is
   1775     *     rounded up to the next multiple of the base alignment of the
   1776     *     structure.
   1777     */
   1778    if (this->is_record() || this->is_interface()) {
   1779       unsigned size = 0;
   1780       unsigned max_align = 0;
   1781 
   1782       for (unsigned i = 0; i < this->length; i++) {
   1783          bool field_row_major = row_major;
   1784          const enum glsl_matrix_layout matrix_layout =
   1785             glsl_matrix_layout(this->fields.structure[i].matrix_layout);
   1786          if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) {
   1787             field_row_major = true;
   1788          } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) {
   1789             field_row_major = false;
   1790          }
   1791 
   1792          const struct glsl_type *field_type = this->fields.structure[i].type;
   1793          unsigned align = field_type->std140_base_alignment(field_row_major);
   1794 
   1795          /* Ignore unsized arrays when calculating size */
   1796          if (field_type->is_unsized_array())
   1797             continue;
   1798 
   1799          size = glsl_align(size, align);
   1800          size += field_type->std140_size(field_row_major);
   1801 
   1802          max_align = MAX2(align, max_align);
   1803 
   1804          if (field_type->is_record() && (i + 1 < this->length))
   1805             size = glsl_align(size, 16);
   1806       }
   1807       size = glsl_align(size, MAX2(max_align, 16));
   1808       return size;
   1809    }
   1810 
   1811    assert(!"not reached");
   1812    return -1;
   1813 }
   1814 
   1815 unsigned
   1816 glsl_type::std430_base_alignment(bool row_major) const
   1817 {
   1818 
   1819    unsigned N = is_64bit() ? 8 : 4;
   1820 
   1821    /* (1) If the member is a scalar consuming <N> basic machine units, the
   1822     *     base alignment is <N>.
   1823     *
   1824     * (2) If the member is a two- or four-component vector with components
   1825     *     consuming <N> basic machine units, the base alignment is 2<N> or
   1826     *     4<N>, respectively.
   1827     *
   1828     * (3) If the member is a three-component vector with components consuming
   1829     *     <N> basic machine units, the base alignment is 4<N>.
   1830     */
   1831    if (this->is_scalar() || this->is_vector()) {
   1832       switch (this->vector_elements) {
   1833       case 1:
   1834          return N;
   1835       case 2:
   1836          return 2 * N;
   1837       case 3:
   1838       case 4:
   1839          return 4 * N;
   1840       }
   1841    }
   1842 
   1843    /* OpenGL 4.30 spec, section 7.6.2.2 "Standard Uniform Block Layout":
   1844     *
   1845     * "When using the std430 storage layout, shader storage blocks will be
   1846     * laid out in buffer storage identically to uniform and shader storage
   1847     * blocks using the std140 layout, except that the base alignment and
   1848     * stride of arrays of scalars and vectors in rule 4 and of structures
   1849     * in rule 9 are not rounded up a multiple of the base alignment of a vec4.
   1850     */
   1851 
   1852    /* (1) If the member is a scalar consuming <N> basic machine units, the
   1853     *     base alignment is <N>.
   1854     *
   1855     * (2) If the member is a two- or four-component vector with components
   1856     *     consuming <N> basic machine units, the base alignment is 2<N> or
   1857     *     4<N>, respectively.
   1858     *
   1859     * (3) If the member is a three-component vector with components consuming
   1860     *     <N> basic machine units, the base alignment is 4<N>.
   1861     */
   1862    if (this->is_array())
   1863       return this->fields.array->std430_base_alignment(row_major);
   1864 
   1865    /* (5) If the member is a column-major matrix with <C> columns and
   1866     *     <R> rows, the matrix is stored identically to an array of
   1867     *     <C> column vectors with <R> components each, according to
   1868     *     rule (4).
   1869     *
   1870     * (7) If the member is a row-major matrix with <C> columns and <R>
   1871     *     rows, the matrix is stored identically to an array of <R>
   1872     *     row vectors with <C> components each, according to rule (4).
   1873     */
   1874    if (this->is_matrix()) {
   1875       const struct glsl_type *vec_type, *array_type;
   1876       int c = this->matrix_columns;
   1877       int r = this->vector_elements;
   1878 
   1879       if (row_major) {
   1880          vec_type = get_instance(base_type, c, 1);
   1881          array_type = glsl_type::get_array_instance(vec_type, r);
   1882       } else {
   1883          vec_type = get_instance(base_type, r, 1);
   1884          array_type = glsl_type::get_array_instance(vec_type, c);
   1885       }
   1886 
   1887       return array_type->std430_base_alignment(false);
   1888    }
   1889 
   1890       /* (9) If the member is a structure, the base alignment of the
   1891     *     structure is <N>, where <N> is the largest base alignment
   1892     *     value of any of its members, and rounded up to the base
   1893     *     alignment of a vec4. The individual members of this
   1894     *     sub-structure are then assigned offsets by applying this set
   1895     *     of rules recursively, where the base offset of the first
   1896     *     member of the sub-structure is equal to the aligned offset
   1897     *     of the structure. The structure may have padding at the end;
   1898     *     the base offset of the member following the sub-structure is
   1899     *     rounded up to the next multiple of the base alignment of the
   1900     *     structure.
   1901     */
   1902    if (this->is_record()) {
   1903       unsigned base_alignment = 0;
   1904       for (unsigned i = 0; i < this->length; i++) {
   1905          bool field_row_major = row_major;
   1906          const enum glsl_matrix_layout matrix_layout =
   1907             glsl_matrix_layout(this->fields.structure[i].matrix_layout);
   1908          if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) {
   1909             field_row_major = true;
   1910          } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) {
   1911             field_row_major = false;
   1912          }
   1913 
   1914          const struct glsl_type *field_type = this->fields.structure[i].type;
   1915          base_alignment = MAX2(base_alignment,
   1916                                field_type->std430_base_alignment(field_row_major));
   1917       }
   1918       assert(base_alignment > 0);
   1919       return base_alignment;
   1920    }
   1921    assert(!"not reached");
   1922    return -1;
   1923 }
   1924 
   1925 unsigned
   1926 glsl_type::std430_array_stride(bool row_major) const
   1927 {
   1928    unsigned N = is_64bit() ? 8 : 4;
   1929 
   1930    /* Notice that the array stride of a vec3 is not 3 * N but 4 * N.
   1931     * See OpenGL 4.30 spec, section 7.6.2.2 "Standard Uniform Block Layout"
   1932     *
   1933     * (3) If the member is a three-component vector with components consuming
   1934     *     <N> basic machine units, the base alignment is 4<N>.
   1935     */
   1936    if (this->is_vector() && this->vector_elements == 3)
   1937       return 4 * N;
   1938 
   1939    /* By default use std430_size(row_major) */
   1940    return this->std430_size(row_major);
   1941 }
   1942 
   1943 unsigned
   1944 glsl_type::std430_size(bool row_major) const
   1945 {
   1946    unsigned N = is_64bit() ? 8 : 4;
   1947 
   1948    /* OpenGL 4.30 spec, section 7.6.2.2 "Standard Uniform Block Layout":
   1949     *
   1950     * "When using the std430 storage layout, shader storage blocks will be
   1951     * laid out in buffer storage identically to uniform and shader storage
   1952     * blocks using the std140 layout, except that the base alignment and
   1953     * stride of arrays of scalars and vectors in rule 4 and of structures
   1954     * in rule 9 are not rounded up a multiple of the base alignment of a vec4.
   1955     */
   1956    if (this->is_scalar() || this->is_vector())
   1957          return this->vector_elements * N;
   1958 
   1959    if (this->without_array()->is_matrix()) {
   1960       const struct glsl_type *element_type;
   1961       const struct glsl_type *vec_type;
   1962       unsigned int array_len;
   1963 
   1964       if (this->is_array()) {
   1965          element_type = this->without_array();
   1966          array_len = this->arrays_of_arrays_size();
   1967       } else {
   1968          element_type = this;
   1969          array_len = 1;
   1970       }
   1971 
   1972       if (row_major) {
   1973          vec_type = get_instance(element_type->base_type,
   1974                                  element_type->matrix_columns, 1);
   1975 
   1976          array_len *= element_type->vector_elements;
   1977       } else {
   1978          vec_type = get_instance(element_type->base_type,
   1979                                  element_type->vector_elements, 1);
   1980          array_len *= element_type->matrix_columns;
   1981       }
   1982       const glsl_type *array_type = glsl_type::get_array_instance(vec_type,
   1983                                                                   array_len);
   1984 
   1985       return array_type->std430_size(false);
   1986    }
   1987 
   1988    if (this->is_array()) {
   1989       if (this->without_array()->is_record())
   1990          return this->arrays_of_arrays_size() *
   1991             this->without_array()->std430_size(row_major);
   1992       else
   1993          return this->arrays_of_arrays_size() *
   1994             this->without_array()->std430_base_alignment(row_major);
   1995    }
   1996 
   1997    if (this->is_record() || this->is_interface()) {
   1998       unsigned size = 0;
   1999       unsigned max_align = 0;
   2000 
   2001       for (unsigned i = 0; i < this->length; i++) {
   2002          bool field_row_major = row_major;
   2003          const enum glsl_matrix_layout matrix_layout =
   2004             glsl_matrix_layout(this->fields.structure[i].matrix_layout);
   2005          if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) {
   2006             field_row_major = true;
   2007          } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) {
   2008             field_row_major = false;
   2009          }
   2010 
   2011          const struct glsl_type *field_type = this->fields.structure[i].type;
   2012          unsigned align = field_type->std430_base_alignment(field_row_major);
   2013          size = glsl_align(size, align);
   2014          size += field_type->std430_size(field_row_major);
   2015 
   2016          max_align = MAX2(align, max_align);
   2017       }
   2018       size = glsl_align(size, max_align);
   2019       return size;
   2020    }
   2021 
   2022    assert(!"not reached");
   2023    return -1;
   2024 }
   2025 
   2026 unsigned
   2027 glsl_type::count_attribute_slots(bool is_vertex_input) const
   2028 {
   2029    /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec:
   2030     *
   2031     *     "A scalar input counts the same amount against this limit as a vec4,
   2032     *     so applications may want to consider packing groups of four
   2033     *     unrelated float inputs together into a vector to better utilize the
   2034     *     capabilities of the underlying hardware. A matrix input will use up
   2035     *     multiple locations.  The number of locations used will equal the
   2036     *     number of columns in the matrix."
   2037     *
   2038     * The spec does not explicitly say how arrays are counted.  However, it
   2039     * should be safe to assume the total number of slots consumed by an array
   2040     * is the number of entries in the array multiplied by the number of slots
   2041     * consumed by a single element of the array.
   2042     *
   2043     * The spec says nothing about how structs are counted, because vertex
   2044     * attributes are not allowed to be (or contain) structs.  However, Mesa
   2045     * allows varying structs, the number of varying slots taken up by a
   2046     * varying struct is simply equal to the sum of the number of slots taken
   2047     * up by each element.
   2048     *
   2049     * Doubles are counted different depending on whether they are vertex
   2050     * inputs or everything else. Vertex inputs from ARB_vertex_attrib_64bit
   2051     * take one location no matter what size they are, otherwise dvec3/4
   2052     * take two locations.
   2053     */
   2054    switch (this->base_type) {
   2055    case GLSL_TYPE_UINT:
   2056    case GLSL_TYPE_INT:
   2057    case GLSL_TYPE_UINT16:
   2058    case GLSL_TYPE_INT16:
   2059    case GLSL_TYPE_FLOAT:
   2060    case GLSL_TYPE_FLOAT16:
   2061    case GLSL_TYPE_BOOL:
   2062    case GLSL_TYPE_SAMPLER:
   2063    case GLSL_TYPE_IMAGE:
   2064       return this->matrix_columns;
   2065    case GLSL_TYPE_DOUBLE:
   2066    case GLSL_TYPE_UINT64:
   2067    case GLSL_TYPE_INT64:
   2068       if (this->vector_elements > 2 && !is_vertex_input)
   2069          return this->matrix_columns * 2;
   2070       else
   2071          return this->matrix_columns;
   2072    case GLSL_TYPE_STRUCT:
   2073    case GLSL_TYPE_INTERFACE: {
   2074       unsigned size = 0;
   2075 
   2076       for (unsigned i = 0; i < this->length; i++)
   2077          size += this->fields.structure[i].type->count_attribute_slots(is_vertex_input);
   2078 
   2079       return size;
   2080    }
   2081 
   2082    case GLSL_TYPE_ARRAY:
   2083       return this->length * this->fields.array->count_attribute_slots(is_vertex_input);
   2084 
   2085    case GLSL_TYPE_SUBROUTINE:
   2086       return 1;
   2087 
   2088    case GLSL_TYPE_FUNCTION:
   2089    case GLSL_TYPE_ATOMIC_UINT:
   2090    case GLSL_TYPE_VOID:
   2091    case GLSL_TYPE_ERROR:
   2092       break;
   2093    }
   2094 
   2095    assert(!"Unexpected type in count_attribute_slots()");
   2096 
   2097    return 0;
   2098 }
   2099 
   2100 int
   2101 glsl_type::coordinate_components() const
   2102 {
   2103    int size;
   2104 
   2105    switch (sampler_dimensionality) {
   2106    case GLSL_SAMPLER_DIM_1D:
   2107    case GLSL_SAMPLER_DIM_BUF:
   2108       size = 1;
   2109       break;
   2110    case GLSL_SAMPLER_DIM_2D:
   2111    case GLSL_SAMPLER_DIM_RECT:
   2112    case GLSL_SAMPLER_DIM_MS:
   2113    case GLSL_SAMPLER_DIM_EXTERNAL:
   2114    case GLSL_SAMPLER_DIM_SUBPASS:
   2115       size = 2;
   2116       break;
   2117    case GLSL_SAMPLER_DIM_3D:
   2118    case GLSL_SAMPLER_DIM_CUBE:
   2119       size = 3;
   2120       break;
   2121    default:
   2122       assert(!"Should not get here.");
   2123       size = 1;
   2124       break;
   2125    }
   2126 
   2127    /* Array textures need an additional component for the array index, except
   2128     * for cubemap array images that behave like a 2D array of interleaved
   2129     * cubemap faces.
   2130     */
   2131    if (sampler_array &&
   2132        !(is_image() && sampler_dimensionality == GLSL_SAMPLER_DIM_CUBE))
   2133       size += 1;
   2134 
   2135    return size;
   2136 }
   2137 
   2138 /**
   2139  * Declarations of type flyweights (glsl_type::_foo_type) and
   2140  * convenience pointers (glsl_type::foo_type).
   2141  * @{
   2142  */
   2143 #define DECL_TYPE(NAME, ...)                                    \
   2144    const glsl_type glsl_type::_##NAME##_type = glsl_type(__VA_ARGS__, #NAME); \
   2145    const glsl_type *const glsl_type::NAME##_type = &glsl_type::_##NAME##_type;
   2146 
   2147 #define STRUCT_TYPE(NAME)
   2148 
   2149 #include "compiler/builtin_type_macros.h"
   2150 /** @} */
   2151 
   2152 static void
   2153 get_struct_type_field_and_pointer_sizes(size_t *s_field_size,
   2154                                         size_t *s_field_ptrs)
   2155 {
   2156    *s_field_size = sizeof(glsl_struct_field);
   2157    *s_field_ptrs =
   2158      sizeof(((glsl_struct_field *)0)->type) +
   2159      sizeof(((glsl_struct_field *)0)->name);
   2160 }
   2161 
   2162 void
   2163 encode_type_to_blob(struct blob *blob, const glsl_type *type)
   2164 {
   2165    uint32_t encoding;
   2166 
   2167    if (!type) {
   2168       blob_write_uint32(blob, 0);
   2169       return;
   2170    }
   2171 
   2172    switch (type->base_type) {
   2173    case GLSL_TYPE_UINT:
   2174    case GLSL_TYPE_INT:
   2175    case GLSL_TYPE_FLOAT:
   2176    case GLSL_TYPE_BOOL:
   2177    case GLSL_TYPE_DOUBLE:
   2178    case GLSL_TYPE_UINT64:
   2179    case GLSL_TYPE_INT64:
   2180       encoding = (type->base_type << 24) |
   2181          (type->vector_elements << 4) |
   2182          (type->matrix_columns);
   2183       break;
   2184    case GLSL_TYPE_SAMPLER:
   2185       encoding = (type->base_type) << 24 |
   2186          (type->sampler_dimensionality << 4) |
   2187          (type->sampler_shadow << 3) |
   2188          (type->sampler_array << 2) |
   2189          (type->sampled_type);
   2190       break;
   2191    case GLSL_TYPE_SUBROUTINE:
   2192       encoding = type->base_type << 24;
   2193       blob_write_uint32(blob, encoding);
   2194       blob_write_string(blob, type->name);
   2195       return;
   2196    case GLSL_TYPE_IMAGE:
   2197       encoding = (type->base_type) << 24 |
   2198          (type->sampler_dimensionality << 3) |
   2199          (type->sampler_array << 2) |
   2200          (type->sampled_type);
   2201       break;
   2202    case GLSL_TYPE_ATOMIC_UINT:
   2203       encoding = (type->base_type << 24);
   2204       break;
   2205    case GLSL_TYPE_ARRAY:
   2206       blob_write_uint32(blob, (type->base_type) << 24);
   2207       blob_write_uint32(blob, type->length);
   2208       encode_type_to_blob(blob, type->fields.array);
   2209       return;
   2210    case GLSL_TYPE_STRUCT:
   2211    case GLSL_TYPE_INTERFACE:
   2212       blob_write_uint32(blob, (type->base_type) << 24);
   2213       blob_write_string(blob, type->name);
   2214       blob_write_uint32(blob, type->length);
   2215 
   2216       size_t s_field_size, s_field_ptrs;
   2217       get_struct_type_field_and_pointer_sizes(&s_field_size, &s_field_ptrs);
   2218 
   2219       for (unsigned i = 0; i < type->length; i++) {
   2220          encode_type_to_blob(blob, type->fields.structure[i].type);
   2221          blob_write_string(blob, type->fields.structure[i].name);
   2222 
   2223          /* Write the struct field skipping the pointers */
   2224          blob_write_bytes(blob,
   2225                           ((char *)&type->fields.structure[i]) + s_field_ptrs,
   2226                           s_field_size - s_field_ptrs);
   2227       }
   2228 
   2229       if (type->is_interface()) {
   2230          blob_write_uint32(blob, type->interface_packing);
   2231          blob_write_uint32(blob, type->interface_row_major);
   2232       }
   2233       return;
   2234    case GLSL_TYPE_VOID:
   2235       encoding = (type->base_type << 24);
   2236       break;
   2237    case GLSL_TYPE_ERROR:
   2238    default:
   2239       assert(!"Cannot encode type!");
   2240       encoding = 0;
   2241       break;
   2242    }
   2243 
   2244    blob_write_uint32(blob, encoding);
   2245 }
   2246 
   2247 const glsl_type *
   2248 decode_type_from_blob(struct blob_reader *blob)
   2249 {
   2250    uint32_t u = blob_read_uint32(blob);
   2251 
   2252    if (u == 0) {
   2253       return NULL;
   2254    }
   2255 
   2256    glsl_base_type base_type = (glsl_base_type) (u >> 24);
   2257 
   2258    switch (base_type) {
   2259    case GLSL_TYPE_UINT:
   2260    case GLSL_TYPE_INT:
   2261    case GLSL_TYPE_FLOAT:
   2262    case GLSL_TYPE_BOOL:
   2263    case GLSL_TYPE_DOUBLE:
   2264    case GLSL_TYPE_UINT64:
   2265    case GLSL_TYPE_INT64:
   2266       return glsl_type::get_instance(base_type, (u >> 4) & 0x0f, u & 0x0f);
   2267    case GLSL_TYPE_SAMPLER:
   2268       return glsl_type::get_sampler_instance((enum glsl_sampler_dim) ((u >> 4) & 0x07),
   2269                                              (u >> 3) & 0x01,
   2270                                              (u >> 2) & 0x01,
   2271                                              (glsl_base_type) ((u >> 0) & 0x03));
   2272    case GLSL_TYPE_SUBROUTINE:
   2273       return glsl_type::get_subroutine_instance(blob_read_string(blob));
   2274    case GLSL_TYPE_IMAGE:
   2275       return glsl_type::get_image_instance((enum glsl_sampler_dim) ((u >> 3) & 0x07),
   2276                                              (u >> 2) & 0x01,
   2277                                              (glsl_base_type) ((u >> 0) & 0x03));
   2278    case GLSL_TYPE_ATOMIC_UINT:
   2279       return glsl_type::atomic_uint_type;
   2280    case GLSL_TYPE_ARRAY: {
   2281       unsigned length = blob_read_uint32(blob);
   2282       return glsl_type::get_array_instance(decode_type_from_blob(blob),
   2283                                            length);
   2284    }
   2285    case GLSL_TYPE_STRUCT:
   2286    case GLSL_TYPE_INTERFACE: {
   2287       char *name = blob_read_string(blob);
   2288       unsigned num_fields = blob_read_uint32(blob);
   2289 
   2290       size_t s_field_size, s_field_ptrs;
   2291       get_struct_type_field_and_pointer_sizes(&s_field_size, &s_field_ptrs);
   2292 
   2293       glsl_struct_field *fields =
   2294          (glsl_struct_field *) malloc(s_field_size * num_fields);
   2295       for (unsigned i = 0; i < num_fields; i++) {
   2296          fields[i].type = decode_type_from_blob(blob);
   2297          fields[i].name = blob_read_string(blob);
   2298 
   2299          blob_copy_bytes(blob, ((uint8_t *) &fields[i]) + s_field_ptrs,
   2300                          s_field_size - s_field_ptrs);
   2301       }
   2302 
   2303       const glsl_type *t;
   2304       if (base_type == GLSL_TYPE_INTERFACE) {
   2305          enum glsl_interface_packing packing =
   2306             (glsl_interface_packing) blob_read_uint32(blob);
   2307          bool row_major = blob_read_uint32(blob);
   2308          t = glsl_type::get_interface_instance(fields, num_fields, packing,
   2309                                                row_major, name);
   2310       } else {
   2311          t = glsl_type::get_record_instance(fields, num_fields, name);
   2312       }
   2313 
   2314       free(fields);
   2315       return t;
   2316    }
   2317    case GLSL_TYPE_VOID:
   2318       return glsl_type::void_type;
   2319    case GLSL_TYPE_ERROR:
   2320    default:
   2321       assert(!"Cannot decode type!");
   2322       return NULL;
   2323    }
   2324 }
   2325