Home | History | Annotate | Line # | Download | only in spirv
      1 /*
      2  * Copyright  2015 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 DEALINGS
     21  * IN THE SOFTWARE.
     22  *
     23  * Authors:
     24  *    Jason Ekstrand (jason (at) jlekstrand.net)
     25  *
     26  */
     27 
     28 #include "vtn_private.h"
     29 #include "nir/nir_vla.h"
     30 #include "nir/nir_control_flow.h"
     31 #include "nir/nir_constant_expressions.h"
     32 #include "nir/nir_deref.h"
     33 #include "spirv_info.h"
     34 
     35 #include "util/format/u_format.h"
     36 #include "util/u_math.h"
     37 #include "util/u_string.h"
     38 
     39 #include <stdio.h>
     40 
     41 #ifndef NDEBUG
     42 static enum nir_spirv_debug_level
     43 vtn_default_log_level(void)
     44 {
     45    enum nir_spirv_debug_level level = NIR_SPIRV_DEBUG_LEVEL_WARNING;
     46    const char *vtn_log_level_strings[] = {
     47       [NIR_SPIRV_DEBUG_LEVEL_WARNING] = "warning",
     48       [NIR_SPIRV_DEBUG_LEVEL_INFO]  = "info",
     49       [NIR_SPIRV_DEBUG_LEVEL_ERROR] = "error",
     50    };
     51    const char *str = getenv("MESA_SPIRV_LOG_LEVEL");
     52 
     53    if (str == NULL)
     54       return NIR_SPIRV_DEBUG_LEVEL_WARNING;
     55 
     56    for (int i = 0; i < ARRAY_SIZE(vtn_log_level_strings); i++) {
     57       if (strcasecmp(str, vtn_log_level_strings[i]) == 0) {
     58          level = i;
     59          break;
     60       }
     61    }
     62 
     63    return level;
     64 }
     65 #endif
     66 
     67 void
     68 vtn_log(struct vtn_builder *b, enum nir_spirv_debug_level level,
     69         size_t spirv_offset, const char *message)
     70 {
     71    if (b->options->debug.func) {
     72       b->options->debug.func(b->options->debug.private_data,
     73                              level, spirv_offset, message);
     74    }
     75 
     76 #ifndef NDEBUG
     77    static enum nir_spirv_debug_level default_level =
     78       NIR_SPIRV_DEBUG_LEVEL_INVALID;
     79 
     80    if (default_level == NIR_SPIRV_DEBUG_LEVEL_INVALID)
     81       default_level = vtn_default_log_level();
     82 
     83    if (level >= default_level)
     84       fprintf(stderr, "%s\n", message);
     85 #endif
     86 }
     87 
     88 void
     89 vtn_logf(struct vtn_builder *b, enum nir_spirv_debug_level level,
     90          size_t spirv_offset, const char *fmt, ...)
     91 {
     92    va_list args;
     93    char *msg;
     94 
     95    va_start(args, fmt);
     96    msg = ralloc_vasprintf(NULL, fmt, args);
     97    va_end(args);
     98 
     99    vtn_log(b, level, spirv_offset, msg);
    100 
    101    ralloc_free(msg);
    102 }
    103 
    104 static void
    105 vtn_log_err(struct vtn_builder *b,
    106             enum nir_spirv_debug_level level, const char *prefix,
    107             const char *file, unsigned line,
    108             const char *fmt, va_list args)
    109 {
    110    char *msg;
    111 
    112    msg = ralloc_strdup(NULL, prefix);
    113 
    114 #ifndef NDEBUG
    115    ralloc_asprintf_append(&msg, "    In file %s:%u\n", file, line);
    116 #endif
    117 
    118    ralloc_asprintf_append(&msg, "    ");
    119 
    120    ralloc_vasprintf_append(&msg, fmt, args);
    121 
    122    ralloc_asprintf_append(&msg, "\n    %zu bytes into the SPIR-V binary",
    123                           b->spirv_offset);
    124 
    125    if (b->file) {
    126       ralloc_asprintf_append(&msg,
    127                              "\n    in SPIR-V source file %s, line %d, col %d",
    128                              b->file, b->line, b->col);
    129    }
    130 
    131    vtn_log(b, level, b->spirv_offset, msg);
    132 
    133    ralloc_free(msg);
    134 }
    135 
    136 static void
    137 vtn_dump_shader(struct vtn_builder *b, const char *path, const char *prefix)
    138 {
    139    static int idx = 0;
    140 
    141    char filename[1024];
    142    int len = snprintf(filename, sizeof(filename), "%s/%s-%d.spirv",
    143                       path, prefix, idx++);
    144    if (len < 0 || len >= sizeof(filename))
    145       return;
    146 
    147    FILE *f = fopen(filename, "w");
    148    if (f == NULL)
    149       return;
    150 
    151    fwrite(b->spirv, sizeof(*b->spirv), b->spirv_word_count, f);
    152    fclose(f);
    153 
    154    vtn_info("SPIR-V shader dumped to %s", filename);
    155 }
    156 
    157 void
    158 _vtn_warn(struct vtn_builder *b, const char *file, unsigned line,
    159           const char *fmt, ...)
    160 {
    161    va_list args;
    162 
    163    va_start(args, fmt);
    164    vtn_log_err(b, NIR_SPIRV_DEBUG_LEVEL_WARNING, "SPIR-V WARNING:\n",
    165                file, line, fmt, args);
    166    va_end(args);
    167 }
    168 
    169 void
    170 _vtn_err(struct vtn_builder *b, const char *file, unsigned line,
    171           const char *fmt, ...)
    172 {
    173    va_list args;
    174 
    175    va_start(args, fmt);
    176    vtn_log_err(b, NIR_SPIRV_DEBUG_LEVEL_ERROR, "SPIR-V ERROR:\n",
    177                file, line, fmt, args);
    178    va_end(args);
    179 }
    180 
    181 void
    182 _vtn_fail(struct vtn_builder *b, const char *file, unsigned line,
    183           const char *fmt, ...)
    184 {
    185    va_list args;
    186 
    187    va_start(args, fmt);
    188    vtn_log_err(b, NIR_SPIRV_DEBUG_LEVEL_ERROR, "SPIR-V parsing FAILED:\n",
    189                file, line, fmt, args);
    190    va_end(args);
    191 
    192    const char *dump_path = getenv("MESA_SPIRV_FAIL_DUMP_PATH");
    193    if (dump_path)
    194       vtn_dump_shader(b, dump_path, "fail");
    195 
    196    vtn_longjmp(b->fail_jump, 1);
    197 }
    198 
    199 static struct vtn_ssa_value *
    200 vtn_undef_ssa_value(struct vtn_builder *b, const struct glsl_type *type)
    201 {
    202    struct vtn_ssa_value *val = rzalloc(b, struct vtn_ssa_value);
    203    val->type = glsl_get_bare_type(type);
    204 
    205    if (glsl_type_is_vector_or_scalar(type)) {
    206       unsigned num_components = glsl_get_vector_elements(val->type);
    207       unsigned bit_size = glsl_get_bit_size(val->type);
    208       val->def = nir_ssa_undef(&b->nb, num_components, bit_size);
    209    } else {
    210       unsigned elems = glsl_get_length(val->type);
    211       val->elems = ralloc_array(b, struct vtn_ssa_value *, elems);
    212       if (glsl_type_is_array_or_matrix(type)) {
    213          const struct glsl_type *elem_type = glsl_get_array_element(type);
    214          for (unsigned i = 0; i < elems; i++)
    215             val->elems[i] = vtn_undef_ssa_value(b, elem_type);
    216       } else {
    217          vtn_assert(glsl_type_is_struct_or_ifc(type));
    218          for (unsigned i = 0; i < elems; i++) {
    219             const struct glsl_type *elem_type = glsl_get_struct_field(type, i);
    220             val->elems[i] = vtn_undef_ssa_value(b, elem_type);
    221          }
    222       }
    223    }
    224 
    225    return val;
    226 }
    227 
    228 struct vtn_ssa_value *
    229 vtn_const_ssa_value(struct vtn_builder *b, nir_constant *constant,
    230                     const struct glsl_type *type)
    231 {
    232    struct hash_entry *entry = _mesa_hash_table_search(b->const_table, constant);
    233 
    234    if (entry)
    235       return entry->data;
    236 
    237    struct vtn_ssa_value *val = rzalloc(b, struct vtn_ssa_value);
    238    val->type = glsl_get_bare_type(type);
    239 
    240    if (glsl_type_is_vector_or_scalar(type)) {
    241       unsigned num_components = glsl_get_vector_elements(val->type);
    242       unsigned bit_size = glsl_get_bit_size(type);
    243       nir_load_const_instr *load =
    244          nir_load_const_instr_create(b->shader, num_components, bit_size);
    245 
    246       memcpy(load->value, constant->values,
    247              sizeof(nir_const_value) * num_components);
    248 
    249       nir_instr_insert_before_cf_list(&b->nb.impl->body, &load->instr);
    250       val->def = &load->def;
    251    } else {
    252       unsigned elems = glsl_get_length(val->type);
    253       val->elems = ralloc_array(b, struct vtn_ssa_value *, elems);
    254       if (glsl_type_is_array_or_matrix(type)) {
    255          const struct glsl_type *elem_type = glsl_get_array_element(type);
    256          for (unsigned i = 0; i < elems; i++) {
    257             val->elems[i] = vtn_const_ssa_value(b, constant->elements[i],
    258                                                 elem_type);
    259          }
    260       } else {
    261          vtn_assert(glsl_type_is_struct_or_ifc(type));
    262          for (unsigned i = 0; i < elems; i++) {
    263             const struct glsl_type *elem_type = glsl_get_struct_field(type, i);
    264             val->elems[i] = vtn_const_ssa_value(b, constant->elements[i],
    265                                                 elem_type);
    266          }
    267       }
    268    }
    269 
    270    return val;
    271 }
    272 
    273 struct vtn_ssa_value *
    274 vtn_ssa_value(struct vtn_builder *b, uint32_t value_id)
    275 {
    276    struct vtn_value *val = vtn_untyped_value(b, value_id);
    277    switch (val->value_type) {
    278    case vtn_value_type_undef:
    279       return vtn_undef_ssa_value(b, val->type->type);
    280 
    281    case vtn_value_type_constant:
    282       return vtn_const_ssa_value(b, val->constant, val->type->type);
    283 
    284    case vtn_value_type_ssa:
    285       return val->ssa;
    286 
    287    case vtn_value_type_pointer:
    288       vtn_assert(val->pointer->ptr_type && val->pointer->ptr_type->type);
    289       struct vtn_ssa_value *ssa =
    290          vtn_create_ssa_value(b, val->pointer->ptr_type->type);
    291       ssa->def = vtn_pointer_to_ssa(b, val->pointer);
    292       return ssa;
    293 
    294    default:
    295       vtn_fail("Invalid type for an SSA value");
    296    }
    297 }
    298 
    299 struct vtn_value *
    300 vtn_push_ssa_value(struct vtn_builder *b, uint32_t value_id,
    301                    struct vtn_ssa_value *ssa)
    302 {
    303    struct vtn_type *type = vtn_get_value_type(b, value_id);
    304 
    305    /* See vtn_create_ssa_value */
    306    vtn_fail_if(ssa->type != glsl_get_bare_type(type->type),
    307                "Type mismatch for SPIR-V SSA value");
    308 
    309    struct vtn_value *val;
    310    if (type->base_type == vtn_base_type_pointer) {
    311       val = vtn_push_pointer(b, value_id, vtn_pointer_from_ssa(b, ssa->def, type));
    312    } else {
    313       /* Don't trip the value_type_ssa check in vtn_push_value */
    314       val = vtn_push_value(b, value_id, vtn_value_type_invalid);
    315       val->value_type = vtn_value_type_ssa;
    316       val->ssa = ssa;
    317    }
    318 
    319    return val;
    320 }
    321 
    322 nir_ssa_def *
    323 vtn_get_nir_ssa(struct vtn_builder *b, uint32_t value_id)
    324 {
    325    struct vtn_ssa_value *ssa = vtn_ssa_value(b, value_id);
    326    vtn_fail_if(!glsl_type_is_vector_or_scalar(ssa->type),
    327                "Expected a vector or scalar type");
    328    return ssa->def;
    329 }
    330 
    331 struct vtn_value *
    332 vtn_push_nir_ssa(struct vtn_builder *b, uint32_t value_id, nir_ssa_def *def)
    333 {
    334    /* Types for all SPIR-V SSA values are set as part of a pre-pass so the
    335     * type will be valid by the time we get here.
    336     */
    337    struct vtn_type *type = vtn_get_value_type(b, value_id);
    338    vtn_fail_if(def->num_components != glsl_get_vector_elements(type->type) ||
    339                def->bit_size != glsl_get_bit_size(type->type),
    340                "Mismatch between NIR and SPIR-V type.");
    341    struct vtn_ssa_value *ssa = vtn_create_ssa_value(b, type->type);
    342    ssa->def = def;
    343    return vtn_push_ssa_value(b, value_id, ssa);
    344 }
    345 
    346 static enum gl_access_qualifier
    347 spirv_to_gl_access_qualifier(struct vtn_builder *b,
    348                              SpvAccessQualifier access_qualifier)
    349 {
    350    switch (access_qualifier) {
    351    case SpvAccessQualifierReadOnly:
    352       return ACCESS_NON_WRITEABLE;
    353    case SpvAccessQualifierWriteOnly:
    354       return ACCESS_NON_READABLE;
    355    case SpvAccessQualifierReadWrite:
    356       return 0;
    357    default:
    358       vtn_fail("Invalid image access qualifier");
    359    }
    360 }
    361 
    362 static nir_deref_instr *
    363 vtn_get_image(struct vtn_builder *b, uint32_t value_id,
    364               enum gl_access_qualifier *access)
    365 {
    366    struct vtn_type *type = vtn_get_value_type(b, value_id);
    367    vtn_assert(type->base_type == vtn_base_type_image);
    368    if (access)
    369       *access |= spirv_to_gl_access_qualifier(b, type->access_qualifier);
    370    return nir_build_deref_cast(&b->nb, vtn_get_nir_ssa(b, value_id),
    371                                nir_var_uniform, type->glsl_image, 0);
    372 }
    373 
    374 static void
    375 vtn_push_image(struct vtn_builder *b, uint32_t value_id,
    376                nir_deref_instr *deref, bool propagate_non_uniform)
    377 {
    378    struct vtn_type *type = vtn_get_value_type(b, value_id);
    379    vtn_assert(type->base_type == vtn_base_type_image);
    380    struct vtn_value *value = vtn_push_nir_ssa(b, value_id, &deref->dest.ssa);
    381    value->propagated_non_uniform = propagate_non_uniform;
    382 }
    383 
    384 static nir_deref_instr *
    385 vtn_get_sampler(struct vtn_builder *b, uint32_t value_id)
    386 {
    387    struct vtn_type *type = vtn_get_value_type(b, value_id);
    388    vtn_assert(type->base_type == vtn_base_type_sampler);
    389    return nir_build_deref_cast(&b->nb, vtn_get_nir_ssa(b, value_id),
    390                                nir_var_uniform, glsl_bare_sampler_type(), 0);
    391 }
    392 
    393 nir_ssa_def *
    394 vtn_sampled_image_to_nir_ssa(struct vtn_builder *b,
    395                              struct vtn_sampled_image si)
    396 {
    397    return nir_vec2(&b->nb, &si.image->dest.ssa, &si.sampler->dest.ssa);
    398 }
    399 
    400 static void
    401 vtn_push_sampled_image(struct vtn_builder *b, uint32_t value_id,
    402                        struct vtn_sampled_image si, bool propagate_non_uniform)
    403 {
    404    struct vtn_type *type = vtn_get_value_type(b, value_id);
    405    vtn_assert(type->base_type == vtn_base_type_sampled_image);
    406    struct vtn_value *value = vtn_push_nir_ssa(b, value_id,
    407                                               vtn_sampled_image_to_nir_ssa(b, si));
    408    value->propagated_non_uniform = propagate_non_uniform;
    409 }
    410 
    411 static struct vtn_sampled_image
    412 vtn_get_sampled_image(struct vtn_builder *b, uint32_t value_id)
    413 {
    414    struct vtn_type *type = vtn_get_value_type(b, value_id);
    415    vtn_assert(type->base_type == vtn_base_type_sampled_image);
    416    nir_ssa_def *si_vec2 = vtn_get_nir_ssa(b, value_id);
    417 
    418    struct vtn_sampled_image si = { NULL, };
    419    si.image = nir_build_deref_cast(&b->nb, nir_channel(&b->nb, si_vec2, 0),
    420                                    nir_var_uniform,
    421                                    type->image->glsl_image, 0);
    422    si.sampler = nir_build_deref_cast(&b->nb, nir_channel(&b->nb, si_vec2, 1),
    423                                      nir_var_uniform,
    424                                      glsl_bare_sampler_type(), 0);
    425    return si;
    426 }
    427 
    428 static const char *
    429 vtn_string_literal(struct vtn_builder *b, const uint32_t *words,
    430                    unsigned word_count, unsigned *words_used)
    431 {
    432    /* From the SPIR-V spec:
    433     *
    434     *    "A string is interpreted as a nul-terminated stream of characters.
    435     *    The character set is Unicode in the UTF-8 encoding scheme. The UTF-8
    436     *    octets (8-bit bytes) are packed four per word, following the
    437     *    little-endian convention (i.e., the first octet is in the
    438     *    lowest-order 8 bits of the word). The final word contains the
    439     *    strings nul-termination character (0), and all contents past the
    440     *    end of the string in the final word are padded with 0."
    441     *
    442     * On big-endian, we need to byte-swap.
    443     */
    444 #if UTIL_ARCH_BIG_ENDIAN
    445    {
    446       uint32_t *copy = ralloc_array(b, uint32_t, word_count);
    447       for (unsigned i = 0; i < word_count; i++)
    448          copy[i] = util_bswap32(words[i]);
    449       words = copy;
    450    }
    451 #endif
    452 
    453    const char *str = (char *)words;
    454    const char *end = memchr(str, 0, word_count * 4);
    455    vtn_fail_if(end == NULL, "String is not null-terminated");
    456 
    457    if (words_used)
    458       *words_used = DIV_ROUND_UP(end - str + 1, sizeof(*words));
    459 
    460    return str;
    461 }
    462 
    463 const uint32_t *
    464 vtn_foreach_instruction(struct vtn_builder *b, const uint32_t *start,
    465                         const uint32_t *end, vtn_instruction_handler handler)
    466 {
    467    b->file = NULL;
    468    b->line = -1;
    469    b->col = -1;
    470 
    471    const uint32_t *w = start;
    472    while (w < end) {
    473       SpvOp opcode = w[0] & SpvOpCodeMask;
    474       unsigned count = w[0] >> SpvWordCountShift;
    475       vtn_assert(count >= 1 && w + count <= end);
    476 
    477       b->spirv_offset = (uint8_t *)w - (uint8_t *)b->spirv;
    478 
    479       switch (opcode) {
    480       case SpvOpNop:
    481          break; /* Do nothing */
    482 
    483       case SpvOpLine:
    484          b->file = vtn_value(b, w[1], vtn_value_type_string)->str;
    485          b->line = w[2];
    486          b->col = w[3];
    487          break;
    488 
    489       case SpvOpNoLine:
    490          b->file = NULL;
    491          b->line = -1;
    492          b->col = -1;
    493          break;
    494 
    495       default:
    496          if (!handler(b, opcode, w, count))
    497             return w;
    498          break;
    499       }
    500 
    501       w += count;
    502    }
    503 
    504    b->spirv_offset = 0;
    505    b->file = NULL;
    506    b->line = -1;
    507    b->col = -1;
    508 
    509    assert(w == end);
    510    return w;
    511 }
    512 
    513 static bool
    514 vtn_handle_non_semantic_instruction(struct vtn_builder *b, SpvOp ext_opcode,
    515                                     const uint32_t *w, unsigned count)
    516 {
    517    /* Do nothing. */
    518    return true;
    519 }
    520 
    521 static void
    522 vtn_handle_extension(struct vtn_builder *b, SpvOp opcode,
    523                      const uint32_t *w, unsigned count)
    524 {
    525    switch (opcode) {
    526    case SpvOpExtInstImport: {
    527       struct vtn_value *val = vtn_push_value(b, w[1], vtn_value_type_extension);
    528       const char *ext = vtn_string_literal(b, &w[2], count - 2, NULL);
    529       if (strcmp(ext, "GLSL.std.450") == 0) {
    530          val->ext_handler = vtn_handle_glsl450_instruction;
    531       } else if ((strcmp(ext, "SPV_AMD_gcn_shader") == 0)
    532                 && (b->options && b->options->caps.amd_gcn_shader)) {
    533          val->ext_handler = vtn_handle_amd_gcn_shader_instruction;
    534       } else if ((strcmp(ext, "SPV_AMD_shader_ballot") == 0)
    535                 && (b->options && b->options->caps.amd_shader_ballot)) {
    536          val->ext_handler = vtn_handle_amd_shader_ballot_instruction;
    537       } else if ((strcmp(ext, "SPV_AMD_shader_trinary_minmax") == 0)
    538                 && (b->options && b->options->caps.amd_trinary_minmax)) {
    539          val->ext_handler = vtn_handle_amd_shader_trinary_minmax_instruction;
    540       } else if ((strcmp(ext, "SPV_AMD_shader_explicit_vertex_parameter") == 0)
    541                 && (b->options && b->options->caps.amd_shader_explicit_vertex_parameter)) {
    542          val->ext_handler = vtn_handle_amd_shader_explicit_vertex_parameter_instruction;
    543       } else if (strcmp(ext, "OpenCL.std") == 0) {
    544          val->ext_handler = vtn_handle_opencl_instruction;
    545       } else if (strstr(ext, "NonSemantic.") == ext) {
    546          val->ext_handler = vtn_handle_non_semantic_instruction;
    547       } else {
    548          vtn_fail("Unsupported extension: %s", ext);
    549       }
    550       break;
    551    }
    552 
    553    case SpvOpExtInst: {
    554       struct vtn_value *val = vtn_value(b, w[3], vtn_value_type_extension);
    555       bool handled = val->ext_handler(b, w[4], w, count);
    556       vtn_assert(handled);
    557       break;
    558    }
    559 
    560    default:
    561       vtn_fail_with_opcode("Unhandled opcode", opcode);
    562    }
    563 }
    564 
    565 static void
    566 _foreach_decoration_helper(struct vtn_builder *b,
    567                            struct vtn_value *base_value,
    568                            int parent_member,
    569                            struct vtn_value *value,
    570                            vtn_decoration_foreach_cb cb, void *data)
    571 {
    572    for (struct vtn_decoration *dec = value->decoration; dec; dec = dec->next) {
    573       int member;
    574       if (dec->scope == VTN_DEC_DECORATION) {
    575          member = parent_member;
    576       } else if (dec->scope >= VTN_DEC_STRUCT_MEMBER0) {
    577          vtn_fail_if(value->value_type != vtn_value_type_type ||
    578                      value->type->base_type != vtn_base_type_struct,
    579                      "OpMemberDecorate and OpGroupMemberDecorate are only "
    580                      "allowed on OpTypeStruct");
    581          /* This means we haven't recursed yet */
    582          assert(value == base_value);
    583 
    584          member = dec->scope - VTN_DEC_STRUCT_MEMBER0;
    585 
    586          vtn_fail_if(member >= base_value->type->length,
    587                      "OpMemberDecorate specifies member %d but the "
    588                      "OpTypeStruct has only %u members",
    589                      member, base_value->type->length);
    590       } else {
    591          /* Not a decoration */
    592          assert(dec->scope == VTN_DEC_EXECUTION_MODE);
    593          continue;
    594       }
    595 
    596       if (dec->group) {
    597          assert(dec->group->value_type == vtn_value_type_decoration_group);
    598          _foreach_decoration_helper(b, base_value, member, dec->group,
    599                                     cb, data);
    600       } else {
    601          cb(b, base_value, member, dec, data);
    602       }
    603    }
    604 }
    605 
    606 /** Iterates (recursively if needed) over all of the decorations on a value
    607  *
    608  * This function iterates over all of the decorations applied to a given
    609  * value.  If it encounters a decoration group, it recurses into the group
    610  * and iterates over all of those decorations as well.
    611  */
    612 void
    613 vtn_foreach_decoration(struct vtn_builder *b, struct vtn_value *value,
    614                        vtn_decoration_foreach_cb cb, void *data)
    615 {
    616    _foreach_decoration_helper(b, value, -1, value, cb, data);
    617 }
    618 
    619 void
    620 vtn_foreach_execution_mode(struct vtn_builder *b, struct vtn_value *value,
    621                            vtn_execution_mode_foreach_cb cb, void *data)
    622 {
    623    for (struct vtn_decoration *dec = value->decoration; dec; dec = dec->next) {
    624       if (dec->scope != VTN_DEC_EXECUTION_MODE)
    625          continue;
    626 
    627       assert(dec->group == NULL);
    628       cb(b, value, dec, data);
    629    }
    630 }
    631 
    632 void
    633 vtn_handle_decoration(struct vtn_builder *b, SpvOp opcode,
    634                       const uint32_t *w, unsigned count)
    635 {
    636    const uint32_t *w_end = w + count;
    637    const uint32_t target = w[1];
    638    w += 2;
    639 
    640    switch (opcode) {
    641    case SpvOpDecorationGroup:
    642       vtn_push_value(b, target, vtn_value_type_decoration_group);
    643       break;
    644 
    645    case SpvOpDecorate:
    646    case SpvOpDecorateId:
    647    case SpvOpMemberDecorate:
    648    case SpvOpDecorateString:
    649    case SpvOpMemberDecorateString:
    650    case SpvOpExecutionMode:
    651    case SpvOpExecutionModeId: {
    652       struct vtn_value *val = vtn_untyped_value(b, target);
    653 
    654       struct vtn_decoration *dec = rzalloc(b, struct vtn_decoration);
    655       switch (opcode) {
    656       case SpvOpDecorate:
    657       case SpvOpDecorateId:
    658       case SpvOpDecorateString:
    659          dec->scope = VTN_DEC_DECORATION;
    660          break;
    661       case SpvOpMemberDecorate:
    662       case SpvOpMemberDecorateString:
    663          dec->scope = VTN_DEC_STRUCT_MEMBER0 + *(w++);
    664          vtn_fail_if(dec->scope < VTN_DEC_STRUCT_MEMBER0, /* overflow */
    665                      "Member argument of OpMemberDecorate too large");
    666          break;
    667       case SpvOpExecutionMode:
    668       case SpvOpExecutionModeId:
    669          dec->scope = VTN_DEC_EXECUTION_MODE;
    670          break;
    671       default:
    672          unreachable("Invalid decoration opcode");
    673       }
    674       dec->decoration = *(w++);
    675       dec->operands = w;
    676 
    677       /* Link into the list */
    678       dec->next = val->decoration;
    679       val->decoration = dec;
    680       break;
    681    }
    682 
    683    case SpvOpGroupMemberDecorate:
    684    case SpvOpGroupDecorate: {
    685       struct vtn_value *group =
    686          vtn_value(b, target, vtn_value_type_decoration_group);
    687 
    688       for (; w < w_end; w++) {
    689          struct vtn_value *val = vtn_untyped_value(b, *w);
    690          struct vtn_decoration *dec = rzalloc(b, struct vtn_decoration);
    691 
    692          dec->group = group;
    693          if (opcode == SpvOpGroupDecorate) {
    694             dec->scope = VTN_DEC_DECORATION;
    695          } else {
    696             dec->scope = VTN_DEC_STRUCT_MEMBER0 + *(++w);
    697             vtn_fail_if(dec->scope < 0, /* Check for overflow */
    698                         "Member argument of OpGroupMemberDecorate too large");
    699          }
    700 
    701          /* Link into the list */
    702          dec->next = val->decoration;
    703          val->decoration = dec;
    704       }
    705       break;
    706    }
    707 
    708    default:
    709       unreachable("Unhandled opcode");
    710    }
    711 }
    712 
    713 struct member_decoration_ctx {
    714    unsigned num_fields;
    715    struct glsl_struct_field *fields;
    716    struct vtn_type *type;
    717 };
    718 
    719 /**
    720  * Returns true if the given type contains a struct decorated Block or
    721  * BufferBlock
    722  */
    723 bool
    724 vtn_type_contains_block(struct vtn_builder *b, struct vtn_type *type)
    725 {
    726    switch (type->base_type) {
    727    case vtn_base_type_array:
    728       return vtn_type_contains_block(b, type->array_element);
    729    case vtn_base_type_struct:
    730       if (type->block || type->buffer_block)
    731          return true;
    732       for (unsigned i = 0; i < type->length; i++) {
    733          if (vtn_type_contains_block(b, type->members[i]))
    734             return true;
    735       }
    736       return false;
    737    default:
    738       return false;
    739    }
    740 }
    741 
    742 /** Returns true if two types are "compatible", i.e. you can do an OpLoad,
    743  * OpStore, or OpCopyMemory between them without breaking anything.
    744  * Technically, the SPIR-V rules require the exact same type ID but this lets
    745  * us internally be a bit looser.
    746  */
    747 bool
    748 vtn_types_compatible(struct vtn_builder *b,
    749                      struct vtn_type *t1, struct vtn_type *t2)
    750 {
    751    if (t1->id == t2->id)
    752       return true;
    753 
    754    if (t1->base_type != t2->base_type)
    755       return false;
    756 
    757    switch (t1->base_type) {
    758    case vtn_base_type_void:
    759    case vtn_base_type_scalar:
    760    case vtn_base_type_vector:
    761    case vtn_base_type_matrix:
    762    case vtn_base_type_image:
    763    case vtn_base_type_sampler:
    764    case vtn_base_type_sampled_image:
    765    case vtn_base_type_event:
    766       return t1->type == t2->type;
    767 
    768    case vtn_base_type_array:
    769       return t1->length == t2->length &&
    770              vtn_types_compatible(b, t1->array_element, t2->array_element);
    771 
    772    case vtn_base_type_pointer:
    773       return vtn_types_compatible(b, t1->deref, t2->deref);
    774 
    775    case vtn_base_type_struct:
    776       if (t1->length != t2->length)
    777          return false;
    778 
    779       for (unsigned i = 0; i < t1->length; i++) {
    780          if (!vtn_types_compatible(b, t1->members[i], t2->members[i]))
    781             return false;
    782       }
    783       return true;
    784 
    785    case vtn_base_type_accel_struct:
    786       return true;
    787 
    788    case vtn_base_type_function:
    789       /* This case shouldn't get hit since you can't copy around function
    790        * types.  Just require them to be identical.
    791        */
    792       return false;
    793    }
    794 
    795    vtn_fail("Invalid base type");
    796 }
    797 
    798 struct vtn_type *
    799 vtn_type_without_array(struct vtn_type *type)
    800 {
    801    while (type->base_type == vtn_base_type_array)
    802       type = type->array_element;
    803    return type;
    804 }
    805 
    806 /* does a shallow copy of a vtn_type */
    807 
    808 static struct vtn_type *
    809 vtn_type_copy(struct vtn_builder *b, struct vtn_type *src)
    810 {
    811    struct vtn_type *dest = ralloc(b, struct vtn_type);
    812    *dest = *src;
    813 
    814    switch (src->base_type) {
    815    case vtn_base_type_void:
    816    case vtn_base_type_scalar:
    817    case vtn_base_type_vector:
    818    case vtn_base_type_matrix:
    819    case vtn_base_type_array:
    820    case vtn_base_type_pointer:
    821    case vtn_base_type_image:
    822    case vtn_base_type_sampler:
    823    case vtn_base_type_sampled_image:
    824    case vtn_base_type_event:
    825    case vtn_base_type_accel_struct:
    826       /* Nothing more to do */
    827       break;
    828 
    829    case vtn_base_type_struct:
    830       dest->members = ralloc_array(b, struct vtn_type *, src->length);
    831       memcpy(dest->members, src->members,
    832              src->length * sizeof(src->members[0]));
    833 
    834       dest->offsets = ralloc_array(b, unsigned, src->length);
    835       memcpy(dest->offsets, src->offsets,
    836              src->length * sizeof(src->offsets[0]));
    837       break;
    838 
    839    case vtn_base_type_function:
    840       dest->params = ralloc_array(b, struct vtn_type *, src->length);
    841       memcpy(dest->params, src->params, src->length * sizeof(src->params[0]));
    842       break;
    843    }
    844 
    845    return dest;
    846 }
    847 
    848 static const struct glsl_type *
    849 wrap_type_in_array(const struct glsl_type *type,
    850                    const struct glsl_type *array_type)
    851 {
    852    if (!glsl_type_is_array(array_type))
    853       return type;
    854 
    855    const struct glsl_type *elem_type =
    856       wrap_type_in_array(type, glsl_get_array_element(array_type));
    857    return glsl_array_type(elem_type, glsl_get_length(array_type),
    858                           glsl_get_explicit_stride(array_type));
    859 }
    860 
    861 static bool
    862 vtn_type_needs_explicit_layout(struct vtn_builder *b, struct vtn_type *type,
    863                                enum vtn_variable_mode mode)
    864 {
    865    /* For OpenCL we never want to strip the info from the types, and it makes
    866     * type comparisons easier in later stages.
    867     */
    868    if (b->options->environment == NIR_SPIRV_OPENCL)
    869       return true;
    870 
    871    switch (mode) {
    872    case vtn_variable_mode_input:
    873    case vtn_variable_mode_output:
    874       /* Layout decorations kept because we need offsets for XFB arrays of
    875        * blocks.
    876        */
    877       return b->shader->info.has_transform_feedback_varyings;
    878 
    879    case vtn_variable_mode_ssbo:
    880    case vtn_variable_mode_phys_ssbo:
    881    case vtn_variable_mode_ubo:
    882    case vtn_variable_mode_push_constant:
    883    case vtn_variable_mode_shader_record:
    884       return true;
    885 
    886    case vtn_variable_mode_workgroup:
    887       return b->options->caps.workgroup_memory_explicit_layout;
    888 
    889    default:
    890       return false;
    891    }
    892 }
    893 
    894 const struct glsl_type *
    895 vtn_type_get_nir_type(struct vtn_builder *b, struct vtn_type *type,
    896                       enum vtn_variable_mode mode)
    897 {
    898    if (mode == vtn_variable_mode_atomic_counter) {
    899       vtn_fail_if(glsl_without_array(type->type) != glsl_uint_type(),
    900                   "Variables in the AtomicCounter storage class should be "
    901                   "(possibly arrays of arrays of) uint.");
    902       return wrap_type_in_array(glsl_atomic_uint_type(), type->type);
    903    }
    904 
    905    if (mode == vtn_variable_mode_uniform) {
    906       switch (type->base_type) {
    907       case vtn_base_type_array: {
    908          const struct glsl_type *elem_type =
    909             vtn_type_get_nir_type(b, type->array_element, mode);
    910 
    911          return glsl_array_type(elem_type, type->length,
    912                                 glsl_get_explicit_stride(type->type));
    913       }
    914 
    915       case vtn_base_type_struct: {
    916          bool need_new_struct = false;
    917          const uint32_t num_fields = type->length;
    918          NIR_VLA(struct glsl_struct_field, fields, num_fields);
    919          for (unsigned i = 0; i < num_fields; i++) {
    920             fields[i] = *glsl_get_struct_field_data(type->type, i);
    921             const struct glsl_type *field_nir_type =
    922                vtn_type_get_nir_type(b, type->members[i], mode);
    923             if (fields[i].type != field_nir_type) {
    924                fields[i].type = field_nir_type;
    925                need_new_struct = true;
    926             }
    927          }
    928          if (need_new_struct) {
    929             if (glsl_type_is_interface(type->type)) {
    930                return glsl_interface_type(fields, num_fields,
    931                                           /* packing */ 0, false,
    932                                           glsl_get_type_name(type->type));
    933             } else {
    934                return glsl_struct_type(fields, num_fields,
    935                                        glsl_get_type_name(type->type),
    936                                        glsl_struct_type_is_packed(type->type));
    937             }
    938          } else {
    939             /* No changes, just pass it on */
    940             return type->type;
    941          }
    942       }
    943 
    944       case vtn_base_type_image:
    945          return type->glsl_image;
    946 
    947       case vtn_base_type_sampler:
    948          return glsl_bare_sampler_type();
    949 
    950       case vtn_base_type_sampled_image:
    951          return type->image->glsl_image;
    952 
    953       default:
    954          return type->type;
    955       }
    956    }
    957 
    958    /* Layout decorations are allowed but ignored in certain conditions,
    959     * to allow SPIR-V generators perform type deduplication.  Discard
    960     * unnecessary ones when passing to NIR.
    961     */
    962    if (!vtn_type_needs_explicit_layout(b, type, mode))
    963       return glsl_get_bare_type(type->type);
    964 
    965    return type->type;
    966 }
    967 
    968 static struct vtn_type *
    969 mutable_matrix_member(struct vtn_builder *b, struct vtn_type *type, int member)
    970 {
    971    type->members[member] = vtn_type_copy(b, type->members[member]);
    972    type = type->members[member];
    973 
    974    /* We may have an array of matrices.... Oh, joy! */
    975    while (glsl_type_is_array(type->type)) {
    976       type->array_element = vtn_type_copy(b, type->array_element);
    977       type = type->array_element;
    978    }
    979 
    980    vtn_assert(glsl_type_is_matrix(type->type));
    981 
    982    return type;
    983 }
    984 
    985 static void
    986 vtn_handle_access_qualifier(struct vtn_builder *b, struct vtn_type *type,
    987                             int member, enum gl_access_qualifier access)
    988 {
    989    type->members[member] = vtn_type_copy(b, type->members[member]);
    990    type = type->members[member];
    991 
    992    type->access |= access;
    993 }
    994 
    995 static void
    996 array_stride_decoration_cb(struct vtn_builder *b,
    997                            struct vtn_value *val, int member,
    998                            const struct vtn_decoration *dec, void *void_ctx)
    999 {
   1000    struct vtn_type *type = val->type;
   1001 
   1002    if (dec->decoration == SpvDecorationArrayStride) {
   1003       if (vtn_type_contains_block(b, type)) {
   1004          vtn_warn("The ArrayStride decoration cannot be applied to an array "
   1005                   "type which contains a structure type decorated Block "
   1006                   "or BufferBlock");
   1007          /* Ignore the decoration */
   1008       } else {
   1009          vtn_fail_if(dec->operands[0] == 0, "ArrayStride must be non-zero");
   1010          type->stride = dec->operands[0];
   1011       }
   1012    }
   1013 }
   1014 
   1015 static void
   1016 struct_member_decoration_cb(struct vtn_builder *b,
   1017                             UNUSED struct vtn_value *val, int member,
   1018                             const struct vtn_decoration *dec, void *void_ctx)
   1019 {
   1020    struct member_decoration_ctx *ctx = void_ctx;
   1021 
   1022    if (member < 0)
   1023       return;
   1024 
   1025    assert(member < ctx->num_fields);
   1026 
   1027    switch (dec->decoration) {
   1028    case SpvDecorationRelaxedPrecision:
   1029    case SpvDecorationUniform:
   1030    case SpvDecorationUniformId:
   1031       break; /* FIXME: Do nothing with this for now. */
   1032    case SpvDecorationNonWritable:
   1033       vtn_handle_access_qualifier(b, ctx->type, member, ACCESS_NON_WRITEABLE);
   1034       break;
   1035    case SpvDecorationNonReadable:
   1036       vtn_handle_access_qualifier(b, ctx->type, member, ACCESS_NON_READABLE);
   1037       break;
   1038    case SpvDecorationVolatile:
   1039       vtn_handle_access_qualifier(b, ctx->type, member, ACCESS_VOLATILE);
   1040       break;
   1041    case SpvDecorationCoherent:
   1042       vtn_handle_access_qualifier(b, ctx->type, member, ACCESS_COHERENT);
   1043       break;
   1044    case SpvDecorationNoPerspective:
   1045       ctx->fields[member].interpolation = INTERP_MODE_NOPERSPECTIVE;
   1046       break;
   1047    case SpvDecorationFlat:
   1048       ctx->fields[member].interpolation = INTERP_MODE_FLAT;
   1049       break;
   1050    case SpvDecorationExplicitInterpAMD:
   1051       ctx->fields[member].interpolation = INTERP_MODE_EXPLICIT;
   1052       break;
   1053    case SpvDecorationCentroid:
   1054       ctx->fields[member].centroid = true;
   1055       break;
   1056    case SpvDecorationSample:
   1057       ctx->fields[member].sample = true;
   1058       break;
   1059    case SpvDecorationStream:
   1060       /* This is handled later by var_decoration_cb in vtn_variables.c */
   1061       break;
   1062    case SpvDecorationLocation:
   1063       ctx->fields[member].location = dec->operands[0];
   1064       break;
   1065    case SpvDecorationComponent:
   1066       break; /* FIXME: What should we do with these? */
   1067    case SpvDecorationBuiltIn:
   1068       ctx->type->members[member] = vtn_type_copy(b, ctx->type->members[member]);
   1069       ctx->type->members[member]->is_builtin = true;
   1070       ctx->type->members[member]->builtin = dec->operands[0];
   1071       ctx->type->builtin_block = true;
   1072       break;
   1073    case SpvDecorationOffset:
   1074       ctx->type->offsets[member] = dec->operands[0];
   1075       ctx->fields[member].offset = dec->operands[0];
   1076       break;
   1077    case SpvDecorationMatrixStride:
   1078       /* Handled as a second pass */
   1079       break;
   1080    case SpvDecorationColMajor:
   1081       break; /* Nothing to do here.  Column-major is the default. */
   1082    case SpvDecorationRowMajor:
   1083       mutable_matrix_member(b, ctx->type, member)->row_major = true;
   1084       break;
   1085 
   1086    case SpvDecorationPatch:
   1087    case SpvDecorationPerPrimitiveNV:
   1088    case SpvDecorationPerTaskNV:
   1089       break;
   1090 
   1091    case SpvDecorationSpecId:
   1092    case SpvDecorationBlock:
   1093    case SpvDecorationBufferBlock:
   1094    case SpvDecorationArrayStride:
   1095    case SpvDecorationGLSLShared:
   1096    case SpvDecorationGLSLPacked:
   1097    case SpvDecorationInvariant:
   1098    case SpvDecorationRestrict:
   1099    case SpvDecorationAliased:
   1100    case SpvDecorationConstant:
   1101    case SpvDecorationIndex:
   1102    case SpvDecorationBinding:
   1103    case SpvDecorationDescriptorSet:
   1104    case SpvDecorationLinkageAttributes:
   1105    case SpvDecorationNoContraction:
   1106    case SpvDecorationInputAttachmentIndex:
   1107    case SpvDecorationCPacked:
   1108       vtn_warn("Decoration not allowed on struct members: %s",
   1109                spirv_decoration_to_string(dec->decoration));
   1110       break;
   1111 
   1112    case SpvDecorationXfbBuffer:
   1113    case SpvDecorationXfbStride:
   1114       /* This is handled later by var_decoration_cb in vtn_variables.c */
   1115       break;
   1116 
   1117    case SpvDecorationSaturatedConversion:
   1118    case SpvDecorationFuncParamAttr:
   1119    case SpvDecorationFPRoundingMode:
   1120    case SpvDecorationFPFastMathMode:
   1121    case SpvDecorationAlignment:
   1122       if (b->shader->info.stage != MESA_SHADER_KERNEL) {
   1123          vtn_warn("Decoration only allowed for CL-style kernels: %s",
   1124                   spirv_decoration_to_string(dec->decoration));
   1125       }
   1126       break;
   1127 
   1128    case SpvDecorationUserSemantic:
   1129    case SpvDecorationUserTypeGOOGLE:
   1130       /* User semantic decorations can safely be ignored by the driver. */
   1131       break;
   1132 
   1133    case SpvDecorationPerViewNV:
   1134       /* TODO(mesh): Handle multiview. */
   1135       vtn_warn("Mesh multiview not yet supported. Needed for decoration PerViewNV.");
   1136       break;
   1137 
   1138    default:
   1139       vtn_fail_with_decoration("Unhandled decoration", dec->decoration);
   1140    }
   1141 }
   1142 
   1143 /** Chases the array type all the way down to the tail and rewrites the
   1144  * glsl_types to be based off the tail's glsl_type.
   1145  */
   1146 static void
   1147 vtn_array_type_rewrite_glsl_type(struct vtn_type *type)
   1148 {
   1149    if (type->base_type != vtn_base_type_array)
   1150       return;
   1151 
   1152    vtn_array_type_rewrite_glsl_type(type->array_element);
   1153 
   1154    type->type = glsl_array_type(type->array_element->type,
   1155                                 type->length, type->stride);
   1156 }
   1157 
   1158 /* Matrix strides are handled as a separate pass because we need to know
   1159  * whether the matrix is row-major or not first.
   1160  */
   1161 static void
   1162 struct_member_matrix_stride_cb(struct vtn_builder *b,
   1163                                UNUSED struct vtn_value *val, int member,
   1164                                const struct vtn_decoration *dec,
   1165                                void *void_ctx)
   1166 {
   1167    if (dec->decoration != SpvDecorationMatrixStride)
   1168       return;
   1169 
   1170    vtn_fail_if(member < 0,
   1171                "The MatrixStride decoration is only allowed on members "
   1172                "of OpTypeStruct");
   1173    vtn_fail_if(dec->operands[0] == 0, "MatrixStride must be non-zero");
   1174 
   1175    struct member_decoration_ctx *ctx = void_ctx;
   1176 
   1177    struct vtn_type *mat_type = mutable_matrix_member(b, ctx->type, member);
   1178    if (mat_type->row_major) {
   1179       mat_type->array_element = vtn_type_copy(b, mat_type->array_element);
   1180       mat_type->stride = mat_type->array_element->stride;
   1181       mat_type->array_element->stride = dec->operands[0];
   1182 
   1183       mat_type->type = glsl_explicit_matrix_type(mat_type->type,
   1184                                                  dec->operands[0], true);
   1185       mat_type->array_element->type = glsl_get_column_type(mat_type->type);
   1186    } else {
   1187       vtn_assert(mat_type->array_element->stride > 0);
   1188       mat_type->stride = dec->operands[0];
   1189 
   1190       mat_type->type = glsl_explicit_matrix_type(mat_type->type,
   1191                                                  dec->operands[0], false);
   1192    }
   1193 
   1194    /* Now that we've replaced the glsl_type with a properly strided matrix
   1195     * type, rewrite the member type so that it's an array of the proper kind
   1196     * of glsl_type.
   1197     */
   1198    vtn_array_type_rewrite_glsl_type(ctx->type->members[member]);
   1199    ctx->fields[member].type = ctx->type->members[member]->type;
   1200 }
   1201 
   1202 static void
   1203 struct_packed_decoration_cb(struct vtn_builder *b,
   1204                             struct vtn_value *val, int member,
   1205                             const struct vtn_decoration *dec, void *void_ctx)
   1206 {
   1207    vtn_assert(val->type->base_type == vtn_base_type_struct);
   1208    if (dec->decoration == SpvDecorationCPacked) {
   1209       if (b->shader->info.stage != MESA_SHADER_KERNEL) {
   1210          vtn_warn("Decoration only allowed for CL-style kernels: %s",
   1211                   spirv_decoration_to_string(dec->decoration));
   1212       }
   1213       val->type->packed = true;
   1214    }
   1215 }
   1216 
   1217 static void
   1218 struct_block_decoration_cb(struct vtn_builder *b,
   1219                            struct vtn_value *val, int member,
   1220                            const struct vtn_decoration *dec, void *ctx)
   1221 {
   1222    if (member != -1)
   1223       return;
   1224 
   1225    struct vtn_type *type = val->type;
   1226    if (dec->decoration == SpvDecorationBlock)
   1227       type->block = true;
   1228    else if (dec->decoration == SpvDecorationBufferBlock)
   1229       type->buffer_block = true;
   1230 }
   1231 
   1232 static void
   1233 type_decoration_cb(struct vtn_builder *b,
   1234                    struct vtn_value *val, int member,
   1235                    const struct vtn_decoration *dec, UNUSED void *ctx)
   1236 {
   1237    struct vtn_type *type = val->type;
   1238 
   1239    if (member != -1) {
   1240       /* This should have been handled by OpTypeStruct */
   1241       assert(val->type->base_type == vtn_base_type_struct);
   1242       assert(member >= 0 && member < val->type->length);
   1243       return;
   1244    }
   1245 
   1246    switch (dec->decoration) {
   1247    case SpvDecorationArrayStride:
   1248       vtn_assert(type->base_type == vtn_base_type_array ||
   1249                  type->base_type == vtn_base_type_pointer);
   1250       break;
   1251    case SpvDecorationBlock:
   1252       vtn_assert(type->base_type == vtn_base_type_struct);
   1253       vtn_assert(type->block);
   1254       break;
   1255    case SpvDecorationBufferBlock:
   1256       vtn_assert(type->base_type == vtn_base_type_struct);
   1257       vtn_assert(type->buffer_block);
   1258       break;
   1259    case SpvDecorationGLSLShared:
   1260    case SpvDecorationGLSLPacked:
   1261       /* Ignore these, since we get explicit offsets anyways */
   1262       break;
   1263 
   1264    case SpvDecorationRowMajor:
   1265    case SpvDecorationColMajor:
   1266    case SpvDecorationMatrixStride:
   1267    case SpvDecorationBuiltIn:
   1268    case SpvDecorationNoPerspective:
   1269    case SpvDecorationFlat:
   1270    case SpvDecorationPatch:
   1271    case SpvDecorationCentroid:
   1272    case SpvDecorationSample:
   1273    case SpvDecorationExplicitInterpAMD:
   1274    case SpvDecorationVolatile:
   1275    case SpvDecorationCoherent:
   1276    case SpvDecorationNonWritable:
   1277    case SpvDecorationNonReadable:
   1278    case SpvDecorationUniform:
   1279    case SpvDecorationUniformId:
   1280    case SpvDecorationLocation:
   1281    case SpvDecorationComponent:
   1282    case SpvDecorationOffset:
   1283    case SpvDecorationXfbBuffer:
   1284    case SpvDecorationXfbStride:
   1285    case SpvDecorationUserSemantic:
   1286       vtn_warn("Decoration only allowed for struct members: %s",
   1287                spirv_decoration_to_string(dec->decoration));
   1288       break;
   1289 
   1290    case SpvDecorationStream:
   1291       /* We don't need to do anything here, as stream is filled up when
   1292        * aplying the decoration to a variable, just check that if it is not a
   1293        * struct member, it should be a struct.
   1294        */
   1295       vtn_assert(type->base_type == vtn_base_type_struct);
   1296       break;
   1297 
   1298    case SpvDecorationRelaxedPrecision:
   1299    case SpvDecorationSpecId:
   1300    case SpvDecorationInvariant:
   1301    case SpvDecorationRestrict:
   1302    case SpvDecorationAliased:
   1303    case SpvDecorationConstant:
   1304    case SpvDecorationIndex:
   1305    case SpvDecorationBinding:
   1306    case SpvDecorationDescriptorSet:
   1307    case SpvDecorationLinkageAttributes:
   1308    case SpvDecorationNoContraction:
   1309    case SpvDecorationInputAttachmentIndex:
   1310       vtn_warn("Decoration not allowed on types: %s",
   1311                spirv_decoration_to_string(dec->decoration));
   1312       break;
   1313 
   1314    case SpvDecorationCPacked:
   1315       /* Handled when parsing a struct type, nothing to do here. */
   1316       break;
   1317 
   1318    case SpvDecorationSaturatedConversion:
   1319    case SpvDecorationFuncParamAttr:
   1320    case SpvDecorationFPRoundingMode:
   1321    case SpvDecorationFPFastMathMode:
   1322    case SpvDecorationAlignment:
   1323       vtn_warn("Decoration only allowed for CL-style kernels: %s",
   1324                spirv_decoration_to_string(dec->decoration));
   1325       break;
   1326 
   1327    case SpvDecorationUserTypeGOOGLE:
   1328       /* User semantic decorations can safely be ignored by the driver. */
   1329       break;
   1330 
   1331    default:
   1332       vtn_fail_with_decoration("Unhandled decoration", dec->decoration);
   1333    }
   1334 }
   1335 
   1336 static unsigned
   1337 translate_image_format(struct vtn_builder *b, SpvImageFormat format)
   1338 {
   1339    switch (format) {
   1340    case SpvImageFormatUnknown:      return PIPE_FORMAT_NONE;
   1341    case SpvImageFormatRgba32f:      return PIPE_FORMAT_R32G32B32A32_FLOAT;
   1342    case SpvImageFormatRgba16f:      return PIPE_FORMAT_R16G16B16A16_FLOAT;
   1343    case SpvImageFormatR32f:         return PIPE_FORMAT_R32_FLOAT;
   1344    case SpvImageFormatRgba8:        return PIPE_FORMAT_R8G8B8A8_UNORM;
   1345    case SpvImageFormatRgba8Snorm:   return PIPE_FORMAT_R8G8B8A8_SNORM;
   1346    case SpvImageFormatRg32f:        return PIPE_FORMAT_R32G32_FLOAT;
   1347    case SpvImageFormatRg16f:        return PIPE_FORMAT_R16G16_FLOAT;
   1348    case SpvImageFormatR11fG11fB10f: return PIPE_FORMAT_R11G11B10_FLOAT;
   1349    case SpvImageFormatR16f:         return PIPE_FORMAT_R16_FLOAT;
   1350    case SpvImageFormatRgba16:       return PIPE_FORMAT_R16G16B16A16_UNORM;
   1351    case SpvImageFormatRgb10A2:      return PIPE_FORMAT_R10G10B10A2_UNORM;
   1352    case SpvImageFormatRg16:         return PIPE_FORMAT_R16G16_UNORM;
   1353    case SpvImageFormatRg8:          return PIPE_FORMAT_R8G8_UNORM;
   1354    case SpvImageFormatR16:          return PIPE_FORMAT_R16_UNORM;
   1355    case SpvImageFormatR8:           return PIPE_FORMAT_R8_UNORM;
   1356    case SpvImageFormatRgba16Snorm:  return PIPE_FORMAT_R16G16B16A16_SNORM;
   1357    case SpvImageFormatRg16Snorm:    return PIPE_FORMAT_R16G16_SNORM;
   1358    case SpvImageFormatRg8Snorm:     return PIPE_FORMAT_R8G8_SNORM;
   1359    case SpvImageFormatR16Snorm:     return PIPE_FORMAT_R16_SNORM;
   1360    case SpvImageFormatR8Snorm:      return PIPE_FORMAT_R8_SNORM;
   1361    case SpvImageFormatRgba32i:      return PIPE_FORMAT_R32G32B32A32_SINT;
   1362    case SpvImageFormatRgba16i:      return PIPE_FORMAT_R16G16B16A16_SINT;
   1363    case SpvImageFormatRgba8i:       return PIPE_FORMAT_R8G8B8A8_SINT;
   1364    case SpvImageFormatR32i:         return PIPE_FORMAT_R32_SINT;
   1365    case SpvImageFormatRg32i:        return PIPE_FORMAT_R32G32_SINT;
   1366    case SpvImageFormatRg16i:        return PIPE_FORMAT_R16G16_SINT;
   1367    case SpvImageFormatRg8i:         return PIPE_FORMAT_R8G8_SINT;
   1368    case SpvImageFormatR16i:         return PIPE_FORMAT_R16_SINT;
   1369    case SpvImageFormatR8i:          return PIPE_FORMAT_R8_SINT;
   1370    case SpvImageFormatRgba32ui:     return PIPE_FORMAT_R32G32B32A32_UINT;
   1371    case SpvImageFormatRgba16ui:     return PIPE_FORMAT_R16G16B16A16_UINT;
   1372    case SpvImageFormatRgba8ui:      return PIPE_FORMAT_R8G8B8A8_UINT;
   1373    case SpvImageFormatR32ui:        return PIPE_FORMAT_R32_UINT;
   1374    case SpvImageFormatRgb10a2ui:    return PIPE_FORMAT_R10G10B10A2_UINT;
   1375    case SpvImageFormatRg32ui:       return PIPE_FORMAT_R32G32_UINT;
   1376    case SpvImageFormatRg16ui:       return PIPE_FORMAT_R16G16_UINT;
   1377    case SpvImageFormatRg8ui:        return PIPE_FORMAT_R8G8_UINT;
   1378    case SpvImageFormatR16ui:        return PIPE_FORMAT_R16_UINT;
   1379    case SpvImageFormatR8ui:         return PIPE_FORMAT_R8_UINT;
   1380    case SpvImageFormatR64ui:        return PIPE_FORMAT_R64_UINT;
   1381    case SpvImageFormatR64i:         return PIPE_FORMAT_R64_SINT;
   1382    default:
   1383       vtn_fail("Invalid image format: %s (%u)",
   1384                spirv_imageformat_to_string(format), format);
   1385    }
   1386 }
   1387 
   1388 static void
   1389 vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
   1390                 const uint32_t *w, unsigned count)
   1391 {
   1392    struct vtn_value *val = NULL;
   1393 
   1394    /* In order to properly handle forward declarations, we have to defer
   1395     * allocation for pointer types.
   1396     */
   1397    if (opcode != SpvOpTypePointer && opcode != SpvOpTypeForwardPointer) {
   1398       val = vtn_push_value(b, w[1], vtn_value_type_type);
   1399       vtn_fail_if(val->type != NULL,
   1400                   "Only pointers can have forward declarations");
   1401       val->type = rzalloc(b, struct vtn_type);
   1402       val->type->id = w[1];
   1403    }
   1404 
   1405    switch (opcode) {
   1406    case SpvOpTypeVoid:
   1407       val->type->base_type = vtn_base_type_void;
   1408       val->type->type = glsl_void_type();
   1409       break;
   1410    case SpvOpTypeBool:
   1411       val->type->base_type = vtn_base_type_scalar;
   1412       val->type->type = glsl_bool_type();
   1413       val->type->length = 1;
   1414       break;
   1415    case SpvOpTypeInt: {
   1416       int bit_size = w[2];
   1417       const bool signedness = w[3];
   1418       vtn_fail_if(bit_size != 8 && bit_size != 16 &&
   1419                   bit_size != 32 && bit_size != 64,
   1420                   "Invalid int bit size: %u", bit_size);
   1421       val->type->base_type = vtn_base_type_scalar;
   1422       val->type->type = signedness ? glsl_intN_t_type(bit_size) :
   1423                                      glsl_uintN_t_type(bit_size);
   1424       val->type->length = 1;
   1425       break;
   1426    }
   1427 
   1428    case SpvOpTypeFloat: {
   1429       int bit_size = w[2];
   1430       val->type->base_type = vtn_base_type_scalar;
   1431       vtn_fail_if(bit_size != 16 && bit_size != 32 && bit_size != 64,
   1432                   "Invalid float bit size: %u", bit_size);
   1433       val->type->type = glsl_floatN_t_type(bit_size);
   1434       val->type->length = 1;
   1435       break;
   1436    }
   1437 
   1438    case SpvOpTypeVector: {
   1439       struct vtn_type *base = vtn_get_type(b, w[2]);
   1440       unsigned elems = w[3];
   1441 
   1442       vtn_fail_if(base->base_type != vtn_base_type_scalar,
   1443                   "Base type for OpTypeVector must be a scalar");
   1444       vtn_fail_if((elems < 2 || elems > 4) && (elems != 8) && (elems != 16),
   1445                   "Invalid component count for OpTypeVector");
   1446 
   1447       val->type->base_type = vtn_base_type_vector;
   1448       val->type->type = glsl_vector_type(glsl_get_base_type(base->type), elems);
   1449       val->type->length = elems;
   1450       val->type->stride = glsl_type_is_boolean(val->type->type)
   1451          ? 4 : glsl_get_bit_size(base->type) / 8;
   1452       val->type->array_element = base;
   1453       break;
   1454    }
   1455 
   1456    case SpvOpTypeMatrix: {
   1457       struct vtn_type *base = vtn_get_type(b, w[2]);
   1458       unsigned columns = w[3];
   1459 
   1460       vtn_fail_if(base->base_type != vtn_base_type_vector,
   1461                   "Base type for OpTypeMatrix must be a vector");
   1462       vtn_fail_if(columns < 2 || columns > 4,
   1463                   "Invalid column count for OpTypeMatrix");
   1464 
   1465       val->type->base_type = vtn_base_type_matrix;
   1466       val->type->type = glsl_matrix_type(glsl_get_base_type(base->type),
   1467                                          glsl_get_vector_elements(base->type),
   1468                                          columns);
   1469       vtn_fail_if(glsl_type_is_error(val->type->type),
   1470                   "Unsupported base type for OpTypeMatrix");
   1471       assert(!glsl_type_is_error(val->type->type));
   1472       val->type->length = columns;
   1473       val->type->array_element = base;
   1474       val->type->row_major = false;
   1475       val->type->stride = 0;
   1476       break;
   1477    }
   1478 
   1479    case SpvOpTypeRuntimeArray:
   1480    case SpvOpTypeArray: {
   1481       struct vtn_type *array_element = vtn_get_type(b, w[2]);
   1482 
   1483       if (opcode == SpvOpTypeRuntimeArray) {
   1484          /* A length of 0 is used to denote unsized arrays */
   1485          val->type->length = 0;
   1486       } else {
   1487          val->type->length = vtn_constant_uint(b, w[3]);
   1488       }
   1489 
   1490       val->type->base_type = vtn_base_type_array;
   1491       val->type->array_element = array_element;
   1492 
   1493       vtn_foreach_decoration(b, val, array_stride_decoration_cb, NULL);
   1494       val->type->type = glsl_array_type(array_element->type, val->type->length,
   1495                                         val->type->stride);
   1496       break;
   1497    }
   1498 
   1499    case SpvOpTypeStruct: {
   1500       unsigned num_fields = count - 2;
   1501       val->type->base_type = vtn_base_type_struct;
   1502       val->type->length = num_fields;
   1503       val->type->members = ralloc_array(b, struct vtn_type *, num_fields);
   1504       val->type->offsets = ralloc_array(b, unsigned, num_fields);
   1505       val->type->packed = false;
   1506 
   1507       NIR_VLA(struct glsl_struct_field, fields, count);
   1508       for (unsigned i = 0; i < num_fields; i++) {
   1509          val->type->members[i] = vtn_get_type(b, w[i + 2]);
   1510          fields[i] = (struct glsl_struct_field) {
   1511             .type = val->type->members[i]->type,
   1512             .name = ralloc_asprintf(b, "field%d", i),
   1513             .location = -1,
   1514             .offset = -1,
   1515          };
   1516       }
   1517 
   1518       vtn_foreach_decoration(b, val, struct_packed_decoration_cb, NULL);
   1519 
   1520       struct member_decoration_ctx ctx = {
   1521          .num_fields = num_fields,
   1522          .fields = fields,
   1523          .type = val->type
   1524       };
   1525 
   1526       vtn_foreach_decoration(b, val, struct_member_decoration_cb, &ctx);
   1527 
   1528       /* Propagate access specifiers that are present on all members to the overall type */
   1529       enum gl_access_qualifier overall_access = ACCESS_COHERENT | ACCESS_VOLATILE |
   1530                                                 ACCESS_NON_READABLE | ACCESS_NON_WRITEABLE;
   1531       for (unsigned i = 0; i < num_fields; ++i)
   1532          overall_access &= val->type->members[i]->access;
   1533       val->type->access = overall_access;
   1534 
   1535       vtn_foreach_decoration(b, val, struct_member_matrix_stride_cb, &ctx);
   1536 
   1537       vtn_foreach_decoration(b, val, struct_block_decoration_cb, NULL);
   1538 
   1539       const char *name = val->name;
   1540 
   1541       if (val->type->block || val->type->buffer_block) {
   1542          /* Packing will be ignored since types coming from SPIR-V are
   1543           * explicitly laid out.
   1544           */
   1545          val->type->type = glsl_interface_type(fields, num_fields,
   1546                                                /* packing */ 0, false,
   1547                                                name ? name : "block");
   1548       } else {
   1549          val->type->type = glsl_struct_type(fields, num_fields,
   1550                                             name ? name : "struct",
   1551                                             val->type->packed);
   1552       }
   1553       break;
   1554    }
   1555 
   1556    case SpvOpTypeFunction: {
   1557       val->type->base_type = vtn_base_type_function;
   1558       val->type->type = NULL;
   1559 
   1560       val->type->return_type = vtn_get_type(b, w[2]);
   1561 
   1562       const unsigned num_params = count - 3;
   1563       val->type->length = num_params;
   1564       val->type->params = ralloc_array(b, struct vtn_type *, num_params);
   1565       for (unsigned i = 0; i < count - 3; i++) {
   1566          val->type->params[i] = vtn_get_type(b, w[i + 3]);
   1567       }
   1568       break;
   1569    }
   1570 
   1571    case SpvOpTypePointer:
   1572    case SpvOpTypeForwardPointer: {
   1573       /* We can't blindly push the value because it might be a forward
   1574        * declaration.
   1575        */
   1576       val = vtn_untyped_value(b, w[1]);
   1577 
   1578       SpvStorageClass storage_class = w[2];
   1579 
   1580       vtn_fail_if(opcode == SpvOpTypeForwardPointer &&
   1581                   b->shader->info.stage != MESA_SHADER_KERNEL &&
   1582                   storage_class != SpvStorageClassPhysicalStorageBuffer,
   1583                   "OpTypeForwardPointer is only allowed in Vulkan with "
   1584                   "the PhysicalStorageBuffer storage class");
   1585 
   1586       struct vtn_type *deref_type = NULL;
   1587       if (opcode == SpvOpTypePointer)
   1588          deref_type = vtn_get_type(b, w[3]);
   1589 
   1590       if (val->value_type == vtn_value_type_invalid) {
   1591          val->value_type = vtn_value_type_type;
   1592          val->type = rzalloc(b, struct vtn_type);
   1593          val->type->id = w[1];
   1594          val->type->base_type = vtn_base_type_pointer;
   1595          val->type->storage_class = storage_class;
   1596 
   1597          /* These can actually be stored to nir_variables and used as SSA
   1598           * values so they need a real glsl_type.
   1599           */
   1600          enum vtn_variable_mode mode = vtn_storage_class_to_mode(
   1601             b, storage_class, deref_type, NULL);
   1602 
   1603          /* The deref type should only matter for the UniformConstant storage
   1604           * class.  In particular, it should never matter for any storage
   1605           * classes that are allowed in combination with OpTypeForwardPointer.
   1606           */
   1607          if (storage_class != SpvStorageClassUniform &&
   1608              storage_class != SpvStorageClassUniformConstant) {
   1609             assert(mode == vtn_storage_class_to_mode(b, storage_class,
   1610                                                      NULL, NULL));
   1611          }
   1612 
   1613          val->type->type = nir_address_format_to_glsl_type(
   1614             vtn_mode_to_address_format(b, mode));
   1615       } else {
   1616          vtn_fail_if(val->type->storage_class != storage_class,
   1617                      "The storage classes of an OpTypePointer and any "
   1618                      "OpTypeForwardPointers that provide forward "
   1619                      "declarations of it must match.");
   1620       }
   1621 
   1622       if (opcode == SpvOpTypePointer) {
   1623          vtn_fail_if(val->type->deref != NULL,
   1624                      "While OpTypeForwardPointer can be used to provide a "
   1625                      "forward declaration of a pointer, OpTypePointer can "
   1626                      "only be used once for a given id.");
   1627 
   1628          val->type->deref = deref_type;
   1629 
   1630          /* Only certain storage classes use ArrayStride. */
   1631          switch (storage_class) {
   1632          case SpvStorageClassWorkgroup:
   1633             if (!b->options->caps.workgroup_memory_explicit_layout)
   1634                break;
   1635             FALLTHROUGH;
   1636 
   1637          case SpvStorageClassUniform:
   1638          case SpvStorageClassPushConstant:
   1639          case SpvStorageClassStorageBuffer:
   1640          case SpvStorageClassPhysicalStorageBuffer:
   1641             vtn_foreach_decoration(b, val, array_stride_decoration_cb, NULL);
   1642             break;
   1643 
   1644          default:
   1645             /* Nothing to do. */
   1646             break;
   1647          }
   1648       }
   1649       break;
   1650    }
   1651 
   1652    case SpvOpTypeImage: {
   1653       val->type->base_type = vtn_base_type_image;
   1654 
   1655       /* Images are represented in NIR as a scalar SSA value that is the
   1656        * result of a deref instruction.  An OpLoad on an OpTypeImage pointer
   1657        * from UniformConstant memory just takes the NIR deref from the pointer
   1658        * and turns it into an SSA value.
   1659        */
   1660       val->type->type = nir_address_format_to_glsl_type(
   1661          vtn_mode_to_address_format(b, vtn_variable_mode_function));
   1662 
   1663       const struct vtn_type *sampled_type = vtn_get_type(b, w[2]);
   1664       if (b->shader->info.stage == MESA_SHADER_KERNEL) {
   1665          vtn_fail_if(sampled_type->base_type != vtn_base_type_void,
   1666                      "Sampled type of OpTypeImage must be void for kernels");
   1667       } else {
   1668          vtn_fail_if(sampled_type->base_type != vtn_base_type_scalar,
   1669                      "Sampled type of OpTypeImage must be a scalar");
   1670          if (b->options->caps.image_atomic_int64) {
   1671             vtn_fail_if(glsl_get_bit_size(sampled_type->type) != 32 &&
   1672                         glsl_get_bit_size(sampled_type->type) != 64,
   1673                         "Sampled type of OpTypeImage must be a 32 or 64-bit "
   1674                         "scalar");
   1675          } else {
   1676             vtn_fail_if(glsl_get_bit_size(sampled_type->type) != 32,
   1677                         "Sampled type of OpTypeImage must be a 32-bit scalar");
   1678          }
   1679       }
   1680 
   1681       enum glsl_sampler_dim dim;
   1682       switch ((SpvDim)w[3]) {
   1683       case SpvDim1D:       dim = GLSL_SAMPLER_DIM_1D;    break;
   1684       case SpvDim2D:       dim = GLSL_SAMPLER_DIM_2D;    break;
   1685       case SpvDim3D:       dim = GLSL_SAMPLER_DIM_3D;    break;
   1686       case SpvDimCube:     dim = GLSL_SAMPLER_DIM_CUBE;  break;
   1687       case SpvDimRect:     dim = GLSL_SAMPLER_DIM_RECT;  break;
   1688       case SpvDimBuffer:   dim = GLSL_SAMPLER_DIM_BUF;   break;
   1689       case SpvDimSubpassData: dim = GLSL_SAMPLER_DIM_SUBPASS; break;
   1690       default:
   1691          vtn_fail("Invalid SPIR-V image dimensionality: %s (%u)",
   1692                   spirv_dim_to_string((SpvDim)w[3]), w[3]);
   1693       }
   1694 
   1695       /* w[4]: as per Vulkan spec "Validation Rules within a Module",
   1696        *       The Depth operand of OpTypeImage is ignored.
   1697        */
   1698       bool is_array = w[5];
   1699       bool multisampled = w[6];
   1700       unsigned sampled = w[7];
   1701       SpvImageFormat format = w[8];
   1702 
   1703       if (count > 9)
   1704          val->type->access_qualifier = w[9];
   1705       else if (b->shader->info.stage == MESA_SHADER_KERNEL)
   1706          /* Per the CL C spec: If no qualifier is provided, read_only is assumed. */
   1707          val->type->access_qualifier = SpvAccessQualifierReadOnly;
   1708       else
   1709          val->type->access_qualifier = SpvAccessQualifierReadWrite;
   1710 
   1711       if (multisampled) {
   1712          if (dim == GLSL_SAMPLER_DIM_2D)
   1713             dim = GLSL_SAMPLER_DIM_MS;
   1714          else if (dim == GLSL_SAMPLER_DIM_SUBPASS)
   1715             dim = GLSL_SAMPLER_DIM_SUBPASS_MS;
   1716          else
   1717             vtn_fail("Unsupported multisampled image type");
   1718       }
   1719 
   1720       val->type->image_format = translate_image_format(b, format);
   1721 
   1722       enum glsl_base_type sampled_base_type =
   1723          glsl_get_base_type(sampled_type->type);
   1724       if (sampled == 1) {
   1725          val->type->glsl_image = glsl_sampler_type(dim, false, is_array,
   1726                                                    sampled_base_type);
   1727       } else if (sampled == 2) {
   1728          val->type->glsl_image = glsl_image_type(dim, is_array,
   1729                                                  sampled_base_type);
   1730       } else if (b->shader->info.stage == MESA_SHADER_KERNEL) {
   1731          val->type->glsl_image = glsl_image_type(dim, is_array,
   1732                                                  GLSL_TYPE_VOID);
   1733       } else {
   1734          vtn_fail("We need to know if the image will be sampled");
   1735       }
   1736       break;
   1737    }
   1738 
   1739    case SpvOpTypeSampledImage: {
   1740       val->type->base_type = vtn_base_type_sampled_image;
   1741       val->type->image = vtn_get_type(b, w[2]);
   1742 
   1743       /* Sampled images are represented NIR as a vec2 SSA value where each
   1744        * component is the result of a deref instruction.  The first component
   1745        * is the image and the second is the sampler.  An OpLoad on an
   1746        * OpTypeSampledImage pointer from UniformConstant memory just takes
   1747        * the NIR deref from the pointer and duplicates it to both vector
   1748        * components.
   1749        */
   1750       nir_address_format addr_format =
   1751          vtn_mode_to_address_format(b, vtn_variable_mode_function);
   1752       assert(nir_address_format_num_components(addr_format) == 1);
   1753       unsigned bit_size = nir_address_format_bit_size(addr_format);
   1754       assert(bit_size == 32 || bit_size == 64);
   1755 
   1756       enum glsl_base_type base_type =
   1757          bit_size == 32 ? GLSL_TYPE_UINT : GLSL_TYPE_UINT64;
   1758       val->type->type = glsl_vector_type(base_type, 2);
   1759       break;
   1760    }
   1761 
   1762    case SpvOpTypeSampler:
   1763       val->type->base_type = vtn_base_type_sampler;
   1764 
   1765       /* Samplers are represented in NIR as a scalar SSA value that is the
   1766        * result of a deref instruction.  An OpLoad on an OpTypeSampler pointer
   1767        * from UniformConstant memory just takes the NIR deref from the pointer
   1768        * and turns it into an SSA value.
   1769        */
   1770       val->type->type = nir_address_format_to_glsl_type(
   1771          vtn_mode_to_address_format(b, vtn_variable_mode_function));
   1772       break;
   1773 
   1774    case SpvOpTypeAccelerationStructureKHR:
   1775       val->type->base_type = vtn_base_type_accel_struct;
   1776       val->type->type = glsl_uint64_t_type();
   1777       break;
   1778 
   1779    case SpvOpTypeOpaque:
   1780       val->type->base_type = vtn_base_type_struct;
   1781       const char *name = vtn_string_literal(b, &w[2], count - 2, NULL);
   1782       val->type->type = glsl_struct_type(NULL, 0, name, false);
   1783       break;
   1784 
   1785    case SpvOpTypeEvent:
   1786       val->type->base_type = vtn_base_type_event;
   1787       val->type->type = glsl_int_type();
   1788       break;
   1789 
   1790    case SpvOpTypeDeviceEvent:
   1791    case SpvOpTypeReserveId:
   1792    case SpvOpTypeQueue:
   1793    case SpvOpTypePipe:
   1794    default:
   1795       vtn_fail_with_opcode("Unhandled opcode", opcode);
   1796    }
   1797 
   1798    vtn_foreach_decoration(b, val, type_decoration_cb, NULL);
   1799 
   1800    if (val->type->base_type == vtn_base_type_struct &&
   1801        (val->type->block || val->type->buffer_block)) {
   1802       for (unsigned i = 0; i < val->type->length; i++) {
   1803          vtn_fail_if(vtn_type_contains_block(b, val->type->members[i]),
   1804                      "Block and BufferBlock decorations cannot decorate a "
   1805                      "structure type that is nested at any level inside "
   1806                      "another structure type decorated with Block or "
   1807                      "BufferBlock.");
   1808       }
   1809    }
   1810 }
   1811 
   1812 static nir_constant *
   1813 vtn_null_constant(struct vtn_builder *b, struct vtn_type *type)
   1814 {
   1815    nir_constant *c = rzalloc(b, nir_constant);
   1816 
   1817    switch (type->base_type) {
   1818    case vtn_base_type_scalar:
   1819    case vtn_base_type_vector:
   1820       /* Nothing to do here.  It's already initialized to zero */
   1821       break;
   1822 
   1823    case vtn_base_type_pointer: {
   1824       enum vtn_variable_mode mode = vtn_storage_class_to_mode(
   1825          b, type->storage_class, type->deref, NULL);
   1826       nir_address_format addr_format = vtn_mode_to_address_format(b, mode);
   1827 
   1828       const nir_const_value *null_value = nir_address_format_null_value(addr_format);
   1829       memcpy(c->values, null_value,
   1830              sizeof(nir_const_value) * nir_address_format_num_components(addr_format));
   1831       break;
   1832    }
   1833 
   1834    case vtn_base_type_void:
   1835    case vtn_base_type_image:
   1836    case vtn_base_type_sampler:
   1837    case vtn_base_type_sampled_image:
   1838    case vtn_base_type_function:
   1839    case vtn_base_type_event:
   1840       /* For those we have to return something but it doesn't matter what. */
   1841       break;
   1842 
   1843    case vtn_base_type_matrix:
   1844    case vtn_base_type_array:
   1845       vtn_assert(type->length > 0);
   1846       c->num_elements = type->length;
   1847       c->elements = ralloc_array(b, nir_constant *, c->num_elements);
   1848 
   1849       c->elements[0] = vtn_null_constant(b, type->array_element);
   1850       for (unsigned i = 1; i < c->num_elements; i++)
   1851          c->elements[i] = c->elements[0];
   1852       break;
   1853 
   1854    case vtn_base_type_struct:
   1855       c->num_elements = type->length;
   1856       c->elements = ralloc_array(b, nir_constant *, c->num_elements);
   1857       for (unsigned i = 0; i < c->num_elements; i++)
   1858          c->elements[i] = vtn_null_constant(b, type->members[i]);
   1859       break;
   1860 
   1861    default:
   1862       vtn_fail("Invalid type for null constant");
   1863    }
   1864 
   1865    return c;
   1866 }
   1867 
   1868 static void
   1869 spec_constant_decoration_cb(struct vtn_builder *b, UNUSED struct vtn_value *val,
   1870                             ASSERTED int member,
   1871                             const struct vtn_decoration *dec, void *data)
   1872 {
   1873    vtn_assert(member == -1);
   1874    if (dec->decoration != SpvDecorationSpecId)
   1875       return;
   1876 
   1877    nir_const_value *value = data;
   1878    for (unsigned i = 0; i < b->num_specializations; i++) {
   1879       if (b->specializations[i].id == dec->operands[0]) {
   1880          *value = b->specializations[i].value;
   1881          return;
   1882       }
   1883    }
   1884 }
   1885 
   1886 static void
   1887 handle_workgroup_size_decoration_cb(struct vtn_builder *b,
   1888                                     struct vtn_value *val,
   1889                                     ASSERTED int member,
   1890                                     const struct vtn_decoration *dec,
   1891                                     UNUSED void *data)
   1892 {
   1893    vtn_assert(member == -1);
   1894    if (dec->decoration != SpvDecorationBuiltIn ||
   1895        dec->operands[0] != SpvBuiltInWorkgroupSize)
   1896       return;
   1897 
   1898    vtn_assert(val->type->type == glsl_vector_type(GLSL_TYPE_UINT, 3));
   1899    b->workgroup_size_builtin = val;
   1900 }
   1901 
   1902 static void
   1903 vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,
   1904                     const uint32_t *w, unsigned count)
   1905 {
   1906    struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_constant);
   1907    val->constant = rzalloc(b, nir_constant);
   1908    switch (opcode) {
   1909    case SpvOpConstantTrue:
   1910    case SpvOpConstantFalse:
   1911    case SpvOpSpecConstantTrue:
   1912    case SpvOpSpecConstantFalse: {
   1913       vtn_fail_if(val->type->type != glsl_bool_type(),
   1914                   "Result type of %s must be OpTypeBool",
   1915                   spirv_op_to_string(opcode));
   1916 
   1917       bool bval = (opcode == SpvOpConstantTrue ||
   1918                    opcode == SpvOpSpecConstantTrue);
   1919 
   1920       nir_const_value u32val = nir_const_value_for_uint(bval, 32);
   1921 
   1922       if (opcode == SpvOpSpecConstantTrue ||
   1923           opcode == SpvOpSpecConstantFalse)
   1924          vtn_foreach_decoration(b, val, spec_constant_decoration_cb, &u32val);
   1925 
   1926       val->constant->values[0].b = u32val.u32 != 0;
   1927       break;
   1928    }
   1929 
   1930    case SpvOpConstant:
   1931    case SpvOpSpecConstant: {
   1932       vtn_fail_if(val->type->base_type != vtn_base_type_scalar,
   1933                   "Result type of %s must be a scalar",
   1934                   spirv_op_to_string(opcode));
   1935       int bit_size = glsl_get_bit_size(val->type->type);
   1936       switch (bit_size) {
   1937       case 64:
   1938          val->constant->values[0].u64 = vtn_u64_literal(&w[3]);
   1939          break;
   1940       case 32:
   1941          val->constant->values[0].u32 = w[3];
   1942          break;
   1943       case 16:
   1944          val->constant->values[0].u16 = w[3];
   1945          break;
   1946       case 8:
   1947          val->constant->values[0].u8 = w[3];
   1948          break;
   1949       default:
   1950          vtn_fail("Unsupported SpvOpConstant bit size: %u", bit_size);
   1951       }
   1952 
   1953       if (opcode == SpvOpSpecConstant)
   1954          vtn_foreach_decoration(b, val, spec_constant_decoration_cb,
   1955                                 &val->constant->values[0]);
   1956       break;
   1957    }
   1958 
   1959    case SpvOpSpecConstantComposite:
   1960    case SpvOpConstantComposite: {
   1961       unsigned elem_count = count - 3;
   1962       vtn_fail_if(elem_count != val->type->length,
   1963                   "%s has %u constituents, expected %u",
   1964                   spirv_op_to_string(opcode), elem_count, val->type->length);
   1965 
   1966       nir_constant **elems = ralloc_array(b, nir_constant *, elem_count);
   1967       val->is_undef_constant = true;
   1968       for (unsigned i = 0; i < elem_count; i++) {
   1969          struct vtn_value *elem_val = vtn_untyped_value(b, w[i + 3]);
   1970 
   1971          if (elem_val->value_type == vtn_value_type_constant) {
   1972             elems[i] = elem_val->constant;
   1973             val->is_undef_constant = val->is_undef_constant &&
   1974                                      elem_val->is_undef_constant;
   1975          } else {
   1976             vtn_fail_if(elem_val->value_type != vtn_value_type_undef,
   1977                         "only constants or undefs allowed for "
   1978                         "SpvOpConstantComposite");
   1979             /* to make it easier, just insert a NULL constant for now */
   1980             elems[i] = vtn_null_constant(b, elem_val->type);
   1981          }
   1982       }
   1983 
   1984       switch (val->type->base_type) {
   1985       case vtn_base_type_vector: {
   1986          assert(glsl_type_is_vector(val->type->type));
   1987          for (unsigned i = 0; i < elem_count; i++)
   1988             val->constant->values[i] = elems[i]->values[0];
   1989          break;
   1990       }
   1991 
   1992       case vtn_base_type_matrix:
   1993       case vtn_base_type_struct:
   1994       case vtn_base_type_array:
   1995          ralloc_steal(val->constant, elems);
   1996          val->constant->num_elements = elem_count;
   1997          val->constant->elements = elems;
   1998          break;
   1999 
   2000       default:
   2001          vtn_fail("Result type of %s must be a composite type",
   2002                   spirv_op_to_string(opcode));
   2003       }
   2004       break;
   2005    }
   2006 
   2007    case SpvOpSpecConstantOp: {
   2008       nir_const_value u32op = nir_const_value_for_uint(w[3], 32);
   2009       vtn_foreach_decoration(b, val, spec_constant_decoration_cb, &u32op);
   2010       SpvOp opcode = u32op.u32;
   2011       switch (opcode) {
   2012       case SpvOpVectorShuffle: {
   2013          struct vtn_value *v0 = &b->values[w[4]];
   2014          struct vtn_value *v1 = &b->values[w[5]];
   2015 
   2016          vtn_assert(v0->value_type == vtn_value_type_constant ||
   2017                     v0->value_type == vtn_value_type_undef);
   2018          vtn_assert(v1->value_type == vtn_value_type_constant ||
   2019                     v1->value_type == vtn_value_type_undef);
   2020 
   2021          unsigned len0 = glsl_get_vector_elements(v0->type->type);
   2022          unsigned len1 = glsl_get_vector_elements(v1->type->type);
   2023 
   2024          vtn_assert(len0 + len1 < 16);
   2025 
   2026          unsigned bit_size = glsl_get_bit_size(val->type->type);
   2027          unsigned bit_size0 = glsl_get_bit_size(v0->type->type);
   2028          unsigned bit_size1 = glsl_get_bit_size(v1->type->type);
   2029 
   2030          vtn_assert(bit_size == bit_size0 && bit_size == bit_size1);
   2031          (void)bit_size0; (void)bit_size1;
   2032 
   2033          nir_const_value undef = { .u64 = 0xdeadbeefdeadbeef };
   2034          nir_const_value combined[NIR_MAX_VEC_COMPONENTS * 2];
   2035 
   2036          if (v0->value_type == vtn_value_type_constant) {
   2037             for (unsigned i = 0; i < len0; i++)
   2038                combined[i] = v0->constant->values[i];
   2039          }
   2040          if (v1->value_type == vtn_value_type_constant) {
   2041             for (unsigned i = 0; i < len1; i++)
   2042                combined[len0 + i] = v1->constant->values[i];
   2043          }
   2044 
   2045          for (unsigned i = 0, j = 0; i < count - 6; i++, j++) {
   2046             uint32_t comp = w[i + 6];
   2047             if (comp == (uint32_t)-1) {
   2048                /* If component is not used, set the value to a known constant
   2049                 * to detect if it is wrongly used.
   2050                 */
   2051                val->constant->values[j] = undef;
   2052             } else {
   2053                vtn_fail_if(comp >= len0 + len1,
   2054                            "All Component literals must either be FFFFFFFF "
   2055                            "or in [0, N - 1] (inclusive).");
   2056                val->constant->values[j] = combined[comp];
   2057             }
   2058          }
   2059          break;
   2060       }
   2061 
   2062       case SpvOpCompositeExtract:
   2063       case SpvOpCompositeInsert: {
   2064          struct vtn_value *comp;
   2065          unsigned deref_start;
   2066          struct nir_constant **c;
   2067          if (opcode == SpvOpCompositeExtract) {
   2068             comp = vtn_value(b, w[4], vtn_value_type_constant);
   2069             deref_start = 5;
   2070             c = &comp->constant;
   2071          } else {
   2072             comp = vtn_value(b, w[5], vtn_value_type_constant);
   2073             deref_start = 6;
   2074             val->constant = nir_constant_clone(comp->constant,
   2075                                                (nir_variable *)b);
   2076             c = &val->constant;
   2077          }
   2078 
   2079          int elem = -1;
   2080          const struct vtn_type *type = comp->type;
   2081          for (unsigned i = deref_start; i < count; i++) {
   2082             vtn_fail_if(w[i] > type->length,
   2083                         "%uth index of %s is %u but the type has only "
   2084                         "%u elements", i - deref_start,
   2085                         spirv_op_to_string(opcode), w[i], type->length);
   2086 
   2087             switch (type->base_type) {
   2088             case vtn_base_type_vector:
   2089                elem = w[i];
   2090                type = type->array_element;
   2091                break;
   2092 
   2093             case vtn_base_type_matrix:
   2094             case vtn_base_type_array:
   2095                c = &(*c)->elements[w[i]];
   2096                type = type->array_element;
   2097                break;
   2098 
   2099             case vtn_base_type_struct:
   2100                c = &(*c)->elements[w[i]];
   2101                type = type->members[w[i]];
   2102                break;
   2103 
   2104             default:
   2105                vtn_fail("%s must only index into composite types",
   2106                         spirv_op_to_string(opcode));
   2107             }
   2108          }
   2109 
   2110          if (opcode == SpvOpCompositeExtract) {
   2111             if (elem == -1) {
   2112                val->constant = *c;
   2113             } else {
   2114                unsigned num_components = type->length;
   2115                for (unsigned i = 0; i < num_components; i++)
   2116                   val->constant->values[i] = (*c)->values[elem + i];
   2117             }
   2118          } else {
   2119             struct vtn_value *insert =
   2120                vtn_value(b, w[4], vtn_value_type_constant);
   2121             vtn_assert(insert->type == type);
   2122             if (elem == -1) {
   2123                *c = insert->constant;
   2124             } else {
   2125                unsigned num_components = type->length;
   2126                for (unsigned i = 0; i < num_components; i++)
   2127                   (*c)->values[elem + i] = insert->constant->values[i];
   2128             }
   2129          }
   2130          break;
   2131       }
   2132 
   2133       default: {
   2134          bool swap;
   2135          nir_alu_type dst_alu_type = nir_get_nir_type_for_glsl_type(val->type->type);
   2136          nir_alu_type src_alu_type = dst_alu_type;
   2137          unsigned num_components = glsl_get_vector_elements(val->type->type);
   2138          unsigned bit_size;
   2139 
   2140          vtn_assert(count <= 7);
   2141 
   2142          switch (opcode) {
   2143          case SpvOpSConvert:
   2144          case SpvOpFConvert:
   2145          case SpvOpUConvert:
   2146             /* We have a source in a conversion */
   2147             src_alu_type =
   2148                nir_get_nir_type_for_glsl_type(vtn_get_value_type(b, w[4])->type);
   2149             /* We use the bitsize of the conversion source to evaluate the opcode later */
   2150             bit_size = glsl_get_bit_size(vtn_get_value_type(b, w[4])->type);
   2151             break;
   2152          default:
   2153             bit_size = glsl_get_bit_size(val->type->type);
   2154          };
   2155 
   2156          bool exact;
   2157          nir_op op = vtn_nir_alu_op_for_spirv_opcode(b, opcode, &swap, &exact,
   2158                                                      nir_alu_type_get_type_size(src_alu_type),
   2159                                                      nir_alu_type_get_type_size(dst_alu_type));
   2160 
   2161          /* No SPIR-V opcodes handled through this path should set exact.
   2162           * Since it is ignored, assert on it.
   2163           */
   2164          assert(!exact);
   2165 
   2166          nir_const_value src[3][NIR_MAX_VEC_COMPONENTS];
   2167 
   2168          for (unsigned i = 0; i < count - 4; i++) {
   2169             struct vtn_value *src_val =
   2170                vtn_value(b, w[4 + i], vtn_value_type_constant);
   2171 
   2172             /* If this is an unsized source, pull the bit size from the
   2173              * source; otherwise, we'll use the bit size from the destination.
   2174              */
   2175             if (!nir_alu_type_get_type_size(nir_op_infos[op].input_types[i]))
   2176                bit_size = glsl_get_bit_size(src_val->type->type);
   2177 
   2178             unsigned src_comps = nir_op_infos[op].input_sizes[i] ?
   2179                                  nir_op_infos[op].input_sizes[i] :
   2180                                  num_components;
   2181 
   2182             unsigned j = swap ? 1 - i : i;
   2183             for (unsigned c = 0; c < src_comps; c++)
   2184                src[j][c] = src_val->constant->values[c];
   2185          }
   2186 
   2187          /* fix up fixed size sources */
   2188          switch (op) {
   2189          case nir_op_ishl:
   2190          case nir_op_ishr:
   2191          case nir_op_ushr: {
   2192             if (bit_size == 32)
   2193                break;
   2194             for (unsigned i = 0; i < num_components; ++i) {
   2195                switch (bit_size) {
   2196                case 64: src[1][i].u32 = src[1][i].u64; break;
   2197                case 16: src[1][i].u32 = src[1][i].u16; break;
   2198                case  8: src[1][i].u32 = src[1][i].u8;  break;
   2199                }
   2200             }
   2201             break;
   2202          }
   2203          default:
   2204             break;
   2205          }
   2206 
   2207          nir_const_value *srcs[3] = {
   2208             src[0], src[1], src[2],
   2209          };
   2210          nir_eval_const_opcode(op, val->constant->values,
   2211                                num_components, bit_size, srcs,
   2212                                b->shader->info.float_controls_execution_mode);
   2213          break;
   2214       } /* default */
   2215       }
   2216       break;
   2217    }
   2218 
   2219    case SpvOpConstantNull:
   2220       val->constant = vtn_null_constant(b, val->type);
   2221       val->is_null_constant = true;
   2222       break;
   2223 
   2224    default:
   2225       vtn_fail_with_opcode("Unhandled opcode", opcode);
   2226    }
   2227 
   2228    /* Now that we have the value, update the workgroup size if needed */
   2229    if (gl_shader_stage_uses_workgroup(b->entry_point_stage))
   2230       vtn_foreach_decoration(b, val, handle_workgroup_size_decoration_cb,
   2231                              NULL);
   2232 }
   2233 
   2234 static void
   2235 vtn_split_barrier_semantics(struct vtn_builder *b,
   2236                             SpvMemorySemanticsMask semantics,
   2237                             SpvMemorySemanticsMask *before,
   2238                             SpvMemorySemanticsMask *after)
   2239 {
   2240    /* For memory semantics embedded in operations, we split them into up to
   2241     * two barriers, to be added before and after the operation.  This is less
   2242     * strict than if we propagated until the final backend stage, but still
   2243     * result in correct execution.
   2244     *
   2245     * A further improvement could be pipe this information (and use!) into the
   2246     * next compiler layers, at the expense of making the handling of barriers
   2247     * more complicated.
   2248     */
   2249 
   2250    *before = SpvMemorySemanticsMaskNone;
   2251    *after = SpvMemorySemanticsMaskNone;
   2252 
   2253    SpvMemorySemanticsMask order_semantics =
   2254       semantics & (SpvMemorySemanticsAcquireMask |
   2255                    SpvMemorySemanticsReleaseMask |
   2256                    SpvMemorySemanticsAcquireReleaseMask |
   2257                    SpvMemorySemanticsSequentiallyConsistentMask);
   2258 
   2259    if (util_bitcount(order_semantics) > 1) {
   2260       /* Old GLSLang versions incorrectly set all the ordering bits.  This was
   2261        * fixed in c51287d744fb6e7e9ccc09f6f8451e6c64b1dad6 of glslang repo,
   2262        * and it is in GLSLang since revision "SPIRV99.1321" (from Jul-2016).
   2263        */
   2264       vtn_warn("Multiple memory ordering semantics specified, "
   2265                "assuming AcquireRelease.");
   2266       order_semantics = SpvMemorySemanticsAcquireReleaseMask;
   2267    }
   2268 
   2269    const SpvMemorySemanticsMask av_vis_semantics =
   2270       semantics & (SpvMemorySemanticsMakeAvailableMask |
   2271                    SpvMemorySemanticsMakeVisibleMask);
   2272 
   2273    const SpvMemorySemanticsMask storage_semantics =
   2274       semantics & (SpvMemorySemanticsUniformMemoryMask |
   2275                    SpvMemorySemanticsSubgroupMemoryMask |
   2276                    SpvMemorySemanticsWorkgroupMemoryMask |
   2277                    SpvMemorySemanticsCrossWorkgroupMemoryMask |
   2278                    SpvMemorySemanticsAtomicCounterMemoryMask |
   2279                    SpvMemorySemanticsImageMemoryMask |
   2280                    SpvMemorySemanticsOutputMemoryMask);
   2281 
   2282    const SpvMemorySemanticsMask other_semantics =
   2283       semantics & ~(order_semantics | av_vis_semantics | storage_semantics |
   2284                     SpvMemorySemanticsVolatileMask);
   2285 
   2286    if (other_semantics)
   2287       vtn_warn("Ignoring unhandled memory semantics: %u\n", other_semantics);
   2288 
   2289    /* SequentiallyConsistent is treated as AcquireRelease. */
   2290 
   2291    /* The RELEASE barrier happens BEFORE the operation, and it is usually
   2292     * associated with a Store.  All the write operations with a matching
   2293     * semantics will not be reordered after the Store.
   2294     */
   2295    if (order_semantics & (SpvMemorySemanticsReleaseMask |
   2296                           SpvMemorySemanticsAcquireReleaseMask |
   2297                           SpvMemorySemanticsSequentiallyConsistentMask)) {
   2298       *before |= SpvMemorySemanticsReleaseMask | storage_semantics;
   2299    }
   2300 
   2301    /* The ACQUIRE barrier happens AFTER the operation, and it is usually
   2302     * associated with a Load.  All the operations with a matching semantics
   2303     * will not be reordered before the Load.
   2304     */
   2305    if (order_semantics & (SpvMemorySemanticsAcquireMask |
   2306                           SpvMemorySemanticsAcquireReleaseMask |
   2307                           SpvMemorySemanticsSequentiallyConsistentMask)) {
   2308       *after |= SpvMemorySemanticsAcquireMask | storage_semantics;
   2309    }
   2310 
   2311    if (av_vis_semantics & SpvMemorySemanticsMakeVisibleMask)
   2312       *before |= SpvMemorySemanticsMakeVisibleMask | storage_semantics;
   2313 
   2314    if (av_vis_semantics & SpvMemorySemanticsMakeAvailableMask)
   2315       *after |= SpvMemorySemanticsMakeAvailableMask | storage_semantics;
   2316 }
   2317 
   2318 static nir_memory_semantics
   2319 vtn_mem_semantics_to_nir_mem_semantics(struct vtn_builder *b,
   2320                                        SpvMemorySemanticsMask semantics)
   2321 {
   2322    nir_memory_semantics nir_semantics = 0;
   2323 
   2324    SpvMemorySemanticsMask order_semantics =
   2325       semantics & (SpvMemorySemanticsAcquireMask |
   2326                    SpvMemorySemanticsReleaseMask |
   2327                    SpvMemorySemanticsAcquireReleaseMask |
   2328                    SpvMemorySemanticsSequentiallyConsistentMask);
   2329 
   2330    if (util_bitcount(order_semantics) > 1) {
   2331       /* Old GLSLang versions incorrectly set all the ordering bits.  This was
   2332        * fixed in c51287d744fb6e7e9ccc09f6f8451e6c64b1dad6 of glslang repo,
   2333        * and it is in GLSLang since revision "SPIRV99.1321" (from Jul-2016).
   2334        */
   2335       vtn_warn("Multiple memory ordering semantics bits specified, "
   2336                "assuming AcquireRelease.");
   2337       order_semantics = SpvMemorySemanticsAcquireReleaseMask;
   2338    }
   2339 
   2340    switch (order_semantics) {
   2341    case 0:
   2342       /* Not an ordering barrier. */
   2343       break;
   2344 
   2345    case SpvMemorySemanticsAcquireMask:
   2346       nir_semantics = NIR_MEMORY_ACQUIRE;
   2347       break;
   2348 
   2349    case SpvMemorySemanticsReleaseMask:
   2350       nir_semantics = NIR_MEMORY_RELEASE;
   2351       break;
   2352 
   2353    case SpvMemorySemanticsSequentiallyConsistentMask:
   2354       FALLTHROUGH; /* Treated as AcquireRelease in Vulkan. */
   2355    case SpvMemorySemanticsAcquireReleaseMask:
   2356       nir_semantics = NIR_MEMORY_ACQUIRE | NIR_MEMORY_RELEASE;
   2357       break;
   2358 
   2359    default:
   2360       unreachable("Invalid memory order semantics");
   2361    }
   2362 
   2363    if (semantics & SpvMemorySemanticsMakeAvailableMask) {
   2364       vtn_fail_if(!b->options->caps.vk_memory_model,
   2365                   "To use MakeAvailable memory semantics the VulkanMemoryModel "
   2366                   "capability must be declared.");
   2367       nir_semantics |= NIR_MEMORY_MAKE_AVAILABLE;
   2368    }
   2369 
   2370    if (semantics & SpvMemorySemanticsMakeVisibleMask) {
   2371       vtn_fail_if(!b->options->caps.vk_memory_model,
   2372                   "To use MakeVisible memory semantics the VulkanMemoryModel "
   2373                   "capability must be declared.");
   2374       nir_semantics |= NIR_MEMORY_MAKE_VISIBLE;
   2375    }
   2376 
   2377    return nir_semantics;
   2378 }
   2379 
   2380 static nir_variable_mode
   2381 vtn_mem_semantics_to_nir_var_modes(struct vtn_builder *b,
   2382                                    SpvMemorySemanticsMask semantics)
   2383 {
   2384    /* Vulkan Environment for SPIR-V says "SubgroupMemory, CrossWorkgroupMemory,
   2385     * and AtomicCounterMemory are ignored".
   2386     */
   2387    if (b->options->environment == NIR_SPIRV_VULKAN) {
   2388       semantics &= ~(SpvMemorySemanticsSubgroupMemoryMask |
   2389                      SpvMemorySemanticsCrossWorkgroupMemoryMask |
   2390                      SpvMemorySemanticsAtomicCounterMemoryMask);
   2391    }
   2392 
   2393    /* TODO: Consider adding nir_var_mem_image mode to NIR so it can be used
   2394     * for SpvMemorySemanticsImageMemoryMask.
   2395     */
   2396 
   2397    nir_variable_mode modes = 0;
   2398    if (semantics & (SpvMemorySemanticsUniformMemoryMask |
   2399                     SpvMemorySemanticsImageMemoryMask)) {
   2400       modes |= nir_var_uniform |
   2401                nir_var_mem_ubo |
   2402                nir_var_mem_ssbo |
   2403                nir_var_mem_global;
   2404    }
   2405    if (semantics & SpvMemorySemanticsWorkgroupMemoryMask)
   2406       modes |= nir_var_mem_shared;
   2407    if (semantics & SpvMemorySemanticsCrossWorkgroupMemoryMask)
   2408       modes |= nir_var_mem_global;
   2409    if (semantics & SpvMemorySemanticsOutputMemoryMask) {
   2410       modes |= nir_var_shader_out;
   2411    }
   2412 
   2413    return modes;
   2414 }
   2415 
   2416 static nir_scope
   2417 vtn_scope_to_nir_scope(struct vtn_builder *b, SpvScope scope)
   2418 {
   2419    nir_scope nir_scope;
   2420    switch (scope) {
   2421    case SpvScopeDevice:
   2422       vtn_fail_if(b->options->caps.vk_memory_model &&
   2423                   !b->options->caps.vk_memory_model_device_scope,
   2424                   "If the Vulkan memory model is declared and any instruction "
   2425                   "uses Device scope, the VulkanMemoryModelDeviceScope "
   2426                   "capability must be declared.");
   2427       nir_scope = NIR_SCOPE_DEVICE;
   2428       break;
   2429 
   2430    case SpvScopeQueueFamily:
   2431       vtn_fail_if(!b->options->caps.vk_memory_model,
   2432                   "To use Queue Family scope, the VulkanMemoryModel capability "
   2433                   "must be declared.");
   2434       nir_scope = NIR_SCOPE_QUEUE_FAMILY;
   2435       break;
   2436 
   2437    case SpvScopeWorkgroup:
   2438       nir_scope = NIR_SCOPE_WORKGROUP;
   2439       break;
   2440 
   2441    case SpvScopeSubgroup:
   2442       nir_scope = NIR_SCOPE_SUBGROUP;
   2443       break;
   2444 
   2445    case SpvScopeInvocation:
   2446       nir_scope = NIR_SCOPE_INVOCATION;
   2447       break;
   2448 
   2449    case SpvScopeShaderCallKHR:
   2450       nir_scope = NIR_SCOPE_SHADER_CALL;
   2451       break;
   2452 
   2453    default:
   2454       vtn_fail("Invalid memory scope");
   2455    }
   2456 
   2457    return nir_scope;
   2458 }
   2459 
   2460 static void
   2461 vtn_emit_scoped_control_barrier(struct vtn_builder *b, SpvScope exec_scope,
   2462                                 SpvScope mem_scope,
   2463                                 SpvMemorySemanticsMask semantics)
   2464 {
   2465    nir_memory_semantics nir_semantics =
   2466       vtn_mem_semantics_to_nir_mem_semantics(b, semantics);
   2467    nir_variable_mode modes = vtn_mem_semantics_to_nir_var_modes(b, semantics);
   2468    nir_scope nir_exec_scope = vtn_scope_to_nir_scope(b, exec_scope);
   2469 
   2470    /* Memory semantics is optional for OpControlBarrier. */
   2471    nir_scope nir_mem_scope;
   2472    if (nir_semantics == 0 || modes == 0)
   2473       nir_mem_scope = NIR_SCOPE_NONE;
   2474    else
   2475       nir_mem_scope = vtn_scope_to_nir_scope(b, mem_scope);
   2476 
   2477    nir_scoped_barrier(&b->nb, .execution_scope=nir_exec_scope, .memory_scope=nir_mem_scope,
   2478                               .memory_semantics=nir_semantics, .memory_modes=modes);
   2479 }
   2480 
   2481 static void
   2482 vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope,
   2483                                SpvMemorySemanticsMask semantics)
   2484 {
   2485    nir_variable_mode modes = vtn_mem_semantics_to_nir_var_modes(b, semantics);
   2486    nir_memory_semantics nir_semantics =
   2487       vtn_mem_semantics_to_nir_mem_semantics(b, semantics);
   2488 
   2489    /* No barrier to add. */
   2490    if (nir_semantics == 0 || modes == 0)
   2491       return;
   2492 
   2493    nir_scoped_barrier(&b->nb, .memory_scope=vtn_scope_to_nir_scope(b, scope),
   2494                               .memory_semantics=nir_semantics,
   2495                               .memory_modes=modes);
   2496 }
   2497 
   2498 struct vtn_ssa_value *
   2499 vtn_create_ssa_value(struct vtn_builder *b, const struct glsl_type *type)
   2500 {
   2501    /* Always use bare types for SSA values for a couple of reasons:
   2502     *
   2503     *  1. Code which emits deref chains should never listen to the explicit
   2504     *     layout information on the SSA value if any exists.  If we've
   2505     *     accidentally been relying on this, we want to find those bugs.
   2506     *
   2507     *  2. We want to be able to quickly check that an SSA value being assigned
   2508     *     to a SPIR-V value has the right type.  Using bare types everywhere
   2509     *     ensures that we can pointer-compare.
   2510     */
   2511    struct vtn_ssa_value *val = rzalloc(b, struct vtn_ssa_value);
   2512    val->type = glsl_get_bare_type(type);
   2513 
   2514 
   2515    if (!glsl_type_is_vector_or_scalar(type)) {
   2516       unsigned elems = glsl_get_length(val->type);
   2517       val->elems = ralloc_array(b, struct vtn_ssa_value *, elems);
   2518       if (glsl_type_is_array_or_matrix(type)) {
   2519          const struct glsl_type *elem_type = glsl_get_array_element(type);
   2520          for (unsigned i = 0; i < elems; i++)
   2521             val->elems[i] = vtn_create_ssa_value(b, elem_type);
   2522       } else {
   2523          vtn_assert(glsl_type_is_struct_or_ifc(type));
   2524          for (unsigned i = 0; i < elems; i++) {
   2525             const struct glsl_type *elem_type = glsl_get_struct_field(type, i);
   2526             val->elems[i] = vtn_create_ssa_value(b, elem_type);
   2527          }
   2528       }
   2529    }
   2530 
   2531    return val;
   2532 }
   2533 
   2534 static nir_tex_src
   2535 vtn_tex_src(struct vtn_builder *b, unsigned index, nir_tex_src_type type)
   2536 {
   2537    nir_tex_src src;
   2538    src.src = nir_src_for_ssa(vtn_get_nir_ssa(b, index));
   2539    src.src_type = type;
   2540    return src;
   2541 }
   2542 
   2543 static uint32_t
   2544 image_operand_arg(struct vtn_builder *b, const uint32_t *w, uint32_t count,
   2545                   uint32_t mask_idx, SpvImageOperandsMask op)
   2546 {
   2547    static const SpvImageOperandsMask ops_with_arg =
   2548       SpvImageOperandsBiasMask |
   2549       SpvImageOperandsLodMask |
   2550       SpvImageOperandsGradMask |
   2551       SpvImageOperandsConstOffsetMask |
   2552       SpvImageOperandsOffsetMask |
   2553       SpvImageOperandsConstOffsetsMask |
   2554       SpvImageOperandsSampleMask |
   2555       SpvImageOperandsMinLodMask |
   2556       SpvImageOperandsMakeTexelAvailableMask |
   2557       SpvImageOperandsMakeTexelVisibleMask;
   2558 
   2559    assert(util_bitcount(op) == 1);
   2560    assert(w[mask_idx] & op);
   2561    assert(op & ops_with_arg);
   2562 
   2563    uint32_t idx = util_bitcount(w[mask_idx] & (op - 1) & ops_with_arg) + 1;
   2564 
   2565    /* Adjust indices for operands with two arguments. */
   2566    static const SpvImageOperandsMask ops_with_two_args =
   2567       SpvImageOperandsGradMask;
   2568    idx += util_bitcount(w[mask_idx] & (op - 1) & ops_with_two_args);
   2569 
   2570    idx += mask_idx;
   2571 
   2572    vtn_fail_if(idx + (op & ops_with_two_args ? 1 : 0) >= count,
   2573                "Image op claims to have %s but does not enough "
   2574                "following operands", spirv_imageoperands_to_string(op));
   2575 
   2576    return idx;
   2577 }
   2578 
   2579 static void
   2580 non_uniform_decoration_cb(struct vtn_builder *b,
   2581                           struct vtn_value *val, int member,
   2582                           const struct vtn_decoration *dec, void *void_ctx)
   2583 {
   2584    enum gl_access_qualifier *access = void_ctx;
   2585    switch (dec->decoration) {
   2586    case SpvDecorationNonUniformEXT:
   2587       *access |= ACCESS_NON_UNIFORM;
   2588       break;
   2589 
   2590    default:
   2591       break;
   2592    }
   2593 }
   2594 
   2595 /* Apply SignExtend/ZeroExtend operands to get the actual result type for
   2596  * image read/sample operations and source type for write operations.
   2597  */
   2598 static nir_alu_type
   2599 get_image_type(struct vtn_builder *b, nir_alu_type type, unsigned operands)
   2600 {
   2601    unsigned extend_operands =
   2602       operands & (SpvImageOperandsSignExtendMask | SpvImageOperandsZeroExtendMask);
   2603    vtn_fail_if(nir_alu_type_get_base_type(type) == nir_type_float && extend_operands,
   2604                "SignExtend/ZeroExtend used on floating-point texel type");
   2605    vtn_fail_if(extend_operands ==
   2606                (SpvImageOperandsSignExtendMask | SpvImageOperandsZeroExtendMask),
   2607                "SignExtend and ZeroExtend both specified");
   2608 
   2609    if (operands & SpvImageOperandsSignExtendMask)
   2610       return nir_type_int | nir_alu_type_get_type_size(type);
   2611    if (operands & SpvImageOperandsZeroExtendMask)
   2612       return nir_type_uint | nir_alu_type_get_type_size(type);
   2613 
   2614    return type;
   2615 }
   2616 
   2617 static void
   2618 vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
   2619                    const uint32_t *w, unsigned count)
   2620 {
   2621    if (opcode == SpvOpSampledImage) {
   2622       struct vtn_sampled_image si = {
   2623          .image = vtn_get_image(b, w[3], NULL),
   2624          .sampler = vtn_get_sampler(b, w[4]),
   2625       };
   2626 
   2627       enum gl_access_qualifier access = 0;
   2628       vtn_foreach_decoration(b, vtn_untyped_value(b, w[3]),
   2629                              non_uniform_decoration_cb, &access);
   2630       vtn_foreach_decoration(b, vtn_untyped_value(b, w[4]),
   2631                              non_uniform_decoration_cb, &access);
   2632 
   2633       vtn_push_sampled_image(b, w[2], si, access & ACCESS_NON_UNIFORM);
   2634       return;
   2635    } else if (opcode == SpvOpImage) {
   2636       struct vtn_sampled_image si = vtn_get_sampled_image(b, w[3]);
   2637 
   2638       enum gl_access_qualifier access = 0;
   2639       vtn_foreach_decoration(b, vtn_untyped_value(b, w[3]),
   2640                              non_uniform_decoration_cb, &access);
   2641 
   2642       vtn_push_image(b, w[2], si.image, access & ACCESS_NON_UNIFORM);
   2643       return;
   2644    } else if (opcode == SpvOpImageSparseTexelsResident) {
   2645       nir_ssa_def *code = vtn_get_nir_ssa(b, w[3]);
   2646       vtn_push_nir_ssa(b, w[2], nir_is_sparse_texels_resident(&b->nb, code));
   2647       return;
   2648    }
   2649 
   2650    nir_deref_instr *image = NULL, *sampler = NULL;
   2651    struct vtn_value *sampled_val = vtn_untyped_value(b, w[3]);
   2652    if (sampled_val->type->base_type == vtn_base_type_sampled_image) {
   2653       struct vtn_sampled_image si = vtn_get_sampled_image(b, w[3]);
   2654       image = si.image;
   2655       sampler = si.sampler;
   2656    } else {
   2657       image = vtn_get_image(b, w[3], NULL);
   2658    }
   2659 
   2660    const enum glsl_sampler_dim sampler_dim = glsl_get_sampler_dim(image->type);
   2661    const bool is_array = glsl_sampler_type_is_array(image->type);
   2662    nir_alu_type dest_type = nir_type_invalid;
   2663 
   2664    /* Figure out the base texture operation */
   2665    nir_texop texop;
   2666    switch (opcode) {
   2667    case SpvOpImageSampleImplicitLod:
   2668    case SpvOpImageSparseSampleImplicitLod:
   2669    case SpvOpImageSampleDrefImplicitLod:
   2670    case SpvOpImageSparseSampleDrefImplicitLod:
   2671    case SpvOpImageSampleProjImplicitLod:
   2672    case SpvOpImageSampleProjDrefImplicitLod:
   2673       texop = nir_texop_tex;
   2674       break;
   2675 
   2676    case SpvOpImageSampleExplicitLod:
   2677    case SpvOpImageSparseSampleExplicitLod:
   2678    case SpvOpImageSampleDrefExplicitLod:
   2679    case SpvOpImageSparseSampleDrefExplicitLod:
   2680    case SpvOpImageSampleProjExplicitLod:
   2681    case SpvOpImageSampleProjDrefExplicitLod:
   2682       texop = nir_texop_txl;
   2683       break;
   2684 
   2685    case SpvOpImageFetch:
   2686    case SpvOpImageSparseFetch:
   2687       if (sampler_dim == GLSL_SAMPLER_DIM_MS) {
   2688          texop = nir_texop_txf_ms;
   2689       } else {
   2690          texop = nir_texop_txf;
   2691       }
   2692       break;
   2693 
   2694    case SpvOpImageGather:
   2695    case SpvOpImageSparseGather:
   2696    case SpvOpImageDrefGather:
   2697    case SpvOpImageSparseDrefGather:
   2698       texop = nir_texop_tg4;
   2699       break;
   2700 
   2701    case SpvOpImageQuerySizeLod:
   2702    case SpvOpImageQuerySize:
   2703       texop = nir_texop_txs;
   2704       dest_type = nir_type_int32;
   2705       break;
   2706 
   2707    case SpvOpImageQueryLod:
   2708       texop = nir_texop_lod;
   2709       dest_type = nir_type_float32;
   2710       break;
   2711 
   2712    case SpvOpImageQueryLevels:
   2713       texop = nir_texop_query_levels;
   2714       dest_type = nir_type_int32;
   2715       break;
   2716 
   2717    case SpvOpImageQuerySamples:
   2718       texop = nir_texop_texture_samples;
   2719       dest_type = nir_type_int32;
   2720       break;
   2721 
   2722    case SpvOpFragmentFetchAMD:
   2723       texop = nir_texop_fragment_fetch_amd;
   2724       break;
   2725 
   2726    case SpvOpFragmentMaskFetchAMD:
   2727       texop = nir_texop_fragment_mask_fetch_amd;
   2728       dest_type = nir_type_uint32;
   2729       break;
   2730 
   2731    default:
   2732       vtn_fail_with_opcode("Unhandled opcode", opcode);
   2733    }
   2734 
   2735    nir_tex_src srcs[10]; /* 10 should be enough */
   2736    nir_tex_src *p = srcs;
   2737 
   2738    p->src = nir_src_for_ssa(&image->dest.ssa);
   2739    p->src_type = nir_tex_src_texture_deref;
   2740    p++;
   2741 
   2742    switch (texop) {
   2743    case nir_texop_tex:
   2744    case nir_texop_txb:
   2745    case nir_texop_txl:
   2746    case nir_texop_txd:
   2747    case nir_texop_tg4:
   2748    case nir_texop_lod:
   2749       vtn_fail_if(sampler == NULL,
   2750                   "%s requires an image of type OpTypeSampledImage",
   2751                   spirv_op_to_string(opcode));
   2752       p->src = nir_src_for_ssa(&sampler->dest.ssa);
   2753       p->src_type = nir_tex_src_sampler_deref;
   2754       p++;
   2755       break;
   2756    case nir_texop_txf:
   2757    case nir_texop_txf_ms:
   2758    case nir_texop_txs:
   2759    case nir_texop_query_levels:
   2760    case nir_texop_texture_samples:
   2761    case nir_texop_samples_identical:
   2762    case nir_texop_fragment_fetch_amd:
   2763    case nir_texop_fragment_mask_fetch_amd:
   2764       /* These don't */
   2765       break;
   2766    case nir_texop_txf_ms_fb:
   2767       vtn_fail("unexpected nir_texop_txf_ms_fb");
   2768       break;
   2769    case nir_texop_txf_ms_mcs_intel:
   2770       vtn_fail("unexpected nir_texop_txf_ms_mcs");
   2771    case nir_texop_tex_prefetch:
   2772       vtn_fail("unexpected nir_texop_tex_prefetch");
   2773    }
   2774 
   2775    unsigned idx = 4;
   2776 
   2777    struct nir_ssa_def *coord;
   2778    unsigned coord_components;
   2779    switch (opcode) {
   2780    case SpvOpImageSampleImplicitLod:
   2781    case SpvOpImageSparseSampleImplicitLod:
   2782    case SpvOpImageSampleExplicitLod:
   2783    case SpvOpImageSparseSampleExplicitLod:
   2784    case SpvOpImageSampleDrefImplicitLod:
   2785    case SpvOpImageSparseSampleDrefImplicitLod:
   2786    case SpvOpImageSampleDrefExplicitLod:
   2787    case SpvOpImageSparseSampleDrefExplicitLod:
   2788    case SpvOpImageSampleProjImplicitLod:
   2789    case SpvOpImageSampleProjExplicitLod:
   2790    case SpvOpImageSampleProjDrefImplicitLod:
   2791    case SpvOpImageSampleProjDrefExplicitLod:
   2792    case SpvOpImageFetch:
   2793    case SpvOpImageSparseFetch:
   2794    case SpvOpImageGather:
   2795    case SpvOpImageSparseGather:
   2796    case SpvOpImageDrefGather:
   2797    case SpvOpImageSparseDrefGather:
   2798    case SpvOpImageQueryLod:
   2799    case SpvOpFragmentFetchAMD:
   2800    case SpvOpFragmentMaskFetchAMD: {
   2801       /* All these types have the coordinate as their first real argument */
   2802       coord_components = glsl_get_sampler_dim_coordinate_components(sampler_dim);
   2803 
   2804       if (is_array && texop != nir_texop_lod)
   2805          coord_components++;
   2806 
   2807       struct vtn_ssa_value *coord_val = vtn_ssa_value(b, w[idx++]);
   2808       coord = coord_val->def;
   2809       /* From the SPIR-V spec verxion 1.5, rev. 5:
   2810        *
   2811        *    "Coordinate must be a scalar or vector of floating-point type. It
   2812        *    contains (u[, v] ... [, array layer]) as needed by the definition
   2813        *    of Sampled Image. It may be a vector larger than needed, but all
   2814        *    unused components appear after all used components."
   2815        */
   2816       vtn_fail_if(coord->num_components < coord_components,
   2817                   "Coordinate value passed has fewer components than sampler dimensionality.");
   2818       p->src = nir_src_for_ssa(nir_channels(&b->nb, coord,
   2819                                             (1 << coord_components) - 1));
   2820 
   2821       /* OpenCL allows integer sampling coordinates */
   2822       if (glsl_type_is_integer(coord_val->type) &&
   2823           opcode == SpvOpImageSampleExplicitLod) {
   2824          vtn_fail_if(b->shader->info.stage != MESA_SHADER_KERNEL,
   2825                      "Unless the Kernel capability is being used, the coordinate parameter "
   2826                      "OpImageSampleExplicitLod must be floating point.");
   2827 
   2828          nir_ssa_def *coords[4];
   2829          nir_ssa_def *f0_5 = nir_imm_float(&b->nb, 0.5);
   2830          for (unsigned i = 0; i < coord_components; i++) {
   2831             coords[i] = nir_i2f32(&b->nb, nir_channel(&b->nb, p->src.ssa, i));
   2832 
   2833             if (!is_array || i != coord_components - 1)
   2834                coords[i] = nir_fadd(&b->nb, coords[i], f0_5);
   2835          }
   2836 
   2837          p->src = nir_src_for_ssa(nir_vec(&b->nb, coords, coord_components));
   2838       }
   2839 
   2840       p->src_type = nir_tex_src_coord;
   2841       p++;
   2842       break;
   2843    }
   2844 
   2845    default:
   2846       coord = NULL;
   2847       coord_components = 0;
   2848       break;
   2849    }
   2850 
   2851    switch (opcode) {
   2852    case SpvOpImageSampleProjImplicitLod:
   2853    case SpvOpImageSampleProjExplicitLod:
   2854    case SpvOpImageSampleProjDrefImplicitLod:
   2855    case SpvOpImageSampleProjDrefExplicitLod:
   2856       /* These have the projector as the last coordinate component */
   2857       p->src = nir_src_for_ssa(nir_channel(&b->nb, coord, coord_components));
   2858       p->src_type = nir_tex_src_projector;
   2859       p++;
   2860       break;
   2861 
   2862    default:
   2863       break;
   2864    }
   2865 
   2866    bool is_shadow = false;
   2867    unsigned gather_component = 0;
   2868    switch (opcode) {
   2869    case SpvOpImageSampleDrefImplicitLod:
   2870    case SpvOpImageSparseSampleDrefImplicitLod:
   2871    case SpvOpImageSampleDrefExplicitLod:
   2872    case SpvOpImageSparseSampleDrefExplicitLod:
   2873    case SpvOpImageSampleProjDrefImplicitLod:
   2874    case SpvOpImageSampleProjDrefExplicitLod:
   2875    case SpvOpImageDrefGather:
   2876    case SpvOpImageSparseDrefGather:
   2877       /* These all have an explicit depth value as their next source */
   2878       is_shadow = true;
   2879       (*p++) = vtn_tex_src(b, w[idx++], nir_tex_src_comparator);
   2880       break;
   2881 
   2882    case SpvOpImageGather:
   2883    case SpvOpImageSparseGather:
   2884       /* This has a component as its next source */
   2885       gather_component = vtn_constant_uint(b, w[idx++]);
   2886       break;
   2887 
   2888    default:
   2889       break;
   2890    }
   2891 
   2892    bool is_sparse = false;
   2893    switch (opcode) {
   2894    case SpvOpImageSparseSampleImplicitLod:
   2895    case SpvOpImageSparseSampleExplicitLod:
   2896    case SpvOpImageSparseSampleDrefImplicitLod:
   2897    case SpvOpImageSparseSampleDrefExplicitLod:
   2898    case SpvOpImageSparseFetch:
   2899    case SpvOpImageSparseGather:
   2900    case SpvOpImageSparseDrefGather:
   2901       is_sparse = true;
   2902       break;
   2903    default:
   2904       break;
   2905    }
   2906 
   2907    /* For OpImageQuerySizeLod, we always have an LOD */
   2908    if (opcode == SpvOpImageQuerySizeLod)
   2909       (*p++) = vtn_tex_src(b, w[idx++], nir_tex_src_lod);
   2910 
   2911    /* For OpFragmentFetchAMD, we always have a multisample index */
   2912    if (opcode == SpvOpFragmentFetchAMD)
   2913       (*p++) = vtn_tex_src(b, w[idx++], nir_tex_src_ms_index);
   2914 
   2915    /* Now we need to handle some number of optional arguments */
   2916    struct vtn_value *gather_offsets = NULL;
   2917    uint32_t operands = SpvImageOperandsMaskNone;
   2918    if (idx < count) {
   2919       operands = w[idx];
   2920 
   2921       if (operands & SpvImageOperandsBiasMask) {
   2922          vtn_assert(texop == nir_texop_tex ||
   2923                     texop == nir_texop_tg4);
   2924          if (texop == nir_texop_tex)
   2925             texop = nir_texop_txb;
   2926          uint32_t arg = image_operand_arg(b, w, count, idx,
   2927                                           SpvImageOperandsBiasMask);
   2928          (*p++) = vtn_tex_src(b, w[arg], nir_tex_src_bias);
   2929       }
   2930 
   2931       if (operands & SpvImageOperandsLodMask) {
   2932          vtn_assert(texop == nir_texop_txl || texop == nir_texop_txf ||
   2933                     texop == nir_texop_txs || texop == nir_texop_tg4);
   2934          uint32_t arg = image_operand_arg(b, w, count, idx,
   2935                                           SpvImageOperandsLodMask);
   2936          (*p++) = vtn_tex_src(b, w[arg], nir_tex_src_lod);
   2937       }
   2938 
   2939       if (operands & SpvImageOperandsGradMask) {
   2940          vtn_assert(texop == nir_texop_txl);
   2941          texop = nir_texop_txd;
   2942          uint32_t arg = image_operand_arg(b, w, count, idx,
   2943                                           SpvImageOperandsGradMask);
   2944          (*p++) = vtn_tex_src(b, w[arg], nir_tex_src_ddx);
   2945          (*p++) = vtn_tex_src(b, w[arg + 1], nir_tex_src_ddy);
   2946       }
   2947 
   2948       vtn_fail_if(util_bitcount(operands & (SpvImageOperandsConstOffsetsMask |
   2949                                             SpvImageOperandsOffsetMask |
   2950                                             SpvImageOperandsConstOffsetMask)) > 1,
   2951                   "At most one of the ConstOffset, Offset, and ConstOffsets "
   2952                   "image operands can be used on a given instruction.");
   2953 
   2954       if (operands & SpvImageOperandsOffsetMask) {
   2955          uint32_t arg = image_operand_arg(b, w, count, idx,
   2956                                           SpvImageOperandsOffsetMask);
   2957          (*p++) = vtn_tex_src(b, w[arg], nir_tex_src_offset);
   2958       }
   2959 
   2960       if (operands & SpvImageOperandsConstOffsetMask) {
   2961          uint32_t arg = image_operand_arg(b, w, count, idx,
   2962                                           SpvImageOperandsConstOffsetMask);
   2963          (*p++) = vtn_tex_src(b, w[arg], nir_tex_src_offset);
   2964       }
   2965 
   2966       if (operands & SpvImageOperandsConstOffsetsMask) {
   2967          vtn_assert(texop == nir_texop_tg4);
   2968          uint32_t arg = image_operand_arg(b, w, count, idx,
   2969                                           SpvImageOperandsConstOffsetsMask);
   2970          gather_offsets = vtn_value(b, w[arg], vtn_value_type_constant);
   2971       }
   2972 
   2973       if (operands & SpvImageOperandsSampleMask) {
   2974          vtn_assert(texop == nir_texop_txf_ms);
   2975          uint32_t arg = image_operand_arg(b, w, count, idx,
   2976                                           SpvImageOperandsSampleMask);
   2977          texop = nir_texop_txf_ms;
   2978          (*p++) = vtn_tex_src(b, w[arg], nir_tex_src_ms_index);
   2979       }
   2980 
   2981       if (operands & SpvImageOperandsMinLodMask) {
   2982          vtn_assert(texop == nir_texop_tex ||
   2983                     texop == nir_texop_txb ||
   2984                     texop == nir_texop_txd);
   2985          uint32_t arg = image_operand_arg(b, w, count, idx,
   2986                                           SpvImageOperandsMinLodMask);
   2987          (*p++) = vtn_tex_src(b, w[arg], nir_tex_src_min_lod);
   2988       }
   2989    }
   2990 
   2991    struct vtn_type *ret_type = vtn_get_type(b, w[1]);
   2992    struct vtn_type *struct_type = NULL;
   2993    if (is_sparse) {
   2994       vtn_assert(glsl_type_is_struct_or_ifc(ret_type->type));
   2995       struct_type = ret_type;
   2996       ret_type = struct_type->members[1];
   2997    }
   2998 
   2999    nir_tex_instr *instr = nir_tex_instr_create(b->shader, p - srcs);
   3000    instr->op = texop;
   3001 
   3002    memcpy(instr->src, srcs, instr->num_srcs * sizeof(*instr->src));
   3003 
   3004    instr->coord_components = coord_components;
   3005    instr->sampler_dim = sampler_dim;
   3006    instr->is_array = is_array;
   3007    instr->is_shadow = is_shadow;
   3008    instr->is_sparse = is_sparse;
   3009    instr->is_new_style_shadow =
   3010       is_shadow && glsl_get_components(ret_type->type) == 1;
   3011    instr->component = gather_component;
   3012 
   3013    /* The Vulkan spec says:
   3014     *
   3015     *    "If an instruction loads from or stores to a resource (including
   3016     *    atomics and image instructions) and the resource descriptor being
   3017     *    accessed is not dynamically uniform, then the operand corresponding
   3018     *    to that resource (e.g. the pointer or sampled image operand) must be
   3019     *    decorated with NonUniform."
   3020     *
   3021     * It's very careful to specify that the exact operand must be decorated
   3022     * NonUniform.  The SPIR-V parser is not expected to chase through long
   3023     * chains to find the NonUniform decoration.  It's either right there or we
   3024     * can assume it doesn't exist.
   3025     */
   3026    enum gl_access_qualifier access = 0;
   3027    vtn_foreach_decoration(b, sampled_val, non_uniform_decoration_cb, &access);
   3028 
   3029    if (sampled_val->propagated_non_uniform)
   3030       access |= ACCESS_NON_UNIFORM;
   3031 
   3032    if (image && (access & ACCESS_NON_UNIFORM))
   3033       instr->texture_non_uniform = true;
   3034 
   3035    if (sampler && (access & ACCESS_NON_UNIFORM))
   3036       instr->sampler_non_uniform = true;
   3037 
   3038    /* for non-query ops, get dest_type from SPIR-V return type */
   3039    if (dest_type == nir_type_invalid) {
   3040       /* the return type should match the image type, unless the image type is
   3041        * VOID (CL image), in which case the return type dictates the sampler
   3042        */
   3043       enum glsl_base_type sampler_base =
   3044          glsl_get_sampler_result_type(image->type);
   3045       enum glsl_base_type ret_base = glsl_get_base_type(ret_type->type);
   3046       vtn_fail_if(sampler_base != ret_base && sampler_base != GLSL_TYPE_VOID,
   3047                   "SPIR-V return type mismatches image type. This is only valid "
   3048                   "for untyped images (OpenCL).");
   3049       dest_type = nir_get_nir_type_for_glsl_base_type(ret_base);
   3050       dest_type = get_image_type(b, dest_type, operands);
   3051    }
   3052 
   3053    instr->dest_type = dest_type;
   3054 
   3055    nir_ssa_dest_init(&instr->instr, &instr->dest,
   3056                      nir_tex_instr_dest_size(instr), 32, NULL);
   3057 
   3058    vtn_assert(glsl_get_vector_elements(ret_type->type) ==
   3059               nir_tex_instr_result_size(instr));
   3060 
   3061    if (gather_offsets) {
   3062       vtn_fail_if(gather_offsets->type->base_type != vtn_base_type_array ||
   3063                   gather_offsets->type->length != 4,
   3064                   "ConstOffsets must be an array of size four of vectors "
   3065                   "of two integer components");
   3066 
   3067       struct vtn_type *vec_type = gather_offsets->type->array_element;
   3068       vtn_fail_if(vec_type->base_type != vtn_base_type_vector ||
   3069                   vec_type->length != 2 ||
   3070                   !glsl_type_is_integer(vec_type->type),
   3071                   "ConstOffsets must be an array of size four of vectors "
   3072                   "of two integer components");
   3073 
   3074       unsigned bit_size = glsl_get_bit_size(vec_type->type);
   3075       for (uint32_t i = 0; i < 4; i++) {
   3076          const nir_const_value *cvec =
   3077             gather_offsets->constant->elements[i]->values;
   3078          for (uint32_t j = 0; j < 2; j++) {
   3079             switch (bit_size) {
   3080             case 8:  instr->tg4_offsets[i][j] = cvec[j].i8;    break;
   3081             case 16: instr->tg4_offsets[i][j] = cvec[j].i16;   break;
   3082             case 32: instr->tg4_offsets[i][j] = cvec[j].i32;   break;
   3083             case 64: instr->tg4_offsets[i][j] = cvec[j].i64;   break;
   3084             default:
   3085                vtn_fail("Unsupported bit size: %u", bit_size);
   3086             }
   3087          }
   3088       }
   3089    }
   3090 
   3091    nir_builder_instr_insert(&b->nb, &instr->instr);
   3092 
   3093    if (is_sparse) {
   3094       struct vtn_ssa_value *dest = vtn_create_ssa_value(b, struct_type->type);
   3095       unsigned result_size = glsl_get_vector_elements(ret_type->type);
   3096       dest->elems[0]->def = nir_channel(&b->nb, &instr->dest.ssa, result_size);
   3097       dest->elems[1]->def = nir_channels(&b->nb, &instr->dest.ssa,
   3098                                          (nir_component_mask_t)
   3099 					 BITFIELD_MASK(result_size));
   3100       vtn_push_ssa_value(b, w[2], dest);
   3101    } else {
   3102       vtn_push_nir_ssa(b, w[2], &instr->dest.ssa);
   3103    }
   3104 }
   3105 
   3106 static void
   3107 fill_common_atomic_sources(struct vtn_builder *b, SpvOp opcode,
   3108                            const uint32_t *w, nir_src *src)
   3109 {
   3110    const struct glsl_type *type = vtn_get_type(b, w[1])->type;
   3111    unsigned bit_size = glsl_get_bit_size(type);
   3112 
   3113    switch (opcode) {
   3114    case SpvOpAtomicIIncrement:
   3115       src[0] = nir_src_for_ssa(nir_imm_intN_t(&b->nb, 1, bit_size));
   3116       break;
   3117 
   3118    case SpvOpAtomicIDecrement:
   3119       src[0] = nir_src_for_ssa(nir_imm_intN_t(&b->nb, -1, bit_size));
   3120       break;
   3121 
   3122    case SpvOpAtomicISub:
   3123       src[0] =
   3124          nir_src_for_ssa(nir_ineg(&b->nb, vtn_get_nir_ssa(b, w[6])));
   3125       break;
   3126 
   3127    case SpvOpAtomicCompareExchange:
   3128    case SpvOpAtomicCompareExchangeWeak:
   3129       src[0] = nir_src_for_ssa(vtn_get_nir_ssa(b, w[8]));
   3130       src[1] = nir_src_for_ssa(vtn_get_nir_ssa(b, w[7]));
   3131       break;
   3132 
   3133    case SpvOpAtomicExchange:
   3134    case SpvOpAtomicIAdd:
   3135    case SpvOpAtomicSMin:
   3136    case SpvOpAtomicUMin:
   3137    case SpvOpAtomicSMax:
   3138    case SpvOpAtomicUMax:
   3139    case SpvOpAtomicAnd:
   3140    case SpvOpAtomicOr:
   3141    case SpvOpAtomicXor:
   3142    case SpvOpAtomicFAddEXT:
   3143    case SpvOpAtomicFMinEXT:
   3144    case SpvOpAtomicFMaxEXT:
   3145       src[0] = nir_src_for_ssa(vtn_get_nir_ssa(b, w[6]));
   3146       break;
   3147 
   3148    default:
   3149       vtn_fail_with_opcode("Invalid SPIR-V atomic", opcode);
   3150    }
   3151 }
   3152 
   3153 static nir_ssa_def *
   3154 get_image_coord(struct vtn_builder *b, uint32_t value)
   3155 {
   3156    nir_ssa_def *coord = vtn_get_nir_ssa(b, value);
   3157    /* The image_load_store intrinsics assume a 4-dim coordinate */
   3158    return nir_pad_vec4(&b->nb, coord);
   3159 }
   3160 
   3161 static void
   3162 vtn_handle_image(struct vtn_builder *b, SpvOp opcode,
   3163                  const uint32_t *w, unsigned count)
   3164 {
   3165    /* Just get this one out of the way */
   3166    if (opcode == SpvOpImageTexelPointer) {
   3167       struct vtn_value *val =
   3168          vtn_push_value(b, w[2], vtn_value_type_image_pointer);
   3169       val->image = ralloc(b, struct vtn_image_pointer);
   3170 
   3171       val->image->image = vtn_nir_deref(b, w[3]);
   3172       val->image->coord = get_image_coord(b, w[4]);
   3173       val->image->sample = vtn_get_nir_ssa(b, w[5]);
   3174       val->image->lod = nir_imm_int(&b->nb, 0);
   3175       return;
   3176    }
   3177 
   3178    struct vtn_image_pointer image;
   3179    SpvScope scope = SpvScopeInvocation;
   3180    SpvMemorySemanticsMask semantics = 0;
   3181    SpvImageOperandsMask operands = SpvImageOperandsMaskNone;
   3182 
   3183    enum gl_access_qualifier access = 0;
   3184 
   3185    struct vtn_value *res_val;
   3186    switch (opcode) {
   3187    case SpvOpAtomicExchange:
   3188    case SpvOpAtomicCompareExchange:
   3189    case SpvOpAtomicCompareExchangeWeak:
   3190    case SpvOpAtomicIIncrement:
   3191    case SpvOpAtomicIDecrement:
   3192    case SpvOpAtomicIAdd:
   3193    case SpvOpAtomicISub:
   3194    case SpvOpAtomicLoad:
   3195    case SpvOpAtomicSMin:
   3196    case SpvOpAtomicUMin:
   3197    case SpvOpAtomicSMax:
   3198    case SpvOpAtomicUMax:
   3199    case SpvOpAtomicAnd:
   3200    case SpvOpAtomicOr:
   3201    case SpvOpAtomicXor:
   3202    case SpvOpAtomicFAddEXT:
   3203    case SpvOpAtomicFMinEXT:
   3204    case SpvOpAtomicFMaxEXT:
   3205       res_val = vtn_value(b, w[3], vtn_value_type_image_pointer);
   3206       image = *res_val->image;
   3207       scope = vtn_constant_uint(b, w[4]);
   3208       semantics = vtn_constant_uint(b, w[5]);
   3209       access |= ACCESS_COHERENT;
   3210       break;
   3211 
   3212    case SpvOpAtomicStore:
   3213       res_val = vtn_value(b, w[1], vtn_value_type_image_pointer);
   3214       image = *res_val->image;
   3215       scope = vtn_constant_uint(b, w[2]);
   3216       semantics = vtn_constant_uint(b, w[3]);
   3217       access |= ACCESS_COHERENT;
   3218       break;
   3219 
   3220    case SpvOpImageQuerySizeLod:
   3221       res_val = vtn_untyped_value(b, w[3]);
   3222       image.image = vtn_get_image(b, w[3], &access);
   3223       image.coord = NULL;
   3224       image.sample = NULL;
   3225       image.lod = vtn_ssa_value(b, w[4])->def;
   3226       break;
   3227 
   3228    case SpvOpImageQuerySize:
   3229    case SpvOpImageQuerySamples:
   3230       res_val = vtn_untyped_value(b, w[3]);
   3231       image.image = vtn_get_image(b, w[3], &access);
   3232       image.coord = NULL;
   3233       image.sample = NULL;
   3234       image.lod = NULL;
   3235       break;
   3236 
   3237    case SpvOpImageQueryFormat:
   3238    case SpvOpImageQueryOrder:
   3239       res_val = vtn_untyped_value(b, w[3]);
   3240       image.image = vtn_get_image(b, w[3], &access);
   3241       image.coord = NULL;
   3242       image.sample = NULL;
   3243       image.lod = NULL;
   3244       break;
   3245 
   3246    case SpvOpImageRead:
   3247    case SpvOpImageSparseRead: {
   3248       res_val = vtn_untyped_value(b, w[3]);
   3249       image.image = vtn_get_image(b, w[3], &access);
   3250       image.coord = get_image_coord(b, w[4]);
   3251 
   3252       operands = count > 5 ? w[5] : SpvImageOperandsMaskNone;
   3253 
   3254       if (operands & SpvImageOperandsSampleMask) {
   3255          uint32_t arg = image_operand_arg(b, w, count, 5,
   3256                                           SpvImageOperandsSampleMask);
   3257          image.sample = vtn_get_nir_ssa(b, w[arg]);
   3258       } else {
   3259          image.sample = nir_ssa_undef(&b->nb, 1, 32);
   3260       }
   3261 
   3262       if (operands & SpvImageOperandsMakeTexelVisibleMask) {
   3263          vtn_fail_if((operands & SpvImageOperandsNonPrivateTexelMask) == 0,
   3264                      "MakeTexelVisible requires NonPrivateTexel to also be set.");
   3265          uint32_t arg = image_operand_arg(b, w, count, 5,
   3266                                           SpvImageOperandsMakeTexelVisibleMask);
   3267          semantics = SpvMemorySemanticsMakeVisibleMask;
   3268          scope = vtn_constant_uint(b, w[arg]);
   3269       }
   3270 
   3271       if (operands & SpvImageOperandsLodMask) {
   3272          uint32_t arg = image_operand_arg(b, w, count, 5,
   3273                                           SpvImageOperandsLodMask);
   3274          image.lod = vtn_get_nir_ssa(b, w[arg]);
   3275       } else {
   3276          image.lod = nir_imm_int(&b->nb, 0);
   3277       }
   3278 
   3279       if (operands & SpvImageOperandsVolatileTexelMask)
   3280          access |= ACCESS_VOLATILE;
   3281 
   3282       break;
   3283    }
   3284 
   3285    case SpvOpImageWrite: {
   3286       res_val = vtn_untyped_value(b, w[1]);
   3287       image.image = vtn_get_image(b, w[1], &access);
   3288       image.coord = get_image_coord(b, w[2]);
   3289 
   3290       /* texel = w[3] */
   3291 
   3292       operands = count > 4 ? w[4] : SpvImageOperandsMaskNone;
   3293 
   3294       if (operands & SpvImageOperandsSampleMask) {
   3295          uint32_t arg = image_operand_arg(b, w, count, 4,
   3296                                           SpvImageOperandsSampleMask);
   3297          image.sample = vtn_get_nir_ssa(b, w[arg]);
   3298       } else {
   3299          image.sample = nir_ssa_undef(&b->nb, 1, 32);
   3300       }
   3301 
   3302       if (operands & SpvImageOperandsMakeTexelAvailableMask) {
   3303          vtn_fail_if((operands & SpvImageOperandsNonPrivateTexelMask) == 0,
   3304                      "MakeTexelAvailable requires NonPrivateTexel to also be set.");
   3305          uint32_t arg = image_operand_arg(b, w, count, 4,
   3306                                           SpvImageOperandsMakeTexelAvailableMask);
   3307          semantics = SpvMemorySemanticsMakeAvailableMask;
   3308          scope = vtn_constant_uint(b, w[arg]);
   3309       }
   3310 
   3311       if (operands & SpvImageOperandsLodMask) {
   3312          uint32_t arg = image_operand_arg(b, w, count, 4,
   3313                                           SpvImageOperandsLodMask);
   3314          image.lod = vtn_get_nir_ssa(b, w[arg]);
   3315       } else {
   3316          image.lod = nir_imm_int(&b->nb, 0);
   3317       }
   3318 
   3319       if (operands & SpvImageOperandsVolatileTexelMask)
   3320          access |= ACCESS_VOLATILE;
   3321 
   3322       break;
   3323    }
   3324 
   3325    default:
   3326       vtn_fail_with_opcode("Invalid image opcode", opcode);
   3327    }
   3328 
   3329    if (semantics & SpvMemorySemanticsVolatileMask)
   3330       access |= ACCESS_VOLATILE;
   3331 
   3332    nir_intrinsic_op op;
   3333    switch (opcode) {
   3334 #define OP(S, N) case SpvOp##S: op = nir_intrinsic_image_deref_##N; break;
   3335    OP(ImageQuerySize,            size)
   3336    OP(ImageQuerySizeLod,         size)
   3337    OP(ImageRead,                 load)
   3338    OP(ImageSparseRead,           sparse_load)
   3339    OP(ImageWrite,                store)
   3340    OP(AtomicLoad,                load)
   3341    OP(AtomicStore,               store)
   3342    OP(AtomicExchange,            atomic_exchange)
   3343    OP(AtomicCompareExchange,     atomic_comp_swap)
   3344    OP(AtomicCompareExchangeWeak, atomic_comp_swap)
   3345    OP(AtomicIIncrement,          atomic_add)
   3346    OP(AtomicIDecrement,          atomic_add)
   3347    OP(AtomicIAdd,                atomic_add)
   3348    OP(AtomicISub,                atomic_add)
   3349    OP(AtomicSMin,                atomic_imin)
   3350    OP(AtomicUMin,                atomic_umin)
   3351    OP(AtomicSMax,                atomic_imax)
   3352    OP(AtomicUMax,                atomic_umax)
   3353    OP(AtomicAnd,                 atomic_and)
   3354    OP(AtomicOr,                  atomic_or)
   3355    OP(AtomicXor,                 atomic_xor)
   3356    OP(AtomicFAddEXT,             atomic_fadd)
   3357    OP(AtomicFMinEXT,             atomic_fmin)
   3358    OP(AtomicFMaxEXT,             atomic_fmax)
   3359    OP(ImageQueryFormat,          format)
   3360    OP(ImageQueryOrder,           order)
   3361    OP(ImageQuerySamples,         samples)
   3362 #undef OP
   3363    default:
   3364       vtn_fail_with_opcode("Invalid image opcode", opcode);
   3365    }
   3366 
   3367    nir_intrinsic_instr *intrin = nir_intrinsic_instr_create(b->shader, op);
   3368 
   3369    intrin->src[0] = nir_src_for_ssa(&image.image->dest.ssa);
   3370    nir_intrinsic_set_image_dim(intrin, glsl_get_sampler_dim(image.image->type));
   3371    nir_intrinsic_set_image_array(intrin,
   3372       glsl_sampler_type_is_array(image.image->type));
   3373 
   3374    switch (opcode) {
   3375    case SpvOpImageQuerySamples:
   3376    case SpvOpImageQuerySize:
   3377    case SpvOpImageQuerySizeLod:
   3378    case SpvOpImageQueryFormat:
   3379    case SpvOpImageQueryOrder:
   3380       break;
   3381    default:
   3382       /* The image coordinate is always 4 components but we may not have that
   3383        * many.  Swizzle to compensate.
   3384        */
   3385       intrin->src[1] = nir_src_for_ssa(nir_pad_vec4(&b->nb, image.coord));
   3386       intrin->src[2] = nir_src_for_ssa(image.sample);
   3387       break;
   3388    }
   3389 
   3390    /* The Vulkan spec says:
   3391     *
   3392     *    "If an instruction loads from or stores to a resource (including
   3393     *    atomics and image instructions) and the resource descriptor being
   3394     *    accessed is not dynamically uniform, then the operand corresponding
   3395     *    to that resource (e.g. the pointer or sampled image operand) must be
   3396     *    decorated with NonUniform."
   3397     *
   3398     * It's very careful to specify that the exact operand must be decorated
   3399     * NonUniform.  The SPIR-V parser is not expected to chase through long
   3400     * chains to find the NonUniform decoration.  It's either right there or we
   3401     * can assume it doesn't exist.
   3402     */
   3403    vtn_foreach_decoration(b, res_val, non_uniform_decoration_cb, &access);
   3404    nir_intrinsic_set_access(intrin, access);
   3405 
   3406    switch (opcode) {
   3407    case SpvOpImageQuerySamples:
   3408    case SpvOpImageQueryFormat:
   3409    case SpvOpImageQueryOrder:
   3410       /* No additional sources */
   3411       break;
   3412    case SpvOpImageQuerySize:
   3413       intrin->src[1] = nir_src_for_ssa(nir_imm_int(&b->nb, 0));
   3414       break;
   3415    case SpvOpImageQuerySizeLod:
   3416       intrin->src[1] = nir_src_for_ssa(image.lod);
   3417       break;
   3418    case SpvOpAtomicLoad:
   3419    case SpvOpImageRead:
   3420    case SpvOpImageSparseRead:
   3421       /* Only OpImageRead can support a lod parameter if
   3422       * SPV_AMD_shader_image_load_store_lod is used but the current NIR
   3423       * intrinsics definition for atomics requires us to set it for
   3424       * OpAtomicLoad.
   3425       */
   3426       intrin->src[3] = nir_src_for_ssa(image.lod);
   3427       break;
   3428    case SpvOpAtomicStore:
   3429    case SpvOpImageWrite: {
   3430       const uint32_t value_id = opcode == SpvOpAtomicStore ? w[4] : w[3];
   3431       struct vtn_ssa_value *value = vtn_ssa_value(b, value_id);
   3432       /* nir_intrinsic_image_deref_store always takes a vec4 value */
   3433       assert(op == nir_intrinsic_image_deref_store);
   3434       intrin->num_components = 4;
   3435       intrin->src[3] = nir_src_for_ssa(nir_pad_vec4(&b->nb, value->def));
   3436       /* Only OpImageWrite can support a lod parameter if
   3437        * SPV_AMD_shader_image_load_store_lod is used but the current NIR
   3438        * intrinsics definition for atomics requires us to set it for
   3439        * OpAtomicStore.
   3440        */
   3441       intrin->src[4] = nir_src_for_ssa(image.lod);
   3442 
   3443       if (opcode == SpvOpImageWrite) {
   3444          nir_alu_type src_type =
   3445             get_image_type(b, nir_get_nir_type_for_glsl_type(value->type), operands);
   3446          nir_intrinsic_set_src_type(intrin, src_type);
   3447       }
   3448       break;
   3449    }
   3450 
   3451    case SpvOpAtomicCompareExchange:
   3452    case SpvOpAtomicCompareExchangeWeak:
   3453    case SpvOpAtomicIIncrement:
   3454    case SpvOpAtomicIDecrement:
   3455    case SpvOpAtomicExchange:
   3456    case SpvOpAtomicIAdd:
   3457    case SpvOpAtomicISub:
   3458    case SpvOpAtomicSMin:
   3459    case SpvOpAtomicUMin:
   3460    case SpvOpAtomicSMax:
   3461    case SpvOpAtomicUMax:
   3462    case SpvOpAtomicAnd:
   3463    case SpvOpAtomicOr:
   3464    case SpvOpAtomicXor:
   3465    case SpvOpAtomicFAddEXT:
   3466    case SpvOpAtomicFMinEXT:
   3467    case SpvOpAtomicFMaxEXT:
   3468       fill_common_atomic_sources(b, opcode, w, &intrin->src[3]);
   3469       break;
   3470 
   3471    default:
   3472       vtn_fail_with_opcode("Invalid image opcode", opcode);
   3473    }
   3474 
   3475    /* Image operations implicitly have the Image storage memory semantics. */
   3476    semantics |= SpvMemorySemanticsImageMemoryMask;
   3477 
   3478    SpvMemorySemanticsMask before_semantics;
   3479    SpvMemorySemanticsMask after_semantics;
   3480    vtn_split_barrier_semantics(b, semantics, &before_semantics, &after_semantics);
   3481 
   3482    if (before_semantics)
   3483       vtn_emit_memory_barrier(b, scope, before_semantics);
   3484 
   3485    if (opcode != SpvOpImageWrite && opcode != SpvOpAtomicStore) {
   3486       struct vtn_type *type = vtn_get_type(b, w[1]);
   3487       struct vtn_type *struct_type = NULL;
   3488       if (opcode == SpvOpImageSparseRead) {
   3489          vtn_assert(glsl_type_is_struct_or_ifc(type->type));
   3490          struct_type = type;
   3491          type = struct_type->members[1];
   3492       }
   3493 
   3494       unsigned dest_components = glsl_get_vector_elements(type->type);
   3495       if (opcode == SpvOpImageSparseRead)
   3496          dest_components++;
   3497 
   3498       if (nir_intrinsic_infos[op].dest_components == 0)
   3499          intrin->num_components = dest_components;
   3500 
   3501       nir_ssa_dest_init(&intrin->instr, &intrin->dest,
   3502                         nir_intrinsic_dest_components(intrin),
   3503                         glsl_get_bit_size(type->type), NULL);
   3504 
   3505       nir_builder_instr_insert(&b->nb, &intrin->instr);
   3506 
   3507       nir_ssa_def *result = &intrin->dest.ssa;
   3508       if (nir_intrinsic_dest_components(intrin) != dest_components)
   3509          result = nir_channels(&b->nb, result, (1 << dest_components) - 1);
   3510 
   3511       if (opcode == SpvOpImageSparseRead) {
   3512          struct vtn_ssa_value *dest = vtn_create_ssa_value(b, struct_type->type);
   3513          unsigned res_type_size = glsl_get_vector_elements(type->type);
   3514          dest->elems[0]->def = nir_channel(&b->nb, result, res_type_size);
   3515          if (intrin->dest.ssa.bit_size != 32)
   3516             dest->elems[0]->def = nir_u2u32(&b->nb, dest->elems[0]->def);
   3517          dest->elems[1]->def = nir_channels(&b->nb, result,
   3518                                             (nir_component_mask_t)
   3519 					    BITFIELD_MASK(res_type_size));
   3520          vtn_push_ssa_value(b, w[2], dest);
   3521       } else {
   3522          vtn_push_nir_ssa(b, w[2], result);
   3523       }
   3524 
   3525       if (opcode == SpvOpImageRead || opcode == SpvOpImageSparseRead) {
   3526          nir_alu_type dest_type =
   3527             get_image_type(b, nir_get_nir_type_for_glsl_type(type->type), operands);
   3528          nir_intrinsic_set_dest_type(intrin, dest_type);
   3529       }
   3530    } else {
   3531       nir_builder_instr_insert(&b->nb, &intrin->instr);
   3532    }
   3533 
   3534    if (after_semantics)
   3535       vtn_emit_memory_barrier(b, scope, after_semantics);
   3536 }
   3537 
   3538 static nir_intrinsic_op
   3539 get_uniform_nir_atomic_op(struct vtn_builder *b, SpvOp opcode)
   3540 {
   3541    switch (opcode) {
   3542 #define OP(S, N) case SpvOp##S: return nir_intrinsic_atomic_counter_ ##N;
   3543    OP(AtomicLoad,                read_deref)
   3544    OP(AtomicExchange,            exchange)
   3545    OP(AtomicCompareExchange,     comp_swap)
   3546    OP(AtomicCompareExchangeWeak, comp_swap)
   3547    OP(AtomicIIncrement,          inc_deref)
   3548    OP(AtomicIDecrement,          post_dec_deref)
   3549    OP(AtomicIAdd,                add_deref)
   3550    OP(AtomicISub,                add_deref)
   3551    OP(AtomicUMin,                min_deref)
   3552    OP(AtomicUMax,                max_deref)
   3553    OP(AtomicAnd,                 and_deref)
   3554    OP(AtomicOr,                  or_deref)
   3555    OP(AtomicXor,                 xor_deref)
   3556 #undef OP
   3557    default:
   3558       /* We left the following out: AtomicStore, AtomicSMin and
   3559        * AtomicSmax. Right now there are not nir intrinsics for them. At this
   3560        * moment Atomic Counter support is needed for ARB_spirv support, so is
   3561        * only need to support GLSL Atomic Counters that are uints and don't
   3562        * allow direct storage.
   3563        */
   3564       vtn_fail("Invalid uniform atomic");
   3565    }
   3566 }
   3567 
   3568 static nir_intrinsic_op
   3569 get_deref_nir_atomic_op(struct vtn_builder *b, SpvOp opcode)
   3570 {
   3571    switch (opcode) {
   3572    case SpvOpAtomicLoad:         return nir_intrinsic_load_deref;
   3573    case SpvOpAtomicFlagClear:
   3574    case SpvOpAtomicStore:        return nir_intrinsic_store_deref;
   3575 #define OP(S, N) case SpvOp##S: return nir_intrinsic_deref_##N;
   3576    OP(AtomicExchange,            atomic_exchange)
   3577    OP(AtomicCompareExchange,     atomic_comp_swap)
   3578    OP(AtomicCompareExchangeWeak, atomic_comp_swap)
   3579    OP(AtomicIIncrement,          atomic_add)
   3580    OP(AtomicIDecrement,          atomic_add)
   3581    OP(AtomicIAdd,                atomic_add)
   3582    OP(AtomicISub,                atomic_add)
   3583    OP(AtomicSMin,                atomic_imin)
   3584    OP(AtomicUMin,                atomic_umin)
   3585    OP(AtomicSMax,                atomic_imax)
   3586    OP(AtomicUMax,                atomic_umax)
   3587    OP(AtomicAnd,                 atomic_and)
   3588    OP(AtomicOr,                  atomic_or)
   3589    OP(AtomicXor,                 atomic_xor)
   3590    OP(AtomicFAddEXT,             atomic_fadd)
   3591    OP(AtomicFMinEXT,             atomic_fmin)
   3592    OP(AtomicFMaxEXT,             atomic_fmax)
   3593    OP(AtomicFlagTestAndSet,      atomic_comp_swap)
   3594 #undef OP
   3595    default:
   3596       vtn_fail_with_opcode("Invalid shared atomic", opcode);
   3597    }
   3598 }
   3599 
   3600 /*
   3601  * Handles shared atomics, ssbo atomics and atomic counters.
   3602  */
   3603 static void
   3604 vtn_handle_atomics(struct vtn_builder *b, SpvOp opcode,
   3605                    const uint32_t *w, UNUSED unsigned count)
   3606 {
   3607    struct vtn_pointer *ptr;
   3608    nir_intrinsic_instr *atomic;
   3609 
   3610    SpvScope scope = SpvScopeInvocation;
   3611    SpvMemorySemanticsMask semantics = 0;
   3612    enum gl_access_qualifier access = 0;
   3613 
   3614    switch (opcode) {
   3615    case SpvOpAtomicLoad:
   3616    case SpvOpAtomicExchange:
   3617    case SpvOpAtomicCompareExchange:
   3618    case SpvOpAtomicCompareExchangeWeak:
   3619    case SpvOpAtomicIIncrement:
   3620    case SpvOpAtomicIDecrement:
   3621    case SpvOpAtomicIAdd:
   3622    case SpvOpAtomicISub:
   3623    case SpvOpAtomicSMin:
   3624    case SpvOpAtomicUMin:
   3625    case SpvOpAtomicSMax:
   3626    case SpvOpAtomicUMax:
   3627    case SpvOpAtomicAnd:
   3628    case SpvOpAtomicOr:
   3629    case SpvOpAtomicXor:
   3630    case SpvOpAtomicFAddEXT:
   3631    case SpvOpAtomicFMinEXT:
   3632    case SpvOpAtomicFMaxEXT:
   3633    case SpvOpAtomicFlagTestAndSet:
   3634       ptr = vtn_pointer(b, w[3]);
   3635       scope = vtn_constant_uint(b, w[4]);
   3636       semantics = vtn_constant_uint(b, w[5]);
   3637       break;
   3638    case SpvOpAtomicFlagClear:
   3639    case SpvOpAtomicStore:
   3640       ptr = vtn_pointer(b, w[1]);
   3641       scope = vtn_constant_uint(b, w[2]);
   3642       semantics = vtn_constant_uint(b, w[3]);
   3643       break;
   3644 
   3645    default:
   3646       vtn_fail_with_opcode("Invalid SPIR-V atomic", opcode);
   3647    }
   3648 
   3649    if (semantics & SpvMemorySemanticsVolatileMask)
   3650       access |= ACCESS_VOLATILE;
   3651 
   3652    /* uniform as "atomic counter uniform" */
   3653    if (ptr->mode == vtn_variable_mode_atomic_counter) {
   3654       nir_deref_instr *deref = vtn_pointer_to_deref(b, ptr);
   3655       nir_intrinsic_op op = get_uniform_nir_atomic_op(b, opcode);
   3656       atomic = nir_intrinsic_instr_create(b->nb.shader, op);
   3657       atomic->src[0] = nir_src_for_ssa(&deref->dest.ssa);
   3658 
   3659       /* SSBO needs to initialize index/offset. In this case we don't need to,
   3660        * as that info is already stored on the ptr->var->var nir_variable (see
   3661        * vtn_create_variable)
   3662        */
   3663 
   3664       switch (opcode) {
   3665       case SpvOpAtomicLoad:
   3666       case SpvOpAtomicExchange:
   3667       case SpvOpAtomicCompareExchange:
   3668       case SpvOpAtomicCompareExchangeWeak:
   3669       case SpvOpAtomicIIncrement:
   3670       case SpvOpAtomicIDecrement:
   3671       case SpvOpAtomicIAdd:
   3672       case SpvOpAtomicISub:
   3673       case SpvOpAtomicSMin:
   3674       case SpvOpAtomicUMin:
   3675       case SpvOpAtomicSMax:
   3676       case SpvOpAtomicUMax:
   3677       case SpvOpAtomicAnd:
   3678       case SpvOpAtomicOr:
   3679       case SpvOpAtomicXor:
   3680          /* Nothing: we don't need to call fill_common_atomic_sources here, as
   3681           * atomic counter uniforms doesn't have sources
   3682           */
   3683          break;
   3684 
   3685       default:
   3686          unreachable("Invalid SPIR-V atomic");
   3687 
   3688       }
   3689    } else {
   3690       nir_deref_instr *deref = vtn_pointer_to_deref(b, ptr);
   3691       const struct glsl_type *deref_type = deref->type;
   3692       nir_intrinsic_op op = get_deref_nir_atomic_op(b, opcode);
   3693       atomic = nir_intrinsic_instr_create(b->nb.shader, op);
   3694       atomic->src[0] = nir_src_for_ssa(&deref->dest.ssa);
   3695 
   3696       if (ptr->mode != vtn_variable_mode_workgroup)
   3697          access |= ACCESS_COHERENT;
   3698 
   3699       nir_intrinsic_set_access(atomic, access);
   3700 
   3701       switch (opcode) {
   3702       case SpvOpAtomicLoad:
   3703          atomic->num_components = glsl_get_vector_elements(deref_type);
   3704          break;
   3705 
   3706       case SpvOpAtomicStore:
   3707          atomic->num_components = glsl_get_vector_elements(deref_type);
   3708          nir_intrinsic_set_write_mask(atomic, (1 << atomic->num_components) - 1);
   3709          atomic->src[1] = nir_src_for_ssa(vtn_get_nir_ssa(b, w[4]));
   3710          break;
   3711 
   3712       case SpvOpAtomicFlagClear:
   3713          atomic->num_components = 1;
   3714          nir_intrinsic_set_write_mask(atomic, 1);
   3715          atomic->src[1] = nir_src_for_ssa(nir_imm_intN_t(&b->nb, 0, 32));
   3716          break;
   3717       case SpvOpAtomicFlagTestAndSet:
   3718          atomic->src[1] = nir_src_for_ssa(nir_imm_intN_t(&b->nb, 0, 32));
   3719          atomic->src[2] = nir_src_for_ssa(nir_imm_intN_t(&b->nb, -1, 32));
   3720          break;
   3721       case SpvOpAtomicExchange:
   3722       case SpvOpAtomicCompareExchange:
   3723       case SpvOpAtomicCompareExchangeWeak:
   3724       case SpvOpAtomicIIncrement:
   3725       case SpvOpAtomicIDecrement:
   3726       case SpvOpAtomicIAdd:
   3727       case SpvOpAtomicISub:
   3728       case SpvOpAtomicSMin:
   3729       case SpvOpAtomicUMin:
   3730       case SpvOpAtomicSMax:
   3731       case SpvOpAtomicUMax:
   3732       case SpvOpAtomicAnd:
   3733       case SpvOpAtomicOr:
   3734       case SpvOpAtomicXor:
   3735       case SpvOpAtomicFAddEXT:
   3736       case SpvOpAtomicFMinEXT:
   3737       case SpvOpAtomicFMaxEXT:
   3738          fill_common_atomic_sources(b, opcode, w, &atomic->src[1]);
   3739          break;
   3740 
   3741       default:
   3742          vtn_fail_with_opcode("Invalid SPIR-V atomic", opcode);
   3743       }
   3744    }
   3745 
   3746    /* Atomic ordering operations will implicitly apply to the atomic operation
   3747     * storage class, so include that too.
   3748     */
   3749    semantics |= vtn_mode_to_memory_semantics(ptr->mode);
   3750 
   3751    SpvMemorySemanticsMask before_semantics;
   3752    SpvMemorySemanticsMask after_semantics;
   3753    vtn_split_barrier_semantics(b, semantics, &before_semantics, &after_semantics);
   3754 
   3755    if (before_semantics)
   3756       vtn_emit_memory_barrier(b, scope, before_semantics);
   3757 
   3758    if (opcode != SpvOpAtomicStore && opcode != SpvOpAtomicFlagClear) {
   3759       struct vtn_type *type = vtn_get_type(b, w[1]);
   3760 
   3761       if (opcode == SpvOpAtomicFlagTestAndSet) {
   3762          /* map atomic flag to a 32-bit atomic integer. */
   3763          nir_ssa_dest_init(&atomic->instr, &atomic->dest,
   3764                            1, 32, NULL);
   3765       } else {
   3766          nir_ssa_dest_init(&atomic->instr, &atomic->dest,
   3767                            glsl_get_vector_elements(type->type),
   3768                            glsl_get_bit_size(type->type), NULL);
   3769 
   3770          vtn_push_nir_ssa(b, w[2], &atomic->dest.ssa);
   3771       }
   3772    }
   3773 
   3774    nir_builder_instr_insert(&b->nb, &atomic->instr);
   3775 
   3776    if (opcode == SpvOpAtomicFlagTestAndSet) {
   3777       vtn_push_nir_ssa(b, w[2], nir_i2b1(&b->nb, &atomic->dest.ssa));
   3778    }
   3779    if (after_semantics)
   3780       vtn_emit_memory_barrier(b, scope, after_semantics);
   3781 }
   3782 
   3783 static nir_alu_instr *
   3784 create_vec(struct vtn_builder *b, unsigned num_components, unsigned bit_size)
   3785 {
   3786    nir_op op = nir_op_vec(num_components);
   3787    nir_alu_instr *vec = nir_alu_instr_create(b->shader, op);
   3788    nir_ssa_dest_init(&vec->instr, &vec->dest.dest, num_components,
   3789                      bit_size, NULL);
   3790    vec->dest.write_mask = (1 << num_components) - 1;
   3791 
   3792    return vec;
   3793 }
   3794 
   3795 struct vtn_ssa_value *
   3796 vtn_ssa_transpose(struct vtn_builder *b, struct vtn_ssa_value *src)
   3797 {
   3798    if (src->transposed)
   3799       return src->transposed;
   3800 
   3801    struct vtn_ssa_value *dest =
   3802       vtn_create_ssa_value(b, glsl_transposed_type(src->type));
   3803 
   3804    for (unsigned i = 0; i < glsl_get_matrix_columns(dest->type); i++) {
   3805       nir_alu_instr *vec = create_vec(b, glsl_get_matrix_columns(src->type),
   3806                                          glsl_get_bit_size(src->type));
   3807       if (glsl_type_is_vector_or_scalar(src->type)) {
   3808           vec->src[0].src = nir_src_for_ssa(src->def);
   3809           vec->src[0].swizzle[0] = i;
   3810       } else {
   3811          for (unsigned j = 0; j < glsl_get_matrix_columns(src->type); j++) {
   3812             vec->src[j].src = nir_src_for_ssa(src->elems[j]->def);
   3813             vec->src[j].swizzle[0] = i;
   3814          }
   3815       }
   3816       nir_builder_instr_insert(&b->nb, &vec->instr);
   3817       dest->elems[i]->def = &vec->dest.dest.ssa;
   3818    }
   3819 
   3820    dest->transposed = src;
   3821 
   3822    return dest;
   3823 }
   3824 
   3825 static nir_ssa_def *
   3826 vtn_vector_shuffle(struct vtn_builder *b, unsigned num_components,
   3827                    nir_ssa_def *src0, nir_ssa_def *src1,
   3828                    const uint32_t *indices)
   3829 {
   3830    nir_alu_instr *vec = create_vec(b, num_components, src0->bit_size);
   3831 
   3832    for (unsigned i = 0; i < num_components; i++) {
   3833       uint32_t index = indices[i];
   3834       if (index == 0xffffffff) {
   3835          vec->src[i].src =
   3836             nir_src_for_ssa(nir_ssa_undef(&b->nb, 1, src0->bit_size));
   3837       } else if (index < src0->num_components) {
   3838          vec->src[i].src = nir_src_for_ssa(src0);
   3839          vec->src[i].swizzle[0] = index;
   3840       } else {
   3841          vec->src[i].src = nir_src_for_ssa(src1);
   3842          vec->src[i].swizzle[0] = index - src0->num_components;
   3843       }
   3844    }
   3845 
   3846    nir_builder_instr_insert(&b->nb, &vec->instr);
   3847 
   3848    return &vec->dest.dest.ssa;
   3849 }
   3850 
   3851 /*
   3852  * Concatentates a number of vectors/scalars together to produce a vector
   3853  */
   3854 static nir_ssa_def *
   3855 vtn_vector_construct(struct vtn_builder *b, unsigned num_components,
   3856                      unsigned num_srcs, nir_ssa_def **srcs)
   3857 {
   3858    nir_alu_instr *vec = create_vec(b, num_components, srcs[0]->bit_size);
   3859 
   3860    /* From the SPIR-V 1.1 spec for OpCompositeConstruct:
   3861     *
   3862     *    "When constructing a vector, there must be at least two Constituent
   3863     *    operands."
   3864     */
   3865    vtn_assert(num_srcs >= 2);
   3866 
   3867    unsigned dest_idx = 0;
   3868    for (unsigned i = 0; i < num_srcs; i++) {
   3869       nir_ssa_def *src = srcs[i];
   3870       vtn_assert(dest_idx + src->num_components <= num_components);
   3871       for (unsigned j = 0; j < src->num_components; j++) {
   3872          vec->src[dest_idx].src = nir_src_for_ssa(src);
   3873          vec->src[dest_idx].swizzle[0] = j;
   3874          dest_idx++;
   3875       }
   3876    }
   3877 
   3878    /* From the SPIR-V 1.1 spec for OpCompositeConstruct:
   3879     *
   3880     *    "When constructing a vector, the total number of components in all
   3881     *    the operands must equal the number of components in Result Type."
   3882     */
   3883    vtn_assert(dest_idx == num_components);
   3884 
   3885    nir_builder_instr_insert(&b->nb, &vec->instr);
   3886 
   3887    return &vec->dest.dest.ssa;
   3888 }
   3889 
   3890 static struct vtn_ssa_value *
   3891 vtn_composite_copy(void *mem_ctx, struct vtn_ssa_value *src)
   3892 {
   3893    struct vtn_ssa_value *dest = rzalloc(mem_ctx, struct vtn_ssa_value);
   3894    dest->type = src->type;
   3895 
   3896    if (glsl_type_is_vector_or_scalar(src->type)) {
   3897       dest->def = src->def;
   3898    } else {
   3899       unsigned elems = glsl_get_length(src->type);
   3900 
   3901       dest->elems = ralloc_array(mem_ctx, struct vtn_ssa_value *, elems);
   3902       for (unsigned i = 0; i < elems; i++)
   3903          dest->elems[i] = vtn_composite_copy(mem_ctx, src->elems[i]);
   3904    }
   3905 
   3906    return dest;
   3907 }
   3908 
   3909 static struct vtn_ssa_value *
   3910 vtn_composite_insert(struct vtn_builder *b, struct vtn_ssa_value *src,
   3911                      struct vtn_ssa_value *insert, const uint32_t *indices,
   3912                      unsigned num_indices)
   3913 {
   3914    struct vtn_ssa_value *dest = vtn_composite_copy(b, src);
   3915 
   3916    struct vtn_ssa_value *cur = dest;
   3917    unsigned i;
   3918    for (i = 0; i < num_indices - 1; i++) {
   3919       /* If we got a vector here, that means the next index will be trying to
   3920        * dereference a scalar.
   3921        */
   3922       vtn_fail_if(glsl_type_is_vector_or_scalar(cur->type),
   3923                   "OpCompositeInsert has too many indices.");
   3924       vtn_fail_if(indices[i] >= glsl_get_length(cur->type),
   3925                   "All indices in an OpCompositeInsert must be in-bounds");
   3926       cur = cur->elems[indices[i]];
   3927    }
   3928 
   3929    if (glsl_type_is_vector_or_scalar(cur->type)) {
   3930       vtn_fail_if(indices[i] >= glsl_get_vector_elements(cur->type),
   3931                   "All indices in an OpCompositeInsert must be in-bounds");
   3932 
   3933       /* According to the SPIR-V spec, OpCompositeInsert may work down to
   3934        * the component granularity. In that case, the last index will be
   3935        * the index to insert the scalar into the vector.
   3936        */
   3937 
   3938       cur->def = nir_vector_insert_imm(&b->nb, cur->def, insert->def, indices[i]);
   3939    } else {
   3940       vtn_fail_if(indices[i] >= glsl_get_length(cur->type),
   3941                   "All indices in an OpCompositeInsert must be in-bounds");
   3942       cur->elems[indices[i]] = insert;
   3943    }
   3944 
   3945    return dest;
   3946 }
   3947 
   3948 static struct vtn_ssa_value *
   3949 vtn_composite_extract(struct vtn_builder *b, struct vtn_ssa_value *src,
   3950                       const uint32_t *indices, unsigned num_indices)
   3951 {
   3952    struct vtn_ssa_value *cur = src;
   3953    for (unsigned i = 0; i < num_indices; i++) {
   3954       if (glsl_type_is_vector_or_scalar(cur->type)) {
   3955          vtn_assert(i == num_indices - 1);
   3956          vtn_fail_if(indices[i] >= glsl_get_vector_elements(cur->type),
   3957                      "All indices in an OpCompositeExtract must be in-bounds");
   3958 
   3959          /* According to the SPIR-V spec, OpCompositeExtract may work down to
   3960           * the component granularity. The last index will be the index of the
   3961           * vector to extract.
   3962           */
   3963 
   3964          const struct glsl_type *scalar_type =
   3965             glsl_scalar_type(glsl_get_base_type(cur->type));
   3966          struct vtn_ssa_value *ret = vtn_create_ssa_value(b, scalar_type);
   3967          ret->def = nir_channel(&b->nb, cur->def, indices[i]);
   3968          return ret;
   3969       } else {
   3970          vtn_fail_if(indices[i] >= glsl_get_length(cur->type),
   3971                      "All indices in an OpCompositeExtract must be in-bounds");
   3972          cur = cur->elems[indices[i]];
   3973       }
   3974    }
   3975 
   3976    return cur;
   3977 }
   3978 
   3979 static void
   3980 vtn_handle_composite(struct vtn_builder *b, SpvOp opcode,
   3981                      const uint32_t *w, unsigned count)
   3982 {
   3983    struct vtn_type *type = vtn_get_type(b, w[1]);
   3984    struct vtn_ssa_value *ssa = vtn_create_ssa_value(b, type->type);
   3985 
   3986    switch (opcode) {
   3987    case SpvOpVectorExtractDynamic:
   3988       ssa->def = nir_vector_extract(&b->nb, vtn_get_nir_ssa(b, w[3]),
   3989                                     vtn_get_nir_ssa(b, w[4]));
   3990       break;
   3991 
   3992    case SpvOpVectorInsertDynamic:
   3993       ssa->def = nir_vector_insert(&b->nb, vtn_get_nir_ssa(b, w[3]),
   3994                                    vtn_get_nir_ssa(b, w[4]),
   3995                                    vtn_get_nir_ssa(b, w[5]));
   3996       break;
   3997 
   3998    case SpvOpVectorShuffle:
   3999       ssa->def = vtn_vector_shuffle(b, glsl_get_vector_elements(type->type),
   4000                                     vtn_get_nir_ssa(b, w[3]),
   4001                                     vtn_get_nir_ssa(b, w[4]),
   4002                                     w + 5);
   4003       break;
   4004 
   4005    case SpvOpCompositeConstruct: {
   4006       unsigned elems = count - 3;
   4007       assume(elems >= 1);
   4008       if (glsl_type_is_vector_or_scalar(type->type)) {
   4009          nir_ssa_def *srcs[NIR_MAX_VEC_COMPONENTS];
   4010          for (unsigned i = 0; i < elems; i++)
   4011             srcs[i] = vtn_get_nir_ssa(b, w[3 + i]);
   4012          ssa->def =
   4013             vtn_vector_construct(b, glsl_get_vector_elements(type->type),
   4014                                  elems, srcs);
   4015       } else {
   4016          ssa->elems = ralloc_array(b, struct vtn_ssa_value *, elems);
   4017          for (unsigned i = 0; i < elems; i++)
   4018             ssa->elems[i] = vtn_ssa_value(b, w[3 + i]);
   4019       }
   4020       break;
   4021    }
   4022    case SpvOpCompositeExtract:
   4023       ssa = vtn_composite_extract(b, vtn_ssa_value(b, w[3]),
   4024                                   w + 4, count - 4);
   4025       break;
   4026 
   4027    case SpvOpCompositeInsert:
   4028       ssa = vtn_composite_insert(b, vtn_ssa_value(b, w[4]),
   4029                                  vtn_ssa_value(b, w[3]),
   4030                                  w + 5, count - 5);
   4031       break;
   4032 
   4033    case SpvOpCopyLogical:
   4034       ssa = vtn_composite_copy(b, vtn_ssa_value(b, w[3]));
   4035       break;
   4036    case SpvOpCopyObject:
   4037       vtn_copy_value(b, w[3], w[2]);
   4038       return;
   4039 
   4040    default:
   4041       vtn_fail_with_opcode("unknown composite operation", opcode);
   4042    }
   4043 
   4044    vtn_push_ssa_value(b, w[2], ssa);
   4045 }
   4046 
   4047 void
   4048 vtn_emit_memory_barrier(struct vtn_builder *b, SpvScope scope,
   4049                         SpvMemorySemanticsMask semantics)
   4050 {
   4051    if (b->shader->options->use_scoped_barrier) {
   4052       vtn_emit_scoped_memory_barrier(b, scope, semantics);
   4053       return;
   4054    }
   4055 
   4056    static const SpvMemorySemanticsMask all_memory_semantics =
   4057       SpvMemorySemanticsUniformMemoryMask |
   4058       SpvMemorySemanticsWorkgroupMemoryMask |
   4059       SpvMemorySemanticsAtomicCounterMemoryMask |
   4060       SpvMemorySemanticsImageMemoryMask |
   4061       SpvMemorySemanticsOutputMemoryMask;
   4062 
   4063    /* If we're not actually doing a memory barrier, bail */
   4064    if (!(semantics & all_memory_semantics))
   4065       return;
   4066 
   4067    /* GL and Vulkan don't have these */
   4068    vtn_assert(scope != SpvScopeCrossDevice);
   4069 
   4070    if (scope == SpvScopeSubgroup)
   4071       return; /* Nothing to do here */
   4072 
   4073    if (scope == SpvScopeWorkgroup) {
   4074       nir_group_memory_barrier(&b->nb);
   4075       return;
   4076    }
   4077 
   4078    /* There's only two scopes thing left */
   4079    vtn_assert(scope == SpvScopeInvocation || scope == SpvScopeDevice);
   4080 
   4081    /* Map the GLSL memoryBarrier() construct and any barriers with more than one
   4082     * semantic to the corresponding NIR one.
   4083     */
   4084    if (util_bitcount(semantics & all_memory_semantics) > 1) {
   4085       nir_memory_barrier(&b->nb);
   4086       if (semantics & SpvMemorySemanticsOutputMemoryMask) {
   4087          /* GLSL memoryBarrier() (and the corresponding NIR one) doesn't include
   4088           * TCS outputs, so we have to emit it's own intrinsic for that. We
   4089           * then need to emit another memory_barrier to prevent moving
   4090           * non-output operations to before the tcs_patch barrier.
   4091           */
   4092          nir_memory_barrier_tcs_patch(&b->nb);
   4093          nir_memory_barrier(&b->nb);
   4094       }
   4095       return;
   4096    }
   4097 
   4098    /* Issue a more specific barrier */
   4099    switch (semantics & all_memory_semantics) {
   4100    case SpvMemorySemanticsUniformMemoryMask:
   4101       nir_memory_barrier_buffer(&b->nb);
   4102       break;
   4103    case SpvMemorySemanticsWorkgroupMemoryMask:
   4104       nir_memory_barrier_shared(&b->nb);
   4105       break;
   4106    case SpvMemorySemanticsAtomicCounterMemoryMask:
   4107       nir_memory_barrier_atomic_counter(&b->nb);
   4108       break;
   4109    case SpvMemorySemanticsImageMemoryMask:
   4110       nir_memory_barrier_image(&b->nb);
   4111       break;
   4112    case SpvMemorySemanticsOutputMemoryMask:
   4113       if (b->nb.shader->info.stage == MESA_SHADER_TESS_CTRL)
   4114          nir_memory_barrier_tcs_patch(&b->nb);
   4115       break;
   4116    default:
   4117       break;
   4118    }
   4119 }
   4120 
   4121 static void
   4122 vtn_handle_barrier(struct vtn_builder *b, SpvOp opcode,
   4123                    const uint32_t *w, UNUSED unsigned count)
   4124 {
   4125    switch (opcode) {
   4126    case SpvOpEmitVertex:
   4127    case SpvOpEmitStreamVertex:
   4128    case SpvOpEndPrimitive:
   4129    case SpvOpEndStreamPrimitive: {
   4130       unsigned stream = 0;
   4131       if (opcode == SpvOpEmitStreamVertex || opcode == SpvOpEndStreamPrimitive)
   4132          stream = vtn_constant_uint(b, w[1]);
   4133 
   4134       switch (opcode) {
   4135       case SpvOpEmitStreamVertex:
   4136       case SpvOpEmitVertex:
   4137          nir_emit_vertex(&b->nb, stream);
   4138          break;
   4139       case SpvOpEndPrimitive:
   4140       case SpvOpEndStreamPrimitive:
   4141          nir_end_primitive(&b->nb, stream);
   4142          break;
   4143       default:
   4144          unreachable("Invalid opcode");
   4145       }
   4146       break;
   4147    }
   4148 
   4149    case SpvOpMemoryBarrier: {
   4150       SpvScope scope = vtn_constant_uint(b, w[1]);
   4151       SpvMemorySemanticsMask semantics = vtn_constant_uint(b, w[2]);
   4152       vtn_emit_memory_barrier(b, scope, semantics);
   4153       return;
   4154    }
   4155 
   4156    case SpvOpControlBarrier: {
   4157       SpvScope execution_scope = vtn_constant_uint(b, w[1]);
   4158       SpvScope memory_scope = vtn_constant_uint(b, w[2]);
   4159       SpvMemorySemanticsMask memory_semantics = vtn_constant_uint(b, w[3]);
   4160 
   4161       /* GLSLang, prior to commit 8297936dd6eb3, emitted OpControlBarrier with
   4162        * memory semantics of None for GLSL barrier().
   4163        * And before that, prior to c3f1cdfa, emitted the OpControlBarrier with
   4164        * Device instead of Workgroup for execution scope.
   4165        */
   4166       if (b->wa_glslang_cs_barrier &&
   4167           b->nb.shader->info.stage == MESA_SHADER_COMPUTE &&
   4168           (execution_scope == SpvScopeWorkgroup ||
   4169            execution_scope == SpvScopeDevice) &&
   4170           memory_semantics == SpvMemorySemanticsMaskNone) {
   4171          execution_scope = SpvScopeWorkgroup;
   4172          memory_scope = SpvScopeWorkgroup;
   4173          memory_semantics = SpvMemorySemanticsAcquireReleaseMask |
   4174                             SpvMemorySemanticsWorkgroupMemoryMask;
   4175       }
   4176 
   4177       /* From the SPIR-V spec:
   4178        *
   4179        *    "When used with the TessellationControl execution model, it also
   4180        *    implicitly synchronizes the Output Storage Class: Writes to Output
   4181        *    variables performed by any invocation executed prior to a
   4182        *    OpControlBarrier will be visible to any other invocation after
   4183        *    return from that OpControlBarrier."
   4184        *
   4185        * The same applies to VK_NV_mesh_shader.
   4186        */
   4187       if (b->nb.shader->info.stage == MESA_SHADER_TESS_CTRL ||
   4188           b->nb.shader->info.stage == MESA_SHADER_TASK ||
   4189           b->nb.shader->info.stage == MESA_SHADER_MESH) {
   4190          memory_semantics &= ~(SpvMemorySemanticsAcquireMask |
   4191                                SpvMemorySemanticsReleaseMask |
   4192                                SpvMemorySemanticsAcquireReleaseMask |
   4193                                SpvMemorySemanticsSequentiallyConsistentMask);
   4194          memory_semantics |= SpvMemorySemanticsAcquireReleaseMask |
   4195                              SpvMemorySemanticsOutputMemoryMask;
   4196       }
   4197 
   4198       if (b->shader->options->use_scoped_barrier) {
   4199          vtn_emit_scoped_control_barrier(b, execution_scope, memory_scope,
   4200                                          memory_semantics);
   4201       } else {
   4202          vtn_emit_memory_barrier(b, memory_scope, memory_semantics);
   4203 
   4204          if (execution_scope == SpvScopeWorkgroup)
   4205             nir_control_barrier(&b->nb);
   4206       }
   4207       break;
   4208    }
   4209 
   4210    default:
   4211       unreachable("unknown barrier instruction");
   4212    }
   4213 }
   4214 
   4215 static unsigned
   4216 gl_primitive_from_spv_execution_mode(struct vtn_builder *b,
   4217                                      SpvExecutionMode mode)
   4218 {
   4219    switch (mode) {
   4220    case SpvExecutionModeInputPoints:
   4221    case SpvExecutionModeOutputPoints:
   4222       return 0; /* GL_POINTS */
   4223    case SpvExecutionModeInputLines:
   4224    case SpvExecutionModeOutputLinesNV:
   4225       return 1; /* GL_LINES */
   4226    case SpvExecutionModeInputLinesAdjacency:
   4227       return 0x000A; /* GL_LINE_STRIP_ADJACENCY_ARB */
   4228    case SpvExecutionModeTriangles:
   4229    case SpvExecutionModeOutputTrianglesNV:
   4230       return 4; /* GL_TRIANGLES */
   4231    case SpvExecutionModeInputTrianglesAdjacency:
   4232       return 0x000C; /* GL_TRIANGLES_ADJACENCY_ARB */
   4233    case SpvExecutionModeQuads:
   4234       return 7; /* GL_QUADS */
   4235    case SpvExecutionModeIsolines:
   4236       return 0x8E7A; /* GL_ISOLINES */
   4237    case SpvExecutionModeOutputLineStrip:
   4238       return 3; /* GL_LINE_STRIP */
   4239    case SpvExecutionModeOutputTriangleStrip:
   4240       return 5; /* GL_TRIANGLE_STRIP */
   4241    default:
   4242       vtn_fail("Invalid primitive type: %s (%u)",
   4243                spirv_executionmode_to_string(mode), mode);
   4244    }
   4245 }
   4246 
   4247 static unsigned
   4248 vertices_in_from_spv_execution_mode(struct vtn_builder *b,
   4249                                     SpvExecutionMode mode)
   4250 {
   4251    switch (mode) {
   4252    case SpvExecutionModeInputPoints:
   4253       return 1;
   4254    case SpvExecutionModeInputLines:
   4255       return 2;
   4256    case SpvExecutionModeInputLinesAdjacency:
   4257       return 4;
   4258    case SpvExecutionModeTriangles:
   4259       return 3;
   4260    case SpvExecutionModeInputTrianglesAdjacency:
   4261       return 6;
   4262    default:
   4263       vtn_fail("Invalid GS input mode: %s (%u)",
   4264                spirv_executionmode_to_string(mode), mode);
   4265    }
   4266 }
   4267 
   4268 static gl_shader_stage
   4269 stage_for_execution_model(struct vtn_builder *b, SpvExecutionModel model)
   4270 {
   4271    switch (model) {
   4272    case SpvExecutionModelVertex:
   4273       return MESA_SHADER_VERTEX;
   4274    case SpvExecutionModelTessellationControl:
   4275       return MESA_SHADER_TESS_CTRL;
   4276    case SpvExecutionModelTessellationEvaluation:
   4277       return MESA_SHADER_TESS_EVAL;
   4278    case SpvExecutionModelGeometry:
   4279       return MESA_SHADER_GEOMETRY;
   4280    case SpvExecutionModelFragment:
   4281       return MESA_SHADER_FRAGMENT;
   4282    case SpvExecutionModelGLCompute:
   4283       return MESA_SHADER_COMPUTE;
   4284    case SpvExecutionModelKernel:
   4285       return MESA_SHADER_KERNEL;
   4286    case SpvExecutionModelRayGenerationKHR:
   4287       return MESA_SHADER_RAYGEN;
   4288    case SpvExecutionModelAnyHitKHR:
   4289       return MESA_SHADER_ANY_HIT;
   4290    case SpvExecutionModelClosestHitKHR:
   4291       return MESA_SHADER_CLOSEST_HIT;
   4292    case SpvExecutionModelMissKHR:
   4293       return MESA_SHADER_MISS;
   4294    case SpvExecutionModelIntersectionKHR:
   4295       return MESA_SHADER_INTERSECTION;
   4296    case SpvExecutionModelCallableKHR:
   4297        return MESA_SHADER_CALLABLE;
   4298    case SpvExecutionModelTaskNV:
   4299       return MESA_SHADER_TASK;
   4300    case SpvExecutionModelMeshNV:
   4301       return MESA_SHADER_MESH;
   4302    default:
   4303       vtn_fail("Unsupported execution model: %s (%u)",
   4304                spirv_executionmodel_to_string(model), model);
   4305    }
   4306 }
   4307 
   4308 #define spv_check_supported(name, cap) do {                 \
   4309       if (!(b->options && b->options->caps.name))           \
   4310          vtn_warn("Unsupported SPIR-V capability: %s (%u)", \
   4311                   spirv_capability_to_string(cap), cap);    \
   4312    } while(0)
   4313 
   4314 
   4315 void
   4316 vtn_handle_entry_point(struct vtn_builder *b, const uint32_t *w,
   4317                        unsigned count)
   4318 {
   4319    struct vtn_value *entry_point = &b->values[w[2]];
   4320    /* Let this be a name label regardless */
   4321    unsigned name_words;
   4322    entry_point->name = vtn_string_literal(b, &w[3], count - 3, &name_words);
   4323 
   4324    if (strcmp(entry_point->name, b->entry_point_name) != 0 ||
   4325        stage_for_execution_model(b, w[1]) != b->entry_point_stage)
   4326       return;
   4327 
   4328    vtn_assert(b->entry_point == NULL);
   4329    b->entry_point = entry_point;
   4330 
   4331    /* Entry points enumerate which global variables are used. */
   4332    size_t start = 3 + name_words;
   4333    b->interface_ids_count = count - start;
   4334    b->interface_ids = ralloc_array(b, uint32_t, b->interface_ids_count);
   4335    memcpy(b->interface_ids, &w[start], b->interface_ids_count * 4);
   4336    qsort(b->interface_ids, b->interface_ids_count, 4, cmp_uint32_t);
   4337 }
   4338 
   4339 static bool
   4340 vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
   4341                                 const uint32_t *w, unsigned count)
   4342 {
   4343    switch (opcode) {
   4344    case SpvOpSource: {
   4345       const char *lang;
   4346       switch (w[1]) {
   4347       default:
   4348       case SpvSourceLanguageUnknown:      lang = "unknown";    break;
   4349       case SpvSourceLanguageESSL:         lang = "ESSL";       break;
   4350       case SpvSourceLanguageGLSL:         lang = "GLSL";       break;
   4351       case SpvSourceLanguageOpenCL_C:     lang = "OpenCL C";   break;
   4352       case SpvSourceLanguageOpenCL_CPP:   lang = "OpenCL C++"; break;
   4353       case SpvSourceLanguageHLSL:         lang = "HLSL";       break;
   4354       }
   4355 
   4356       uint32_t version = w[2];
   4357 
   4358       const char *file =
   4359          (count > 3) ? vtn_value(b, w[3], vtn_value_type_string)->str : "";
   4360 
   4361       vtn_info("Parsing SPIR-V from %s %u source file %s", lang, version, file);
   4362 
   4363       b->source_lang = w[1];
   4364       break;
   4365    }
   4366 
   4367    case SpvOpSourceExtension:
   4368    case SpvOpSourceContinued:
   4369    case SpvOpExtension:
   4370    case SpvOpModuleProcessed:
   4371       /* Unhandled, but these are for debug so that's ok. */
   4372       break;
   4373 
   4374    case SpvOpCapability: {
   4375       SpvCapability cap = w[1];
   4376       switch (cap) {
   4377       case SpvCapabilityMatrix:
   4378       case SpvCapabilityShader:
   4379       case SpvCapabilityGeometry:
   4380       case SpvCapabilityGeometryPointSize:
   4381       case SpvCapabilityUniformBufferArrayDynamicIndexing:
   4382       case SpvCapabilitySampledImageArrayDynamicIndexing:
   4383       case SpvCapabilityStorageBufferArrayDynamicIndexing:
   4384       case SpvCapabilityStorageImageArrayDynamicIndexing:
   4385       case SpvCapabilityImageRect:
   4386       case SpvCapabilitySampledRect:
   4387       case SpvCapabilitySampled1D:
   4388       case SpvCapabilityImage1D:
   4389       case SpvCapabilitySampledCubeArray:
   4390       case SpvCapabilityImageCubeArray:
   4391       case SpvCapabilitySampledBuffer:
   4392       case SpvCapabilityImageBuffer:
   4393       case SpvCapabilityImageQuery:
   4394       case SpvCapabilityDerivativeControl:
   4395       case SpvCapabilityInterpolationFunction:
   4396       case SpvCapabilityMultiViewport:
   4397       case SpvCapabilitySampleRateShading:
   4398       case SpvCapabilityClipDistance:
   4399       case SpvCapabilityCullDistance:
   4400       case SpvCapabilityInputAttachment:
   4401       case SpvCapabilityImageGatherExtended:
   4402       case SpvCapabilityStorageImageExtendedFormats:
   4403       case SpvCapabilityVector16:
   4404       case SpvCapabilityDotProductKHR:
   4405       case SpvCapabilityDotProductInputAllKHR:
   4406       case SpvCapabilityDotProductInput4x8BitKHR:
   4407       case SpvCapabilityDotProductInput4x8BitPackedKHR:
   4408          break;
   4409 
   4410       case SpvCapabilityLinkage:
   4411          if (!b->options->create_library)
   4412             vtn_warn("Unsupported SPIR-V capability: %s",
   4413                      spirv_capability_to_string(cap));
   4414          break;
   4415 
   4416       case SpvCapabilitySparseResidency:
   4417          spv_check_supported(sparse_residency, cap);
   4418          break;
   4419 
   4420       case SpvCapabilityMinLod:
   4421          spv_check_supported(min_lod, cap);
   4422          break;
   4423 
   4424       case SpvCapabilityAtomicStorage:
   4425          spv_check_supported(atomic_storage, cap);
   4426          break;
   4427 
   4428       case SpvCapabilityFloat64:
   4429          spv_check_supported(float64, cap);
   4430          break;
   4431       case SpvCapabilityInt64:
   4432          spv_check_supported(int64, cap);
   4433          break;
   4434       case SpvCapabilityInt16:
   4435          spv_check_supported(int16, cap);
   4436          break;
   4437       case SpvCapabilityInt8:
   4438          spv_check_supported(int8, cap);
   4439          break;
   4440 
   4441       case SpvCapabilityTransformFeedback:
   4442          spv_check_supported(transform_feedback, cap);
   4443          break;
   4444 
   4445       case SpvCapabilityGeometryStreams:
   4446          spv_check_supported(geometry_streams, cap);
   4447          break;
   4448 
   4449       case SpvCapabilityInt64Atomics:
   4450          spv_check_supported(int64_atomics, cap);
   4451          break;
   4452 
   4453       case SpvCapabilityStorageImageMultisample:
   4454          spv_check_supported(storage_image_ms, cap);
   4455          break;
   4456 
   4457       case SpvCapabilityAddresses:
   4458          spv_check_supported(address, cap);
   4459          break;
   4460 
   4461       case SpvCapabilityKernel:
   4462       case SpvCapabilityFloat16Buffer:
   4463          spv_check_supported(kernel, cap);
   4464          break;
   4465 
   4466       case SpvCapabilityGenericPointer:
   4467          spv_check_supported(generic_pointers, cap);
   4468          break;
   4469 
   4470       case SpvCapabilityImageBasic:
   4471          spv_check_supported(kernel_image, cap);
   4472          break;
   4473 
   4474       case SpvCapabilityImageReadWrite:
   4475          spv_check_supported(kernel_image_read_write, cap);
   4476          break;
   4477 
   4478       case SpvCapabilityLiteralSampler:
   4479          spv_check_supported(literal_sampler, cap);
   4480          break;
   4481 
   4482       case SpvCapabilityImageMipmap:
   4483       case SpvCapabilityPipes:
   4484       case SpvCapabilityDeviceEnqueue:
   4485          vtn_warn("Unsupported OpenCL-style SPIR-V capability: %s",
   4486                   spirv_capability_to_string(cap));
   4487          break;
   4488 
   4489       case SpvCapabilityImageMSArray:
   4490          spv_check_supported(image_ms_array, cap);
   4491          break;
   4492 
   4493       case SpvCapabilityTessellation:
   4494       case SpvCapabilityTessellationPointSize:
   4495          spv_check_supported(tessellation, cap);
   4496          break;
   4497 
   4498       case SpvCapabilityDrawParameters:
   4499          spv_check_supported(draw_parameters, cap);
   4500          break;
   4501 
   4502       case SpvCapabilityStorageImageReadWithoutFormat:
   4503          spv_check_supported(image_read_without_format, cap);
   4504          break;
   4505 
   4506       case SpvCapabilityStorageImageWriteWithoutFormat:
   4507          spv_check_supported(image_write_without_format, cap);
   4508          break;
   4509 
   4510       case SpvCapabilityDeviceGroup:
   4511          spv_check_supported(device_group, cap);
   4512          break;
   4513 
   4514       case SpvCapabilityMultiView:
   4515          spv_check_supported(multiview, cap);
   4516          break;
   4517 
   4518       case SpvCapabilityGroupNonUniform:
   4519          spv_check_supported(subgroup_basic, cap);
   4520          break;
   4521 
   4522       case SpvCapabilitySubgroupVoteKHR:
   4523       case SpvCapabilityGroupNonUniformVote:
   4524          spv_check_supported(subgroup_vote, cap);
   4525          break;
   4526 
   4527       case SpvCapabilitySubgroupBallotKHR:
   4528       case SpvCapabilityGroupNonUniformBallot:
   4529          spv_check_supported(subgroup_ballot, cap);
   4530          break;
   4531 
   4532       case SpvCapabilityGroupNonUniformShuffle:
   4533       case SpvCapabilityGroupNonUniformShuffleRelative:
   4534          spv_check_supported(subgroup_shuffle, cap);
   4535          break;
   4536 
   4537       case SpvCapabilityGroupNonUniformQuad:
   4538          spv_check_supported(subgroup_quad, cap);
   4539          break;
   4540 
   4541       case SpvCapabilityGroupNonUniformArithmetic:
   4542       case SpvCapabilityGroupNonUniformClustered:
   4543          spv_check_supported(subgroup_arithmetic, cap);
   4544          break;
   4545 
   4546       case SpvCapabilityGroups:
   4547          spv_check_supported(groups, cap);
   4548          break;
   4549 
   4550       case SpvCapabilitySubgroupDispatch:
   4551          spv_check_supported(subgroup_dispatch, cap);
   4552          /* Missing :
   4553           *   - SpvOpGetKernelLocalSizeForSubgroupCount
   4554           *   - SpvOpGetKernelMaxNumSubgroups
   4555           *   - SpvExecutionModeSubgroupsPerWorkgroup
   4556           *   - SpvExecutionModeSubgroupsPerWorkgroupId
   4557           */
   4558          vtn_warn("Not fully supported capability: %s",
   4559                   spirv_capability_to_string(cap));
   4560          break;
   4561 
   4562       case SpvCapabilityVariablePointersStorageBuffer:
   4563       case SpvCapabilityVariablePointers:
   4564          spv_check_supported(variable_pointers, cap);
   4565          b->variable_pointers = true;
   4566          break;
   4567 
   4568       case SpvCapabilityStorageUniformBufferBlock16:
   4569       case SpvCapabilityStorageUniform16:
   4570       case SpvCapabilityStoragePushConstant16:
   4571       case SpvCapabilityStorageInputOutput16:
   4572          spv_check_supported(storage_16bit, cap);
   4573          break;
   4574 
   4575       case SpvCapabilityShaderLayer:
   4576       case SpvCapabilityShaderViewportIndex:
   4577       case SpvCapabilityShaderViewportIndexLayerEXT:
   4578          spv_check_supported(shader_viewport_index_layer, cap);
   4579          break;
   4580 
   4581       case SpvCapabilityStorageBuffer8BitAccess:
   4582       case SpvCapabilityUniformAndStorageBuffer8BitAccess:
   4583       case SpvCapabilityStoragePushConstant8:
   4584          spv_check_supported(storage_8bit, cap);
   4585          break;
   4586 
   4587       case SpvCapabilityShaderNonUniformEXT:
   4588          spv_check_supported(descriptor_indexing, cap);
   4589          break;
   4590 
   4591       case SpvCapabilityInputAttachmentArrayDynamicIndexingEXT:
   4592       case SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT:
   4593       case SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT:
   4594          spv_check_supported(descriptor_array_dynamic_indexing, cap);
   4595          break;
   4596 
   4597       case SpvCapabilityUniformBufferArrayNonUniformIndexingEXT:
   4598       case SpvCapabilitySampledImageArrayNonUniformIndexingEXT:
   4599       case SpvCapabilityStorageBufferArrayNonUniformIndexingEXT:
   4600       case SpvCapabilityStorageImageArrayNonUniformIndexingEXT:
   4601       case SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT:
   4602       case SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT:
   4603       case SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT:
   4604          spv_check_supported(descriptor_array_non_uniform_indexing, cap);
   4605          break;
   4606 
   4607       case SpvCapabilityRuntimeDescriptorArrayEXT:
   4608          spv_check_supported(runtime_descriptor_array, cap);
   4609          break;
   4610 
   4611       case SpvCapabilityStencilExportEXT:
   4612          spv_check_supported(stencil_export, cap);
   4613          break;
   4614 
   4615       case SpvCapabilitySampleMaskPostDepthCoverage:
   4616          spv_check_supported(post_depth_coverage, cap);
   4617          break;
   4618 
   4619       case SpvCapabilityDenormFlushToZero:
   4620       case SpvCapabilityDenormPreserve:
   4621       case SpvCapabilitySignedZeroInfNanPreserve:
   4622       case SpvCapabilityRoundingModeRTE:
   4623       case SpvCapabilityRoundingModeRTZ:
   4624          spv_check_supported(float_controls, cap);
   4625          break;
   4626 
   4627       case SpvCapabilityPhysicalStorageBufferAddresses:
   4628          spv_check_supported(physical_storage_buffer_address, cap);
   4629          break;
   4630 
   4631       case SpvCapabilityComputeDerivativeGroupQuadsNV:
   4632       case SpvCapabilityComputeDerivativeGroupLinearNV:
   4633          spv_check_supported(derivative_group, cap);
   4634          break;
   4635 
   4636       case SpvCapabilityFloat16:
   4637          spv_check_supported(float16, cap);
   4638          break;
   4639 
   4640       case SpvCapabilityFragmentShaderSampleInterlockEXT:
   4641          spv_check_supported(fragment_shader_sample_interlock, cap);
   4642          break;
   4643 
   4644       case SpvCapabilityFragmentShaderPixelInterlockEXT:
   4645          spv_check_supported(fragment_shader_pixel_interlock, cap);
   4646          break;
   4647 
   4648       case SpvCapabilityDemoteToHelperInvocationEXT:
   4649          spv_check_supported(demote_to_helper_invocation, cap);
   4650          b->uses_demote_to_helper_invocation = true;
   4651          break;
   4652 
   4653       case SpvCapabilityShaderClockKHR:
   4654          spv_check_supported(shader_clock, cap);
   4655 	 break;
   4656 
   4657       case SpvCapabilityVulkanMemoryModel:
   4658          spv_check_supported(vk_memory_model, cap);
   4659          break;
   4660 
   4661       case SpvCapabilityVulkanMemoryModelDeviceScope:
   4662          spv_check_supported(vk_memory_model_device_scope, cap);
   4663          break;
   4664 
   4665       case SpvCapabilityImageReadWriteLodAMD:
   4666          spv_check_supported(amd_image_read_write_lod, cap);
   4667          break;
   4668 
   4669       case SpvCapabilityIntegerFunctions2INTEL:
   4670          spv_check_supported(integer_functions2, cap);
   4671          break;
   4672 
   4673       case SpvCapabilityFragmentMaskAMD:
   4674          spv_check_supported(amd_fragment_mask, cap);
   4675          break;
   4676 
   4677       case SpvCapabilityImageGatherBiasLodAMD:
   4678          spv_check_supported(amd_image_gather_bias_lod, cap);
   4679          break;
   4680 
   4681       case SpvCapabilityAtomicFloat16AddEXT:
   4682          spv_check_supported(float16_atomic_add, cap);
   4683          break;
   4684 
   4685       case SpvCapabilityAtomicFloat32AddEXT:
   4686          spv_check_supported(float32_atomic_add, cap);
   4687          break;
   4688 
   4689       case SpvCapabilityAtomicFloat64AddEXT:
   4690          spv_check_supported(float64_atomic_add, cap);
   4691          break;
   4692 
   4693       case SpvCapabilitySubgroupShuffleINTEL:
   4694          spv_check_supported(intel_subgroup_shuffle, cap);
   4695          break;
   4696 
   4697       case SpvCapabilitySubgroupBufferBlockIOINTEL:
   4698          spv_check_supported(intel_subgroup_buffer_block_io, cap);
   4699          break;
   4700 
   4701       case SpvCapabilityRayTracingKHR:
   4702          spv_check_supported(ray_tracing, cap);
   4703          break;
   4704 
   4705       case SpvCapabilityRayQueryKHR:
   4706          spv_check_supported(ray_query, cap);
   4707          break;
   4708 
   4709       case SpvCapabilityRayTraversalPrimitiveCullingKHR:
   4710          spv_check_supported(ray_traversal_primitive_culling, cap);
   4711          break;
   4712 
   4713       case SpvCapabilityInt64ImageEXT:
   4714          spv_check_supported(image_atomic_int64, cap);
   4715          break;
   4716 
   4717       case SpvCapabilityFragmentShadingRateKHR:
   4718          spv_check_supported(fragment_shading_rate, cap);
   4719          break;
   4720 
   4721       case SpvCapabilityWorkgroupMemoryExplicitLayoutKHR:
   4722          spv_check_supported(workgroup_memory_explicit_layout, cap);
   4723          break;
   4724 
   4725       case SpvCapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR:
   4726          spv_check_supported(workgroup_memory_explicit_layout, cap);
   4727          spv_check_supported(storage_8bit, cap);
   4728          break;
   4729 
   4730       case SpvCapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR:
   4731          spv_check_supported(workgroup_memory_explicit_layout, cap);
   4732          spv_check_supported(storage_16bit, cap);
   4733          break;
   4734 
   4735       case SpvCapabilityAtomicFloat16MinMaxEXT:
   4736          spv_check_supported(float16_atomic_min_max, cap);
   4737          break;
   4738 
   4739       case SpvCapabilityAtomicFloat32MinMaxEXT:
   4740          spv_check_supported(float32_atomic_min_max, cap);
   4741          break;
   4742 
   4743       case SpvCapabilityAtomicFloat64MinMaxEXT:
   4744          spv_check_supported(float64_atomic_min_max, cap);
   4745          break;
   4746 
   4747       case SpvCapabilityMeshShadingNV:
   4748          spv_check_supported(mesh_shading_nv, cap);
   4749          break;
   4750 
   4751       default:
   4752          vtn_fail("Unhandled capability: %s (%u)",
   4753                   spirv_capability_to_string(cap), cap);
   4754       }
   4755       break;
   4756    }
   4757 
   4758    case SpvOpExtInstImport:
   4759       vtn_handle_extension(b, opcode, w, count);
   4760       break;
   4761 
   4762    case SpvOpMemoryModel:
   4763       switch (w[1]) {
   4764       case SpvAddressingModelPhysical32:
   4765          vtn_fail_if(b->shader->info.stage != MESA_SHADER_KERNEL,
   4766                      "AddressingModelPhysical32 only supported for kernels");
   4767          b->shader->info.cs.ptr_size = 32;
   4768          b->physical_ptrs = true;
   4769          assert(nir_address_format_bit_size(b->options->global_addr_format) == 32);
   4770          assert(nir_address_format_num_components(b->options->global_addr_format) == 1);
   4771          assert(nir_address_format_bit_size(b->options->shared_addr_format) == 32);
   4772          assert(nir_address_format_num_components(b->options->shared_addr_format) == 1);
   4773          assert(nir_address_format_bit_size(b->options->constant_addr_format) == 32);
   4774          assert(nir_address_format_num_components(b->options->constant_addr_format) == 1);
   4775          break;
   4776       case SpvAddressingModelPhysical64:
   4777          vtn_fail_if(b->shader->info.stage != MESA_SHADER_KERNEL,
   4778                      "AddressingModelPhysical64 only supported for kernels");
   4779          b->shader->info.cs.ptr_size = 64;
   4780          b->physical_ptrs = true;
   4781          assert(nir_address_format_bit_size(b->options->global_addr_format) == 64);
   4782          assert(nir_address_format_num_components(b->options->global_addr_format) == 1);
   4783          assert(nir_address_format_bit_size(b->options->shared_addr_format) == 64);
   4784          assert(nir_address_format_num_components(b->options->shared_addr_format) == 1);
   4785          assert(nir_address_format_bit_size(b->options->constant_addr_format) == 64);
   4786          assert(nir_address_format_num_components(b->options->constant_addr_format) == 1);
   4787          break;
   4788       case SpvAddressingModelLogical:
   4789          vtn_fail_if(b->shader->info.stage == MESA_SHADER_KERNEL,
   4790                      "AddressingModelLogical only supported for shaders");
   4791          b->physical_ptrs = false;
   4792          break;
   4793       case SpvAddressingModelPhysicalStorageBuffer64:
   4794          vtn_fail_if(!b->options ||
   4795                      !b->options->caps.physical_storage_buffer_address,
   4796                      "AddressingModelPhysicalStorageBuffer64 not supported");
   4797          break;
   4798       default:
   4799          vtn_fail("Unknown addressing model: %s (%u)",
   4800                   spirv_addressingmodel_to_string(w[1]), w[1]);
   4801          break;
   4802       }
   4803 
   4804       b->mem_model = w[2];
   4805       switch (w[2]) {
   4806       case SpvMemoryModelSimple:
   4807       case SpvMemoryModelGLSL450:
   4808       case SpvMemoryModelOpenCL:
   4809          break;
   4810       case SpvMemoryModelVulkan:
   4811          vtn_fail_if(!b->options->caps.vk_memory_model,
   4812                      "Vulkan memory model is unsupported by this driver");
   4813          break;
   4814       default:
   4815          vtn_fail("Unsupported memory model: %s",
   4816                   spirv_memorymodel_to_string(w[2]));
   4817          break;
   4818       }
   4819       break;
   4820 
   4821    case SpvOpEntryPoint:
   4822       vtn_handle_entry_point(b, w, count);
   4823       break;
   4824 
   4825    case SpvOpString:
   4826       vtn_push_value(b, w[1], vtn_value_type_string)->str =
   4827          vtn_string_literal(b, &w[2], count - 2, NULL);
   4828       break;
   4829 
   4830    case SpvOpName:
   4831       b->values[w[1]].name = vtn_string_literal(b, &w[2], count - 2, NULL);
   4832       break;
   4833 
   4834    case SpvOpMemberName:
   4835       /* TODO */
   4836       break;
   4837 
   4838    case SpvOpExecutionMode:
   4839    case SpvOpExecutionModeId:
   4840    case SpvOpDecorationGroup:
   4841    case SpvOpDecorate:
   4842    case SpvOpDecorateId:
   4843    case SpvOpMemberDecorate:
   4844    case SpvOpGroupDecorate:
   4845    case SpvOpGroupMemberDecorate:
   4846    case SpvOpDecorateString:
   4847    case SpvOpMemberDecorateString:
   4848       vtn_handle_decoration(b, opcode, w, count);
   4849       break;
   4850 
   4851    case SpvOpExtInst: {
   4852       struct vtn_value *val = vtn_value(b, w[3], vtn_value_type_extension);
   4853       if (val->ext_handler == vtn_handle_non_semantic_instruction) {
   4854          /* NonSemantic extended instructions are acceptable in preamble. */
   4855          vtn_handle_non_semantic_instruction(b, w[4], w, count);
   4856          return true;
   4857       } else {
   4858          return false; /* End of preamble. */
   4859       }
   4860    }
   4861 
   4862    default:
   4863       return false; /* End of preamble */
   4864    }
   4865 
   4866    return true;
   4867 }
   4868 
   4869 static void
   4870 vtn_handle_execution_mode(struct vtn_builder *b, struct vtn_value *entry_point,
   4871                           const struct vtn_decoration *mode, UNUSED void *data)
   4872 {
   4873    vtn_assert(b->entry_point == entry_point);
   4874 
   4875    switch(mode->exec_mode) {
   4876    case SpvExecutionModeOriginUpperLeft:
   4877    case SpvExecutionModeOriginLowerLeft:
   4878       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   4879       b->shader->info.fs.origin_upper_left =
   4880          (mode->exec_mode == SpvExecutionModeOriginUpperLeft);
   4881       break;
   4882 
   4883    case SpvExecutionModeEarlyFragmentTests:
   4884       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   4885       b->shader->info.fs.early_fragment_tests = true;
   4886       break;
   4887 
   4888    case SpvExecutionModePostDepthCoverage:
   4889       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   4890       b->shader->info.fs.post_depth_coverage = true;
   4891       break;
   4892 
   4893    case SpvExecutionModeInvocations:
   4894       vtn_assert(b->shader->info.stage == MESA_SHADER_GEOMETRY);
   4895       b->shader->info.gs.invocations = MAX2(1, mode->operands[0]);
   4896       break;
   4897 
   4898    case SpvExecutionModeDepthReplacing:
   4899       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   4900       b->shader->info.fs.depth_layout = FRAG_DEPTH_LAYOUT_ANY;
   4901       break;
   4902    case SpvExecutionModeDepthGreater:
   4903       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   4904       b->shader->info.fs.depth_layout = FRAG_DEPTH_LAYOUT_GREATER;
   4905       break;
   4906    case SpvExecutionModeDepthLess:
   4907       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   4908       b->shader->info.fs.depth_layout = FRAG_DEPTH_LAYOUT_LESS;
   4909       break;
   4910    case SpvExecutionModeDepthUnchanged:
   4911       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   4912       b->shader->info.fs.depth_layout = FRAG_DEPTH_LAYOUT_UNCHANGED;
   4913       break;
   4914 
   4915    case SpvExecutionModeLocalSizeHint:
   4916       vtn_assert(b->shader->info.stage == MESA_SHADER_KERNEL);
   4917       b->shader->info.cs.workgroup_size_hint[0] = mode->operands[0];
   4918       b->shader->info.cs.workgroup_size_hint[1] = mode->operands[1];
   4919       b->shader->info.cs.workgroup_size_hint[2] = mode->operands[2];
   4920       break;
   4921 
   4922    case SpvExecutionModeLocalSize:
   4923       if (gl_shader_stage_uses_workgroup(b->shader->info.stage)) {
   4924          b->shader->info.workgroup_size[0] = mode->operands[0];
   4925          b->shader->info.workgroup_size[1] = mode->operands[1];
   4926          b->shader->info.workgroup_size[2] = mode->operands[2];
   4927       } else {
   4928          vtn_fail("Execution mode LocalSize not supported in stage %s",
   4929                   _mesa_shader_stage_to_string(b->shader->info.stage));
   4930       }
   4931       break;
   4932 
   4933    case SpvExecutionModeOutputVertices:
   4934       switch (b->shader->info.stage) {
   4935       case MESA_SHADER_TESS_CTRL:
   4936       case MESA_SHADER_TESS_EVAL:
   4937          b->shader->info.tess.tcs_vertices_out = mode->operands[0];
   4938          break;
   4939       case MESA_SHADER_GEOMETRY:
   4940          b->shader->info.gs.vertices_out = mode->operands[0];
   4941          break;
   4942       case MESA_SHADER_MESH:
   4943          b->shader->info.mesh.max_vertices_out = mode->operands[0];
   4944          break;
   4945       default:
   4946          vtn_fail("Execution mode OutputVertices not supported in stage %s",
   4947                   _mesa_shader_stage_to_string(b->shader->info.stage));
   4948          break;
   4949       }
   4950       break;
   4951 
   4952    case SpvExecutionModeInputPoints:
   4953    case SpvExecutionModeInputLines:
   4954    case SpvExecutionModeInputLinesAdjacency:
   4955    case SpvExecutionModeTriangles:
   4956    case SpvExecutionModeInputTrianglesAdjacency:
   4957    case SpvExecutionModeQuads:
   4958    case SpvExecutionModeIsolines:
   4959       if (b->shader->info.stage == MESA_SHADER_TESS_CTRL ||
   4960           b->shader->info.stage == MESA_SHADER_TESS_EVAL) {
   4961          b->shader->info.tess.primitive_mode =
   4962             gl_primitive_from_spv_execution_mode(b, mode->exec_mode);
   4963       } else {
   4964          vtn_assert(b->shader->info.stage == MESA_SHADER_GEOMETRY);
   4965          b->shader->info.gs.vertices_in =
   4966             vertices_in_from_spv_execution_mode(b, mode->exec_mode);
   4967          b->shader->info.gs.input_primitive =
   4968             gl_primitive_from_spv_execution_mode(b, mode->exec_mode);
   4969       }
   4970       break;
   4971 
   4972    case SpvExecutionModeOutputPrimitivesNV:
   4973       vtn_assert(b->shader->info.stage == MESA_SHADER_MESH);
   4974       b->shader->info.mesh.max_primitives_out = mode->operands[0];
   4975       break;
   4976 
   4977    case SpvExecutionModeOutputLinesNV:
   4978    case SpvExecutionModeOutputTrianglesNV:
   4979       vtn_assert(b->shader->info.stage == MESA_SHADER_MESH);
   4980       b->shader->info.mesh.primitive_type =
   4981          gl_primitive_from_spv_execution_mode(b, mode->exec_mode);
   4982       break;
   4983 
   4984    case SpvExecutionModeOutputPoints: {
   4985       const unsigned primitive =
   4986          gl_primitive_from_spv_execution_mode(b, mode->exec_mode);
   4987 
   4988       switch (b->shader->info.stage) {
   4989       case MESA_SHADER_GEOMETRY:
   4990          b->shader->info.gs.output_primitive = primitive;
   4991          break;
   4992       case MESA_SHADER_MESH:
   4993          b->shader->info.mesh.primitive_type = primitive;
   4994          break;
   4995       default:
   4996          vtn_fail("Execution mode OutputPoints not supported in stage %s",
   4997                   _mesa_shader_stage_to_string(b->shader->info.stage));
   4998          break;
   4999       }
   5000       break;
   5001    }
   5002 
   5003    case SpvExecutionModeOutputLineStrip:
   5004    case SpvExecutionModeOutputTriangleStrip:
   5005       vtn_assert(b->shader->info.stage == MESA_SHADER_GEOMETRY);
   5006       b->shader->info.gs.output_primitive =
   5007          gl_primitive_from_spv_execution_mode(b, mode->exec_mode);
   5008       break;
   5009 
   5010    case SpvExecutionModeSpacingEqual:
   5011       vtn_assert(b->shader->info.stage == MESA_SHADER_TESS_CTRL ||
   5012                  b->shader->info.stage == MESA_SHADER_TESS_EVAL);
   5013       b->shader->info.tess.spacing = TESS_SPACING_EQUAL;
   5014       break;
   5015    case SpvExecutionModeSpacingFractionalEven:
   5016       vtn_assert(b->shader->info.stage == MESA_SHADER_TESS_CTRL ||
   5017                  b->shader->info.stage == MESA_SHADER_TESS_EVAL);
   5018       b->shader->info.tess.spacing = TESS_SPACING_FRACTIONAL_EVEN;
   5019       break;
   5020    case SpvExecutionModeSpacingFractionalOdd:
   5021       vtn_assert(b->shader->info.stage == MESA_SHADER_TESS_CTRL ||
   5022                  b->shader->info.stage == MESA_SHADER_TESS_EVAL);
   5023       b->shader->info.tess.spacing = TESS_SPACING_FRACTIONAL_ODD;
   5024       break;
   5025    case SpvExecutionModeVertexOrderCw:
   5026       vtn_assert(b->shader->info.stage == MESA_SHADER_TESS_CTRL ||
   5027                  b->shader->info.stage == MESA_SHADER_TESS_EVAL);
   5028       b->shader->info.tess.ccw = false;
   5029       break;
   5030    case SpvExecutionModeVertexOrderCcw:
   5031       vtn_assert(b->shader->info.stage == MESA_SHADER_TESS_CTRL ||
   5032                  b->shader->info.stage == MESA_SHADER_TESS_EVAL);
   5033       b->shader->info.tess.ccw = true;
   5034       break;
   5035    case SpvExecutionModePointMode:
   5036       vtn_assert(b->shader->info.stage == MESA_SHADER_TESS_CTRL ||
   5037                  b->shader->info.stage == MESA_SHADER_TESS_EVAL);
   5038       b->shader->info.tess.point_mode = true;
   5039       break;
   5040 
   5041    case SpvExecutionModePixelCenterInteger:
   5042       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   5043       b->shader->info.fs.pixel_center_integer = true;
   5044       break;
   5045 
   5046    case SpvExecutionModeXfb:
   5047       b->shader->info.has_transform_feedback_varyings = true;
   5048       break;
   5049 
   5050    case SpvExecutionModeVecTypeHint:
   5051       break; /* OpenCL */
   5052 
   5053    case SpvExecutionModeContractionOff:
   5054       if (b->shader->info.stage != MESA_SHADER_KERNEL)
   5055          vtn_warn("ExectionMode only allowed for CL-style kernels: %s",
   5056                   spirv_executionmode_to_string(mode->exec_mode));
   5057       else
   5058          b->exact = true;
   5059       break;
   5060 
   5061    case SpvExecutionModeStencilRefReplacingEXT:
   5062       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   5063       break;
   5064 
   5065    case SpvExecutionModeDerivativeGroupQuadsNV:
   5066       vtn_assert(b->shader->info.stage == MESA_SHADER_COMPUTE);
   5067       b->shader->info.cs.derivative_group = DERIVATIVE_GROUP_QUADS;
   5068       break;
   5069 
   5070    case SpvExecutionModeDerivativeGroupLinearNV:
   5071       vtn_assert(b->shader->info.stage == MESA_SHADER_COMPUTE);
   5072       b->shader->info.cs.derivative_group = DERIVATIVE_GROUP_LINEAR;
   5073       break;
   5074 
   5075    case SpvExecutionModePixelInterlockOrderedEXT:
   5076       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   5077       b->shader->info.fs.pixel_interlock_ordered = true;
   5078       break;
   5079 
   5080    case SpvExecutionModePixelInterlockUnorderedEXT:
   5081       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   5082       b->shader->info.fs.pixel_interlock_unordered = true;
   5083       break;
   5084 
   5085    case SpvExecutionModeSampleInterlockOrderedEXT:
   5086       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   5087       b->shader->info.fs.sample_interlock_ordered = true;
   5088       break;
   5089 
   5090    case SpvExecutionModeSampleInterlockUnorderedEXT:
   5091       vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
   5092       b->shader->info.fs.sample_interlock_unordered = true;
   5093       break;
   5094 
   5095    case SpvExecutionModeDenormPreserve:
   5096    case SpvExecutionModeDenormFlushToZero:
   5097    case SpvExecutionModeSignedZeroInfNanPreserve:
   5098    case SpvExecutionModeRoundingModeRTE:
   5099    case SpvExecutionModeRoundingModeRTZ: {
   5100       unsigned execution_mode = 0;
   5101       switch (mode->exec_mode) {
   5102       case SpvExecutionModeDenormPreserve:
   5103          switch (mode->operands[0]) {
   5104          case 16: execution_mode = FLOAT_CONTROLS_DENORM_PRESERVE_FP16; break;
   5105          case 32: execution_mode = FLOAT_CONTROLS_DENORM_PRESERVE_FP32; break;
   5106          case 64: execution_mode = FLOAT_CONTROLS_DENORM_PRESERVE_FP64; break;
   5107          default: vtn_fail("Floating point type not supported");
   5108          }
   5109          break;
   5110       case SpvExecutionModeDenormFlushToZero:
   5111          switch (mode->operands[0]) {
   5112          case 16: execution_mode = FLOAT_CONTROLS_DENORM_FLUSH_TO_ZERO_FP16; break;
   5113          case 32: execution_mode = FLOAT_CONTROLS_DENORM_FLUSH_TO_ZERO_FP32; break;
   5114          case 64: execution_mode = FLOAT_CONTROLS_DENORM_FLUSH_TO_ZERO_FP64; break;
   5115          default: vtn_fail("Floating point type not supported");
   5116          }
   5117          break;
   5118       case SpvExecutionModeSignedZeroInfNanPreserve:
   5119          switch (mode->operands[0]) {
   5120          case 16: execution_mode = FLOAT_CONTROLS_SIGNED_ZERO_INF_NAN_PRESERVE_FP16; break;
   5121          case 32: execution_mode = FLOAT_CONTROLS_SIGNED_ZERO_INF_NAN_PRESERVE_FP32; break;
   5122          case 64: execution_mode = FLOAT_CONTROLS_SIGNED_ZERO_INF_NAN_PRESERVE_FP64; break;
   5123          default: vtn_fail("Floating point type not supported");
   5124          }
   5125          break;
   5126       case SpvExecutionModeRoundingModeRTE:
   5127          switch (mode->operands[0]) {
   5128          case 16: execution_mode = FLOAT_CONTROLS_ROUNDING_MODE_RTE_FP16; break;
   5129          case 32: execution_mode = FLOAT_CONTROLS_ROUNDING_MODE_RTE_FP32; break;
   5130          case 64: execution_mode = FLOAT_CONTROLS_ROUNDING_MODE_RTE_FP64; break;
   5131          default: vtn_fail("Floating point type not supported");
   5132          }
   5133          break;
   5134       case SpvExecutionModeRoundingModeRTZ:
   5135          switch (mode->operands[0]) {
   5136          case 16: execution_mode = FLOAT_CONTROLS_ROUNDING_MODE_RTZ_FP16; break;
   5137          case 32: execution_mode = FLOAT_CONTROLS_ROUNDING_MODE_RTZ_FP32; break;
   5138          case 64: execution_mode = FLOAT_CONTROLS_ROUNDING_MODE_RTZ_FP64; break;
   5139          default: vtn_fail("Floating point type not supported");
   5140          }
   5141          break;
   5142       default:
   5143          break;
   5144       }
   5145 
   5146       b->shader->info.float_controls_execution_mode |= execution_mode;
   5147 
   5148       for (unsigned bit_size = 16; bit_size <= 64; bit_size *= 2) {
   5149          vtn_fail_if(nir_is_denorm_flush_to_zero(b->shader->info.float_controls_execution_mode, bit_size) &&
   5150                      nir_is_denorm_preserve(b->shader->info.float_controls_execution_mode, bit_size),
   5151                      "Cannot flush to zero and preserve denorms for the same bit size.");
   5152          vtn_fail_if(nir_is_rounding_mode_rtne(b->shader->info.float_controls_execution_mode, bit_size) &&
   5153                      nir_is_rounding_mode_rtz(b->shader->info.float_controls_execution_mode, bit_size),
   5154                      "Cannot set rounding mode to RTNE and RTZ for the same bit size.");
   5155       }
   5156       break;
   5157    }
   5158 
   5159    case SpvExecutionModeLocalSizeId:
   5160    case SpvExecutionModeLocalSizeHintId:
   5161       /* Handled later by vtn_handle_execution_mode_id(). */
   5162       break;
   5163 
   5164    case SpvExecutionModeSubgroupSize:
   5165       vtn_assert(b->shader->info.stage == MESA_SHADER_KERNEL);
   5166       b->shader->info.cs.subgroup_size = mode->operands[0];
   5167       break;
   5168 
   5169    case SpvExecutionModeSubgroupUniformControlFlowKHR:
   5170       /* There's no corresponding SPIR-V capability, so check here. */
   5171       vtn_fail_if(!b->options->caps.subgroup_uniform_control_flow,
   5172                   "SpvExecutionModeSubgroupUniformControlFlowKHR not supported.");
   5173       break;
   5174 
   5175    default:
   5176       vtn_fail("Unhandled execution mode: %s (%u)",
   5177                spirv_executionmode_to_string(mode->exec_mode),
   5178                mode->exec_mode);
   5179    }
   5180 }
   5181 
   5182 static void
   5183 vtn_handle_execution_mode_id(struct vtn_builder *b, struct vtn_value *entry_point,
   5184                              const struct vtn_decoration *mode, UNUSED void *data)
   5185 {
   5186 
   5187    vtn_assert(b->entry_point == entry_point);
   5188 
   5189    switch (mode->exec_mode) {
   5190    case SpvExecutionModeLocalSizeId:
   5191       if (gl_shader_stage_uses_workgroup(b->shader->info.stage)) {
   5192          b->shader->info.workgroup_size[0] = vtn_constant_uint(b, mode->operands[0]);
   5193          b->shader->info.workgroup_size[1] = vtn_constant_uint(b, mode->operands[1]);
   5194          b->shader->info.workgroup_size[2] = vtn_constant_uint(b, mode->operands[2]);
   5195       } else {
   5196          vtn_fail("Execution mode LocalSizeId not supported in stage %s",
   5197                   _mesa_shader_stage_to_string(b->shader->info.stage));
   5198       }
   5199       break;
   5200 
   5201    case SpvExecutionModeLocalSizeHintId:
   5202       vtn_assert(b->shader->info.stage == MESA_SHADER_KERNEL);
   5203       b->shader->info.cs.workgroup_size_hint[0] = vtn_constant_uint(b, mode->operands[0]);
   5204       b->shader->info.cs.workgroup_size_hint[1] = vtn_constant_uint(b, mode->operands[1]);
   5205       b->shader->info.cs.workgroup_size_hint[2] = vtn_constant_uint(b, mode->operands[2]);
   5206       break;
   5207 
   5208    default:
   5209       /* Nothing to do.  Literal execution modes already handled by
   5210        * vtn_handle_execution_mode(). */
   5211       break;
   5212    }
   5213 }
   5214 
   5215 static bool
   5216 vtn_handle_variable_or_type_instruction(struct vtn_builder *b, SpvOp opcode,
   5217                                         const uint32_t *w, unsigned count)
   5218 {
   5219    vtn_set_instruction_result_type(b, opcode, w, count);
   5220 
   5221    switch (opcode) {
   5222    case SpvOpSource:
   5223    case SpvOpSourceContinued:
   5224    case SpvOpSourceExtension:
   5225    case SpvOpExtension:
   5226    case SpvOpCapability:
   5227    case SpvOpExtInstImport:
   5228    case SpvOpMemoryModel:
   5229    case SpvOpEntryPoint:
   5230    case SpvOpExecutionMode:
   5231    case SpvOpString:
   5232    case SpvOpName:
   5233    case SpvOpMemberName:
   5234    case SpvOpDecorationGroup:
   5235    case SpvOpDecorate:
   5236    case SpvOpDecorateId:
   5237    case SpvOpMemberDecorate:
   5238    case SpvOpGroupDecorate:
   5239    case SpvOpGroupMemberDecorate:
   5240    case SpvOpDecorateString:
   5241    case SpvOpMemberDecorateString:
   5242       vtn_fail("Invalid opcode types and variables section");
   5243       break;
   5244 
   5245    case SpvOpTypeVoid:
   5246    case SpvOpTypeBool:
   5247    case SpvOpTypeInt:
   5248    case SpvOpTypeFloat:
   5249    case SpvOpTypeVector:
   5250    case SpvOpTypeMatrix:
   5251    case SpvOpTypeImage:
   5252    case SpvOpTypeSampler:
   5253    case SpvOpTypeSampledImage:
   5254    case SpvOpTypeArray:
   5255    case SpvOpTypeRuntimeArray:
   5256    case SpvOpTypeStruct:
   5257    case SpvOpTypeOpaque:
   5258    case SpvOpTypePointer:
   5259    case SpvOpTypeForwardPointer:
   5260    case SpvOpTypeFunction:
   5261    case SpvOpTypeEvent:
   5262    case SpvOpTypeDeviceEvent:
   5263    case SpvOpTypeReserveId:
   5264    case SpvOpTypeQueue:
   5265    case SpvOpTypePipe:
   5266    case SpvOpTypeAccelerationStructureKHR:
   5267       vtn_handle_type(b, opcode, w, count);
   5268       break;
   5269 
   5270    case SpvOpConstantTrue:
   5271    case SpvOpConstantFalse:
   5272    case SpvOpConstant:
   5273    case SpvOpConstantComposite:
   5274    case SpvOpConstantNull:
   5275    case SpvOpSpecConstantTrue:
   5276    case SpvOpSpecConstantFalse:
   5277    case SpvOpSpecConstant:
   5278    case SpvOpSpecConstantComposite:
   5279    case SpvOpSpecConstantOp:
   5280       vtn_handle_constant(b, opcode, w, count);
   5281       break;
   5282 
   5283    case SpvOpUndef:
   5284    case SpvOpVariable:
   5285    case SpvOpConstantSampler:
   5286       vtn_handle_variables(b, opcode, w, count);
   5287       break;
   5288 
   5289    case SpvOpExtInst: {
   5290       struct vtn_value *val = vtn_value(b, w[3], vtn_value_type_extension);
   5291       /* NonSemantic extended instructions are acceptable in preamble, others
   5292        * will indicate the end of preamble.
   5293        */
   5294       return val->ext_handler == vtn_handle_non_semantic_instruction;
   5295    }
   5296 
   5297    default:
   5298       return false; /* End of preamble */
   5299    }
   5300 
   5301    return true;
   5302 }
   5303 
   5304 static struct vtn_ssa_value *
   5305 vtn_nir_select(struct vtn_builder *b, struct vtn_ssa_value *src0,
   5306                struct vtn_ssa_value *src1, struct vtn_ssa_value *src2)
   5307 {
   5308    struct vtn_ssa_value *dest = rzalloc(b, struct vtn_ssa_value);
   5309    dest->type = src1->type;
   5310 
   5311    if (glsl_type_is_vector_or_scalar(src1->type)) {
   5312       dest->def = nir_bcsel(&b->nb, src0->def, src1->def, src2->def);
   5313    } else {
   5314       unsigned elems = glsl_get_length(src1->type);
   5315 
   5316       dest->elems = ralloc_array(b, struct vtn_ssa_value *, elems);
   5317       for (unsigned i = 0; i < elems; i++) {
   5318          dest->elems[i] = vtn_nir_select(b, src0,
   5319                                          src1->elems[i], src2->elems[i]);
   5320       }
   5321    }
   5322 
   5323    return dest;
   5324 }
   5325 
   5326 static void
   5327 vtn_handle_select(struct vtn_builder *b, SpvOp opcode,
   5328                   const uint32_t *w, unsigned count)
   5329 {
   5330    /* Handle OpSelect up-front here because it needs to be able to handle
   5331     * pointers and not just regular vectors and scalars.
   5332     */
   5333    struct vtn_value *res_val = vtn_untyped_value(b, w[2]);
   5334    struct vtn_value *cond_val = vtn_untyped_value(b, w[3]);
   5335    struct vtn_value *obj1_val = vtn_untyped_value(b, w[4]);
   5336    struct vtn_value *obj2_val = vtn_untyped_value(b, w[5]);
   5337 
   5338    vtn_fail_if(obj1_val->type != res_val->type ||
   5339                obj2_val->type != res_val->type,
   5340                "Object types must match the result type in OpSelect");
   5341 
   5342    vtn_fail_if((cond_val->type->base_type != vtn_base_type_scalar &&
   5343                 cond_val->type->base_type != vtn_base_type_vector) ||
   5344                !glsl_type_is_boolean(cond_val->type->type),
   5345                "OpSelect must have either a vector of booleans or "
   5346                "a boolean as Condition type");
   5347 
   5348    vtn_fail_if(cond_val->type->base_type == vtn_base_type_vector &&
   5349                (res_val->type->base_type != vtn_base_type_vector ||
   5350                 res_val->type->length != cond_val->type->length),
   5351                "When Condition type in OpSelect is a vector, the Result "
   5352                "type must be a vector of the same length");
   5353 
   5354    switch (res_val->type->base_type) {
   5355    case vtn_base_type_scalar:
   5356    case vtn_base_type_vector:
   5357    case vtn_base_type_matrix:
   5358    case vtn_base_type_array:
   5359    case vtn_base_type_struct:
   5360       /* OK. */
   5361       break;
   5362    case vtn_base_type_pointer:
   5363       /* We need to have actual storage for pointer types. */
   5364       vtn_fail_if(res_val->type->type == NULL,
   5365                   "Invalid pointer result type for OpSelect");
   5366       break;
   5367    default:
   5368       vtn_fail("Result type of OpSelect must be a scalar, composite, or pointer");
   5369    }
   5370 
   5371    vtn_push_ssa_value(b, w[2],
   5372       vtn_nir_select(b, vtn_ssa_value(b, w[3]),
   5373                         vtn_ssa_value(b, w[4]),
   5374                         vtn_ssa_value(b, w[5])));
   5375 }
   5376 
   5377 static void
   5378 vtn_handle_ptr(struct vtn_builder *b, SpvOp opcode,
   5379                const uint32_t *w, unsigned count)
   5380 {
   5381    struct vtn_type *type1 = vtn_get_value_type(b, w[3]);
   5382    struct vtn_type *type2 = vtn_get_value_type(b, w[4]);
   5383    vtn_fail_if(type1->base_type != vtn_base_type_pointer ||
   5384                type2->base_type != vtn_base_type_pointer,
   5385                "%s operands must have pointer types",
   5386                spirv_op_to_string(opcode));
   5387    vtn_fail_if(type1->storage_class != type2->storage_class,
   5388                "%s operands must have the same storage class",
   5389                spirv_op_to_string(opcode));
   5390 
   5391    struct vtn_type *vtn_type = vtn_get_type(b, w[1]);
   5392    const struct glsl_type *type = vtn_type->type;
   5393 
   5394    nir_address_format addr_format = vtn_mode_to_address_format(
   5395       b, vtn_storage_class_to_mode(b, type1->storage_class, NULL, NULL));
   5396 
   5397    nir_ssa_def *def;
   5398 
   5399    switch (opcode) {
   5400    case SpvOpPtrDiff: {
   5401       /* OpPtrDiff returns the difference in number of elements (not byte offset). */
   5402       unsigned elem_size, elem_align;
   5403       glsl_get_natural_size_align_bytes(type1->deref->type,
   5404                                         &elem_size, &elem_align);
   5405 
   5406       def = nir_build_addr_isub(&b->nb,
   5407                                 vtn_get_nir_ssa(b, w[3]),
   5408                                 vtn_get_nir_ssa(b, w[4]),
   5409                                 addr_format);
   5410       def = nir_idiv(&b->nb, def, nir_imm_intN_t(&b->nb, elem_size, def->bit_size));
   5411       def = nir_i2i(&b->nb, def, glsl_get_bit_size(type));
   5412       break;
   5413    }
   5414 
   5415    case SpvOpPtrEqual:
   5416    case SpvOpPtrNotEqual: {
   5417       def = nir_build_addr_ieq(&b->nb,
   5418                                vtn_get_nir_ssa(b, w[3]),
   5419                                vtn_get_nir_ssa(b, w[4]),
   5420                                addr_format);
   5421       if (opcode == SpvOpPtrNotEqual)
   5422          def = nir_inot(&b->nb, def);
   5423       break;
   5424    }
   5425 
   5426    default:
   5427       unreachable("Invalid ptr operation");
   5428    }
   5429 
   5430    vtn_push_nir_ssa(b, w[2], def);
   5431 }
   5432 
   5433 static void
   5434 vtn_handle_ray_intrinsic(struct vtn_builder *b, SpvOp opcode,
   5435                          const uint32_t *w, unsigned count)
   5436 {
   5437    nir_intrinsic_instr *intrin;
   5438 
   5439    switch (opcode) {
   5440    case SpvOpTraceNV:
   5441    case SpvOpTraceRayKHR: {
   5442       intrin = nir_intrinsic_instr_create(b->nb.shader,
   5443                                           nir_intrinsic_trace_ray);
   5444 
   5445       /* The sources are in the same order in the NIR intrinsic */
   5446       for (unsigned i = 0; i < 10; i++)
   5447          intrin->src[i] = nir_src_for_ssa(vtn_ssa_value(b, w[i + 1])->def);
   5448 
   5449       nir_deref_instr *payload;
   5450       if (opcode == SpvOpTraceNV)
   5451          payload = vtn_get_call_payload_for_location(b, w[11]);
   5452       else
   5453          payload = vtn_nir_deref(b, w[11]);
   5454       intrin->src[10] = nir_src_for_ssa(&payload->dest.ssa);
   5455       nir_builder_instr_insert(&b->nb, &intrin->instr);
   5456       break;
   5457    }
   5458 
   5459    case SpvOpReportIntersectionKHR: {
   5460       intrin = nir_intrinsic_instr_create(b->nb.shader,
   5461                                           nir_intrinsic_report_ray_intersection);
   5462       intrin->src[0] = nir_src_for_ssa(vtn_ssa_value(b, w[3])->def);
   5463       intrin->src[1] = nir_src_for_ssa(vtn_ssa_value(b, w[4])->def);
   5464       nir_ssa_dest_init(&intrin->instr, &intrin->dest, 1, 1, NULL);
   5465       nir_builder_instr_insert(&b->nb, &intrin->instr);
   5466       vtn_push_nir_ssa(b, w[2], &intrin->dest.ssa);
   5467       break;
   5468    }
   5469 
   5470    case SpvOpIgnoreIntersectionNV:
   5471       intrin = nir_intrinsic_instr_create(b->nb.shader,
   5472                                           nir_intrinsic_ignore_ray_intersection);
   5473       nir_builder_instr_insert(&b->nb, &intrin->instr);
   5474       break;
   5475 
   5476    case SpvOpTerminateRayNV:
   5477       intrin = nir_intrinsic_instr_create(b->nb.shader,
   5478                                           nir_intrinsic_terminate_ray);
   5479       nir_builder_instr_insert(&b->nb, &intrin->instr);
   5480       break;
   5481 
   5482    case SpvOpExecuteCallableNV:
   5483    case SpvOpExecuteCallableKHR: {
   5484       intrin = nir_intrinsic_instr_create(b->nb.shader,
   5485                                           nir_intrinsic_execute_callable);
   5486       intrin->src[0] = nir_src_for_ssa(vtn_ssa_value(b, w[1])->def);
   5487       nir_deref_instr *payload;
   5488       if (opcode == SpvOpExecuteCallableNV)
   5489          payload = vtn_get_call_payload_for_location(b, w[2]);
   5490       else
   5491          payload = vtn_nir_deref(b, w[2]);
   5492       intrin->src[1] = nir_src_for_ssa(&payload->dest.ssa);
   5493       nir_builder_instr_insert(&b->nb, &intrin->instr);
   5494       break;
   5495    }
   5496 
   5497    default:
   5498       vtn_fail_with_opcode("Unhandled opcode", opcode);
   5499    }
   5500 }
   5501 
   5502 static void
   5503 vtn_handle_write_packed_primitive_indices(struct vtn_builder *b, SpvOp opcode,
   5504                                           const uint32_t *w, unsigned count)
   5505 {
   5506    vtn_assert(opcode == SpvOpWritePackedPrimitiveIndices4x8NV);
   5507 
   5508    /* TODO(mesh): Use or create a primitive that allow the unpacking to
   5509     * happen in the backend.  What we have here is functional but too
   5510     * blunt.
   5511     */
   5512 
   5513    struct vtn_type *offset_type = vtn_get_value_type(b, w[1]);
   5514    vtn_fail_if(offset_type->base_type != vtn_base_type_scalar ||
   5515                offset_type->type != glsl_uint_type(),
   5516                "Index Offset type of OpWritePackedPrimitiveIndices4x8NV "
   5517                "must be an OpTypeInt with 32-bit Width and 0 Signedness.");
   5518 
   5519    struct vtn_type *packed_type = vtn_get_value_type(b, w[2]);
   5520    vtn_fail_if(packed_type->base_type != vtn_base_type_scalar ||
   5521                packed_type->type != glsl_uint_type(),
   5522                "Packed Indices type of OpWritePackedPrimitiveIndices4x8NV "
   5523                "must be an OpTypeInt with 32-bit Width and 0 Signedness.");
   5524 
   5525    nir_deref_instr *indices = NULL;
   5526    nir_foreach_variable_with_modes(var, b->nb.shader, nir_var_shader_out) {
   5527       if (var->data.location == VARYING_SLOT_PRIMITIVE_INDICES) {
   5528          indices = nir_build_deref_var(&b->nb, var);
   5529          break;
   5530       }
   5531    }
   5532 
   5533    /* TODO(mesh): It may be the case that the variable is not present in the
   5534     * entry point interface list.
   5535     *
   5536     * See https://github.com/KhronosGroup/SPIRV-Registry/issues/104.
   5537     */
   5538    vtn_fail_if(indices == NULL,
   5539                "Missing output variable decorated with PrimitiveIndices builtin.");
   5540 
   5541    nir_ssa_def *offset = vtn_get_nir_ssa(b, w[1]);
   5542    nir_ssa_def *packed = vtn_get_nir_ssa(b, w[2]);
   5543    nir_ssa_def *unpacked = nir_unpack_bits(&b->nb, packed, 8);
   5544    for (int i = 0; i < 4; i++) {
   5545       nir_deref_instr *offset_deref =
   5546          nir_build_deref_array(&b->nb, indices,
   5547                                nir_iadd_imm(&b->nb, offset, i));
   5548       nir_ssa_def *val = nir_u2u(&b->nb, nir_channel(&b->nb, unpacked, i), 32);
   5549 
   5550       nir_store_deref(&b->nb, offset_deref, val, 0x1);
   5551    }
   5552 }
   5553 
   5554 static bool
   5555 vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
   5556                             const uint32_t *w, unsigned count)
   5557 {
   5558    switch (opcode) {
   5559    case SpvOpLabel:
   5560       break;
   5561 
   5562    case SpvOpLoopMerge:
   5563    case SpvOpSelectionMerge:
   5564       /* This is handled by cfg pre-pass and walk_blocks */
   5565       break;
   5566 
   5567    case SpvOpUndef: {
   5568       struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_undef);
   5569       val->type = vtn_get_type(b, w[1]);
   5570       break;
   5571    }
   5572 
   5573    case SpvOpExtInst:
   5574       vtn_handle_extension(b, opcode, w, count);
   5575       break;
   5576 
   5577    case SpvOpVariable:
   5578    case SpvOpLoad:
   5579    case SpvOpStore:
   5580    case SpvOpCopyMemory:
   5581    case SpvOpCopyMemorySized:
   5582    case SpvOpAccessChain:
   5583    case SpvOpPtrAccessChain:
   5584    case SpvOpInBoundsAccessChain:
   5585    case SpvOpInBoundsPtrAccessChain:
   5586    case SpvOpArrayLength:
   5587    case SpvOpConvertPtrToU:
   5588    case SpvOpConvertUToPtr:
   5589    case SpvOpGenericCastToPtrExplicit:
   5590    case SpvOpGenericPtrMemSemantics:
   5591    case SpvOpSubgroupBlockReadINTEL:
   5592    case SpvOpSubgroupBlockWriteINTEL:
   5593    case SpvOpConvertUToAccelerationStructureKHR:
   5594       vtn_handle_variables(b, opcode, w, count);
   5595       break;
   5596 
   5597    case SpvOpFunctionCall:
   5598       vtn_handle_function_call(b, opcode, w, count);
   5599       break;
   5600 
   5601    case SpvOpSampledImage:
   5602    case SpvOpImage:
   5603    case SpvOpImageSparseTexelsResident:
   5604    case SpvOpImageSampleImplicitLod:
   5605    case SpvOpImageSparseSampleImplicitLod:
   5606    case SpvOpImageSampleExplicitLod:
   5607    case SpvOpImageSparseSampleExplicitLod:
   5608    case SpvOpImageSampleDrefImplicitLod:
   5609    case SpvOpImageSparseSampleDrefImplicitLod:
   5610    case SpvOpImageSampleDrefExplicitLod:
   5611    case SpvOpImageSparseSampleDrefExplicitLod:
   5612    case SpvOpImageSampleProjImplicitLod:
   5613    case SpvOpImageSampleProjExplicitLod:
   5614    case SpvOpImageSampleProjDrefImplicitLod:
   5615    case SpvOpImageSampleProjDrefExplicitLod:
   5616    case SpvOpImageFetch:
   5617    case SpvOpImageSparseFetch:
   5618    case SpvOpImageGather:
   5619    case SpvOpImageSparseGather:
   5620    case SpvOpImageDrefGather:
   5621    case SpvOpImageSparseDrefGather:
   5622    case SpvOpImageQueryLod:
   5623    case SpvOpImageQueryLevels:
   5624       vtn_handle_texture(b, opcode, w, count);
   5625       break;
   5626 
   5627    case SpvOpImageRead:
   5628    case SpvOpImageSparseRead:
   5629    case SpvOpImageWrite:
   5630    case SpvOpImageTexelPointer:
   5631    case SpvOpImageQueryFormat:
   5632    case SpvOpImageQueryOrder:
   5633       vtn_handle_image(b, opcode, w, count);
   5634       break;
   5635 
   5636    case SpvOpImageQuerySamples:
   5637    case SpvOpImageQuerySizeLod:
   5638    case SpvOpImageQuerySize: {
   5639       struct vtn_type *image_type = vtn_get_value_type(b, w[3]);
   5640       vtn_assert(image_type->base_type == vtn_base_type_image);
   5641       if (glsl_type_is_image(image_type->glsl_image)) {
   5642          vtn_handle_image(b, opcode, w, count);
   5643       } else {
   5644          vtn_assert(glsl_type_is_sampler(image_type->glsl_image));
   5645          vtn_handle_texture(b, opcode, w, count);
   5646       }
   5647       break;
   5648    }
   5649 
   5650    case SpvOpFragmentMaskFetchAMD:
   5651    case SpvOpFragmentFetchAMD:
   5652       vtn_handle_texture(b, opcode, w, count);
   5653       break;
   5654 
   5655    case SpvOpAtomicLoad:
   5656    case SpvOpAtomicExchange:
   5657    case SpvOpAtomicCompareExchange:
   5658    case SpvOpAtomicCompareExchangeWeak:
   5659    case SpvOpAtomicIIncrement:
   5660    case SpvOpAtomicIDecrement:
   5661    case SpvOpAtomicIAdd:
   5662    case SpvOpAtomicISub:
   5663    case SpvOpAtomicSMin:
   5664    case SpvOpAtomicUMin:
   5665    case SpvOpAtomicSMax:
   5666    case SpvOpAtomicUMax:
   5667    case SpvOpAtomicAnd:
   5668    case SpvOpAtomicOr:
   5669    case SpvOpAtomicXor:
   5670    case SpvOpAtomicFAddEXT:
   5671    case SpvOpAtomicFMinEXT:
   5672    case SpvOpAtomicFMaxEXT:
   5673    case SpvOpAtomicFlagTestAndSet: {
   5674       struct vtn_value *pointer = vtn_untyped_value(b, w[3]);
   5675       if (pointer->value_type == vtn_value_type_image_pointer) {
   5676          vtn_handle_image(b, opcode, w, count);
   5677       } else {
   5678          vtn_assert(pointer->value_type == vtn_value_type_pointer);
   5679          vtn_handle_atomics(b, opcode, w, count);
   5680       }
   5681       break;
   5682    }
   5683 
   5684    case SpvOpAtomicStore:
   5685    case SpvOpAtomicFlagClear: {
   5686       struct vtn_value *pointer = vtn_untyped_value(b, w[1]);
   5687       if (pointer->value_type == vtn_value_type_image_pointer) {
   5688          vtn_handle_image(b, opcode, w, count);
   5689       } else {
   5690          vtn_assert(pointer->value_type == vtn_value_type_pointer);
   5691          vtn_handle_atomics(b, opcode, w, count);
   5692       }
   5693       break;
   5694    }
   5695 
   5696    case SpvOpSelect:
   5697       vtn_handle_select(b, opcode, w, count);
   5698       break;
   5699 
   5700    case SpvOpSNegate:
   5701    case SpvOpFNegate:
   5702    case SpvOpNot:
   5703    case SpvOpAny:
   5704    case SpvOpAll:
   5705    case SpvOpConvertFToU:
   5706    case SpvOpConvertFToS:
   5707    case SpvOpConvertSToF:
   5708    case SpvOpConvertUToF:
   5709    case SpvOpUConvert:
   5710    case SpvOpSConvert:
   5711    case SpvOpFConvert:
   5712    case SpvOpQuantizeToF16:
   5713    case SpvOpSatConvertSToU:
   5714    case SpvOpSatConvertUToS:
   5715    case SpvOpPtrCastToGeneric:
   5716    case SpvOpGenericCastToPtr:
   5717    case SpvOpIsNan:
   5718    case SpvOpIsInf:
   5719    case SpvOpIsFinite:
   5720    case SpvOpIsNormal:
   5721    case SpvOpSignBitSet:
   5722    case SpvOpLessOrGreater:
   5723    case SpvOpOrdered:
   5724    case SpvOpUnordered:
   5725    case SpvOpIAdd:
   5726    case SpvOpFAdd:
   5727    case SpvOpISub:
   5728    case SpvOpFSub:
   5729    case SpvOpIMul:
   5730    case SpvOpFMul:
   5731    case SpvOpUDiv:
   5732    case SpvOpSDiv:
   5733    case SpvOpFDiv:
   5734    case SpvOpUMod:
   5735    case SpvOpSRem:
   5736    case SpvOpSMod:
   5737    case SpvOpFRem:
   5738    case SpvOpFMod:
   5739    case SpvOpVectorTimesScalar:
   5740    case SpvOpDot:
   5741    case SpvOpIAddCarry:
   5742    case SpvOpISubBorrow:
   5743    case SpvOpUMulExtended:
   5744    case SpvOpSMulExtended:
   5745    case SpvOpShiftRightLogical:
   5746    case SpvOpShiftRightArithmetic:
   5747    case SpvOpShiftLeftLogical:
   5748    case SpvOpLogicalEqual:
   5749    case SpvOpLogicalNotEqual:
   5750    case SpvOpLogicalOr:
   5751    case SpvOpLogicalAnd:
   5752    case SpvOpLogicalNot:
   5753    case SpvOpBitwiseOr:
   5754    case SpvOpBitwiseXor:
   5755    case SpvOpBitwiseAnd:
   5756    case SpvOpIEqual:
   5757    case SpvOpFOrdEqual:
   5758    case SpvOpFUnordEqual:
   5759    case SpvOpINotEqual:
   5760    case SpvOpFOrdNotEqual:
   5761    case SpvOpFUnordNotEqual:
   5762    case SpvOpULessThan:
   5763    case SpvOpSLessThan:
   5764    case SpvOpFOrdLessThan:
   5765    case SpvOpFUnordLessThan:
   5766    case SpvOpUGreaterThan:
   5767    case SpvOpSGreaterThan:
   5768    case SpvOpFOrdGreaterThan:
   5769    case SpvOpFUnordGreaterThan:
   5770    case SpvOpULessThanEqual:
   5771    case SpvOpSLessThanEqual:
   5772    case SpvOpFOrdLessThanEqual:
   5773    case SpvOpFUnordLessThanEqual:
   5774    case SpvOpUGreaterThanEqual:
   5775    case SpvOpSGreaterThanEqual:
   5776    case SpvOpFOrdGreaterThanEqual:
   5777    case SpvOpFUnordGreaterThanEqual:
   5778    case SpvOpDPdx:
   5779    case SpvOpDPdy:
   5780    case SpvOpFwidth:
   5781    case SpvOpDPdxFine:
   5782    case SpvOpDPdyFine:
   5783    case SpvOpFwidthFine:
   5784    case SpvOpDPdxCoarse:
   5785    case SpvOpDPdyCoarse:
   5786    case SpvOpFwidthCoarse:
   5787    case SpvOpBitFieldInsert:
   5788    case SpvOpBitFieldSExtract:
   5789    case SpvOpBitFieldUExtract:
   5790    case SpvOpBitReverse:
   5791    case SpvOpBitCount:
   5792    case SpvOpTranspose:
   5793    case SpvOpOuterProduct:
   5794    case SpvOpMatrixTimesScalar:
   5795    case SpvOpVectorTimesMatrix:
   5796    case SpvOpMatrixTimesVector:
   5797    case SpvOpMatrixTimesMatrix:
   5798    case SpvOpUCountLeadingZerosINTEL:
   5799    case SpvOpUCountTrailingZerosINTEL:
   5800    case SpvOpAbsISubINTEL:
   5801    case SpvOpAbsUSubINTEL:
   5802    case SpvOpIAddSatINTEL:
   5803    case SpvOpUAddSatINTEL:
   5804    case SpvOpIAverageINTEL:
   5805    case SpvOpUAverageINTEL:
   5806    case SpvOpIAverageRoundedINTEL:
   5807    case SpvOpUAverageRoundedINTEL:
   5808    case SpvOpISubSatINTEL:
   5809    case SpvOpUSubSatINTEL:
   5810    case SpvOpIMul32x16INTEL:
   5811    case SpvOpUMul32x16INTEL:
   5812       vtn_handle_alu(b, opcode, w, count);
   5813       break;
   5814 
   5815    case SpvOpSDotKHR:
   5816    case SpvOpUDotKHR:
   5817    case SpvOpSUDotKHR:
   5818    case SpvOpSDotAccSatKHR:
   5819    case SpvOpUDotAccSatKHR:
   5820    case SpvOpSUDotAccSatKHR:
   5821       vtn_handle_integer_dot(b, opcode, w, count);
   5822       break;
   5823 
   5824    case SpvOpBitcast:
   5825       vtn_handle_bitcast(b, w, count);
   5826       break;
   5827 
   5828    case SpvOpVectorExtractDynamic:
   5829    case SpvOpVectorInsertDynamic:
   5830    case SpvOpVectorShuffle:
   5831    case SpvOpCompositeConstruct:
   5832    case SpvOpCompositeExtract:
   5833    case SpvOpCompositeInsert:
   5834    case SpvOpCopyLogical:
   5835    case SpvOpCopyObject:
   5836       vtn_handle_composite(b, opcode, w, count);
   5837       break;
   5838 
   5839    case SpvOpEmitVertex:
   5840    case SpvOpEndPrimitive:
   5841    case SpvOpEmitStreamVertex:
   5842    case SpvOpEndStreamPrimitive:
   5843    case SpvOpControlBarrier:
   5844    case SpvOpMemoryBarrier:
   5845       vtn_handle_barrier(b, opcode, w, count);
   5846       break;
   5847 
   5848    case SpvOpGroupNonUniformElect:
   5849    case SpvOpGroupNonUniformAll:
   5850    case SpvOpGroupNonUniformAny:
   5851    case SpvOpGroupNonUniformAllEqual:
   5852    case SpvOpGroupNonUniformBroadcast:
   5853    case SpvOpGroupNonUniformBroadcastFirst:
   5854    case SpvOpGroupNonUniformBallot:
   5855    case SpvOpGroupNonUniformInverseBallot:
   5856    case SpvOpGroupNonUniformBallotBitExtract:
   5857    case SpvOpGroupNonUniformBallotBitCount:
   5858    case SpvOpGroupNonUniformBallotFindLSB:
   5859    case SpvOpGroupNonUniformBallotFindMSB:
   5860    case SpvOpGroupNonUniformShuffle:
   5861    case SpvOpGroupNonUniformShuffleXor:
   5862    case SpvOpGroupNonUniformShuffleUp:
   5863    case SpvOpGroupNonUniformShuffleDown:
   5864    case SpvOpGroupNonUniformIAdd:
   5865    case SpvOpGroupNonUniformFAdd:
   5866    case SpvOpGroupNonUniformIMul:
   5867    case SpvOpGroupNonUniformFMul:
   5868    case SpvOpGroupNonUniformSMin:
   5869    case SpvOpGroupNonUniformUMin:
   5870    case SpvOpGroupNonUniformFMin:
   5871    case SpvOpGroupNonUniformSMax:
   5872    case SpvOpGroupNonUniformUMax:
   5873    case SpvOpGroupNonUniformFMax:
   5874    case SpvOpGroupNonUniformBitwiseAnd:
   5875    case SpvOpGroupNonUniformBitwiseOr:
   5876    case SpvOpGroupNonUniformBitwiseXor:
   5877    case SpvOpGroupNonUniformLogicalAnd:
   5878    case SpvOpGroupNonUniformLogicalOr:
   5879    case SpvOpGroupNonUniformLogicalXor:
   5880    case SpvOpGroupNonUniformQuadBroadcast:
   5881    case SpvOpGroupNonUniformQuadSwap:
   5882    case SpvOpGroupAll:
   5883    case SpvOpGroupAny:
   5884    case SpvOpGroupBroadcast:
   5885    case SpvOpGroupIAdd:
   5886    case SpvOpGroupFAdd:
   5887    case SpvOpGroupFMin:
   5888    case SpvOpGroupUMin:
   5889    case SpvOpGroupSMin:
   5890    case SpvOpGroupFMax:
   5891    case SpvOpGroupUMax:
   5892    case SpvOpGroupSMax:
   5893    case SpvOpSubgroupBallotKHR:
   5894    case SpvOpSubgroupFirstInvocationKHR:
   5895    case SpvOpSubgroupReadInvocationKHR:
   5896    case SpvOpSubgroupAllKHR:
   5897    case SpvOpSubgroupAnyKHR:
   5898    case SpvOpSubgroupAllEqualKHR:
   5899    case SpvOpGroupIAddNonUniformAMD:
   5900    case SpvOpGroupFAddNonUniformAMD:
   5901    case SpvOpGroupFMinNonUniformAMD:
   5902    case SpvOpGroupUMinNonUniformAMD:
   5903    case SpvOpGroupSMinNonUniformAMD:
   5904    case SpvOpGroupFMaxNonUniformAMD:
   5905    case SpvOpGroupUMaxNonUniformAMD:
   5906    case SpvOpGroupSMaxNonUniformAMD:
   5907    case SpvOpSubgroupShuffleINTEL:
   5908    case SpvOpSubgroupShuffleDownINTEL:
   5909    case SpvOpSubgroupShuffleUpINTEL:
   5910    case SpvOpSubgroupShuffleXorINTEL:
   5911       vtn_handle_subgroup(b, opcode, w, count);
   5912       break;
   5913 
   5914    case SpvOpPtrDiff:
   5915    case SpvOpPtrEqual:
   5916    case SpvOpPtrNotEqual:
   5917       vtn_handle_ptr(b, opcode, w, count);
   5918       break;
   5919 
   5920    case SpvOpBeginInvocationInterlockEXT:
   5921       nir_begin_invocation_interlock(&b->nb);
   5922       break;
   5923 
   5924    case SpvOpEndInvocationInterlockEXT:
   5925       nir_end_invocation_interlock(&b->nb);
   5926       break;
   5927 
   5928    case SpvOpDemoteToHelperInvocationEXT: {
   5929       nir_demote(&b->nb);
   5930       break;
   5931    }
   5932 
   5933    case SpvOpIsHelperInvocationEXT: {
   5934       vtn_push_nir_ssa(b, w[2], nir_is_helper_invocation(&b->nb, 1));
   5935       break;
   5936    }
   5937 
   5938    case SpvOpReadClockKHR: {
   5939       SpvScope scope = vtn_constant_uint(b, w[3]);
   5940       nir_scope nir_scope;
   5941 
   5942       switch (scope) {
   5943       case SpvScopeDevice:
   5944          nir_scope = NIR_SCOPE_DEVICE;
   5945          break;
   5946       case SpvScopeSubgroup:
   5947          nir_scope = NIR_SCOPE_SUBGROUP;
   5948          break;
   5949       default:
   5950          vtn_fail("invalid read clock scope");
   5951       }
   5952 
   5953       /* Operation supports two result types: uvec2 and uint64_t.  The NIR
   5954        * intrinsic gives uvec2, so pack the result for the other case.
   5955        */
   5956       nir_ssa_def *result = nir_shader_clock(&b->nb, nir_scope);
   5957 
   5958       struct vtn_type *type = vtn_get_type(b, w[1]);
   5959       const struct glsl_type *dest_type = type->type;
   5960 
   5961       if (glsl_type_is_vector(dest_type)) {
   5962          assert(dest_type == glsl_vector_type(GLSL_TYPE_UINT, 2));
   5963       } else {
   5964          assert(glsl_type_is_scalar(dest_type));
   5965          assert(glsl_get_base_type(dest_type) == GLSL_TYPE_UINT64);
   5966          result = nir_pack_64_2x32(&b->nb, result);
   5967       }
   5968 
   5969       vtn_push_nir_ssa(b, w[2], result);
   5970       break;
   5971    }
   5972 
   5973    case SpvOpTraceNV:
   5974    case SpvOpTraceRayKHR:
   5975    case SpvOpReportIntersectionKHR:
   5976    case SpvOpIgnoreIntersectionNV:
   5977    case SpvOpTerminateRayNV:
   5978    case SpvOpExecuteCallableNV:
   5979    case SpvOpExecuteCallableKHR:
   5980       vtn_handle_ray_intrinsic(b, opcode, w, count);
   5981       break;
   5982 
   5983    case SpvOpLifetimeStart:
   5984    case SpvOpLifetimeStop:
   5985       break;
   5986 
   5987    case SpvOpGroupAsyncCopy:
   5988    case SpvOpGroupWaitEvents:
   5989       vtn_handle_opencl_core_instruction(b, opcode, w, count);
   5990       break;
   5991 
   5992    case SpvOpWritePackedPrimitiveIndices4x8NV:
   5993       vtn_handle_write_packed_primitive_indices(b, opcode, w, count);
   5994       break;
   5995 
   5996    default:
   5997       vtn_fail_with_opcode("Unhandled opcode", opcode);
   5998    }
   5999 
   6000    return true;
   6001 }
   6002 
   6003 struct vtn_builder*
   6004 vtn_create_builder(const uint32_t *words, size_t word_count,
   6005                    gl_shader_stage stage, const char *entry_point_name,
   6006                    const struct spirv_to_nir_options *options)
   6007 {
   6008    /* Initialize the vtn_builder object */
   6009    struct vtn_builder *b = rzalloc(NULL, struct vtn_builder);
   6010    struct spirv_to_nir_options *dup_options =
   6011       ralloc(b, struct spirv_to_nir_options);
   6012    *dup_options = *options;
   6013 
   6014    b->spirv = words;
   6015    b->spirv_word_count = word_count;
   6016    b->file = NULL;
   6017    b->line = -1;
   6018    b->col = -1;
   6019    list_inithead(&b->functions);
   6020    b->entry_point_stage = stage;
   6021    b->entry_point_name = entry_point_name;
   6022    b->options = dup_options;
   6023 
   6024    /*
   6025     * Handle the SPIR-V header (first 5 dwords).
   6026     * Can't use vtx_assert() as the setjmp(3) target isn't initialized yet.
   6027     */
   6028    if (word_count <= 5)
   6029       goto fail;
   6030 
   6031    if (words[0] != SpvMagicNumber) {
   6032       vtn_err("words[0] was 0x%x, want 0x%x", words[0], SpvMagicNumber);
   6033       goto fail;
   6034    }
   6035 
   6036    b->version = words[1];
   6037    if (b->version < 0x10000) {
   6038       vtn_err("version was 0x%x, want >= 0x10000", b->version);
   6039       goto fail;
   6040    }
   6041 
   6042    b->generator_id = words[2] >> 16;
   6043    uint16_t generator_version = words[2];
   6044 
   6045    /* In GLSLang commit 8297936dd6eb3, their handling of barrier() was fixed
   6046     * to provide correct memory semantics on compute shader barrier()
   6047     * commands.  Prior to that, we need to fix them up ourselves.  This
   6048     * GLSLang fix caused them to bump to generator version 3.
   6049     */
   6050    b->wa_glslang_cs_barrier =
   6051       (b->generator_id == vtn_generator_glslang_reference_front_end &&
   6052        generator_version < 3);
   6053 
   6054    /* Identifying the LLVM-SPIRV translator:
   6055     *
   6056     * The LLVM-SPIRV translator currently doesn't store any generator ID [1].
   6057     * Our use case involving the SPIRV-Tools linker also mean we want to check
   6058     * for that tool instead. Finally the SPIRV-Tools linker also stores its
   6059     * generator ID in the wrong location [2].
   6060     *
   6061     * [1] : https://github.com/KhronosGroup/SPIRV-LLVM-Translator/pull/1223
   6062     * [2] : https://github.com/KhronosGroup/SPIRV-Tools/pull/4549
   6063     */
   6064    const bool is_llvm_spirv_translator =
   6065       (b->generator_id == 0 &&
   6066        generator_version == vtn_generator_spirv_tools_linker) ||
   6067       b->generator_id == vtn_generator_spirv_tools_linker;
   6068 
   6069    /* The LLVM-SPIRV translator generates Undef initializers for _local
   6070     * variables [1].
   6071     *
   6072     * [1] : https://github.com/KhronosGroup/SPIRV-LLVM-Translator/issues/1224
   6073     */
   6074    b->wa_llvm_spirv_ignore_workgroup_initializer =
   6075       b->options->environment == NIR_SPIRV_OPENCL && is_llvm_spirv_translator;
   6076 
   6077    /* words[2] == generator magic */
   6078    unsigned value_id_bound = words[3];
   6079    if (words[4] != 0) {
   6080       vtn_err("words[4] was %u, want 0", words[4]);
   6081       goto fail;
   6082    }
   6083 
   6084    b->value_id_bound = value_id_bound;
   6085    b->values = rzalloc_array(b, struct vtn_value, value_id_bound);
   6086 
   6087    if (b->options->environment == NIR_SPIRV_VULKAN && b->version < 0x10400)
   6088       b->vars_used_indirectly = _mesa_pointer_set_create(b);
   6089 
   6090    return b;
   6091  fail:
   6092    ralloc_free(b);
   6093    return NULL;
   6094 }
   6095 
   6096 static nir_function *
   6097 vtn_emit_kernel_entry_point_wrapper(struct vtn_builder *b,
   6098                                     nir_function *entry_point)
   6099 {
   6100    vtn_assert(entry_point == b->entry_point->func->nir_func);
   6101    vtn_fail_if(!entry_point->name, "entry points are required to have a name");
   6102    const char *func_name =
   6103       ralloc_asprintf(b->shader, "__wrapped_%s", entry_point->name);
   6104 
   6105    vtn_assert(b->shader->info.stage == MESA_SHADER_KERNEL);
   6106 
   6107    nir_function *main_entry_point = nir_function_create(b->shader, func_name);
   6108    main_entry_point->impl = nir_function_impl_create(main_entry_point);
   6109    nir_builder_init(&b->nb, main_entry_point->impl);
   6110    b->nb.cursor = nir_after_cf_list(&main_entry_point->impl->body);
   6111    b->func_param_idx = 0;
   6112 
   6113    nir_call_instr *call = nir_call_instr_create(b->nb.shader, entry_point);
   6114 
   6115    for (unsigned i = 0; i < entry_point->num_params; ++i) {
   6116       struct vtn_type *param_type = b->entry_point->func->type->params[i];
   6117 
   6118       /* consider all pointers to function memory to be parameters passed
   6119        * by value
   6120        */
   6121       bool is_by_val = param_type->base_type == vtn_base_type_pointer &&
   6122          param_type->storage_class == SpvStorageClassFunction;
   6123 
   6124       /* input variable */
   6125       nir_variable *in_var = rzalloc(b->nb.shader, nir_variable);
   6126       in_var->data.mode = nir_var_uniform;
   6127       in_var->data.read_only = true;
   6128       in_var->data.location = i;
   6129       if (param_type->base_type == vtn_base_type_image) {
   6130          in_var->data.access =
   6131             spirv_to_gl_access_qualifier(b, param_type->access_qualifier);
   6132       }
   6133 
   6134       if (is_by_val)
   6135          in_var->type = param_type->deref->type;
   6136       else if (param_type->base_type == vtn_base_type_image)
   6137          in_var->type = param_type->glsl_image;
   6138       else if (param_type->base_type == vtn_base_type_sampler)
   6139          in_var->type = glsl_bare_sampler_type();
   6140       else
   6141          in_var->type = param_type->type;
   6142 
   6143       nir_shader_add_variable(b->nb.shader, in_var);
   6144 
   6145       /* we have to copy the entire variable into function memory */
   6146       if (is_by_val) {
   6147          nir_variable *copy_var =
   6148             nir_local_variable_create(main_entry_point->impl, in_var->type,
   6149                                       "copy_in");
   6150          nir_copy_var(&b->nb, copy_var, in_var);
   6151          call->params[i] =
   6152             nir_src_for_ssa(&nir_build_deref_var(&b->nb, copy_var)->dest.ssa);
   6153       } else if (param_type->base_type == vtn_base_type_image ||
   6154                  param_type->base_type == vtn_base_type_sampler) {
   6155          /* Don't load the var, just pass a deref of it */
   6156          call->params[i] = nir_src_for_ssa(&nir_build_deref_var(&b->nb, in_var)->dest.ssa);
   6157       } else {
   6158          call->params[i] = nir_src_for_ssa(nir_load_var(&b->nb, in_var));
   6159       }
   6160    }
   6161 
   6162    nir_builder_instr_insert(&b->nb, &call->instr);
   6163 
   6164    return main_entry_point;
   6165 }
   6166 
   6167 static bool
   6168 can_remove(nir_variable *var, void *data)
   6169 {
   6170    const struct set *vars_used_indirectly = data;
   6171    return !_mesa_set_search(vars_used_indirectly, var);
   6172 }
   6173 
   6174 nir_shader *
   6175 spirv_to_nir(const uint32_t *words, size_t word_count,
   6176              struct nir_spirv_specialization *spec, unsigned num_spec,
   6177              gl_shader_stage stage, const char *entry_point_name,
   6178              const struct spirv_to_nir_options *options,
   6179              const nir_shader_compiler_options *nir_options)
   6180 
   6181 {
   6182    const uint32_t *word_end = words + word_count;
   6183 
   6184    struct vtn_builder *b = vtn_create_builder(words, word_count,
   6185                                               stage, entry_point_name,
   6186                                               options);
   6187 
   6188    if (b == NULL)
   6189       return NULL;
   6190 
   6191    /* See also _vtn_fail() */
   6192    if (vtn_setjmp(b->fail_jump)) {
   6193       ralloc_free(b);
   6194       return NULL;
   6195    }
   6196 
   6197    /* Skip the SPIR-V header, handled at vtn_create_builder */
   6198    words+= 5;
   6199 
   6200    b->shader = nir_shader_create(b, stage, nir_options, NULL);
   6201    b->shader->info.float_controls_execution_mode = options->float_controls_execution_mode;
   6202 
   6203    /* Handle all the preamble instructions */
   6204    words = vtn_foreach_instruction(b, words, word_end,
   6205                                    vtn_handle_preamble_instruction);
   6206 
   6207    /* DirectXShaderCompiler and glslang/shaderc both create OpKill from HLSL's
   6208     * discard/clip, which uses demote semantics. DirectXShaderCompiler will use
   6209     * demote if the extension is enabled, so we disable this workaround in that
   6210     * case.
   6211     *
   6212     * Related glslang issue: https://github.com/KhronosGroup/glslang/issues/2416
   6213     */
   6214    bool glslang = b->generator_id == vtn_generator_glslang_reference_front_end ||
   6215                   b->generator_id == vtn_generator_shaderc_over_glslang;
   6216    bool dxsc = b->generator_id == vtn_generator_spiregg;
   6217    b->convert_discard_to_demote = ((dxsc && !b->uses_demote_to_helper_invocation) ||
   6218                                    (glslang && b->source_lang == SpvSourceLanguageHLSL)) &&
   6219                                   options->caps.demote_to_helper_invocation;
   6220 
   6221    if (!options->create_library && b->entry_point == NULL) {
   6222       vtn_fail("Entry point not found for %s shader \"%s\"",
   6223                _mesa_shader_stage_to_string(stage), entry_point_name);
   6224       ralloc_free(b);
   6225       return NULL;
   6226    }
   6227 
   6228    /* Ensure a sane address mode is being used for function temps */
   6229    assert(nir_address_format_bit_size(b->options->temp_addr_format) == nir_get_ptr_bitsize(b->shader));
   6230    assert(nir_address_format_num_components(b->options->temp_addr_format) == 1);
   6231 
   6232    /* Set shader info defaults */
   6233    if (stage == MESA_SHADER_GEOMETRY)
   6234       b->shader->info.gs.invocations = 1;
   6235 
   6236    /* Parse execution modes. */
   6237    if (!options->create_library)
   6238       vtn_foreach_execution_mode(b, b->entry_point,
   6239                                  vtn_handle_execution_mode, NULL);
   6240 
   6241    b->specializations = spec;
   6242    b->num_specializations = num_spec;
   6243 
   6244    /* Handle all variable, type, and constant instructions */
   6245    words = vtn_foreach_instruction(b, words, word_end,
   6246                                    vtn_handle_variable_or_type_instruction);
   6247 
   6248    /* Parse execution modes that depend on IDs. Must happen after we have
   6249     * constants parsed.
   6250     */
   6251    if (!options->create_library)
   6252       vtn_foreach_execution_mode(b, b->entry_point,
   6253                                  vtn_handle_execution_mode_id, NULL);
   6254 
   6255    if (b->workgroup_size_builtin) {
   6256       vtn_assert(gl_shader_stage_uses_workgroup(stage));
   6257       vtn_assert(b->workgroup_size_builtin->type->type ==
   6258                  glsl_vector_type(GLSL_TYPE_UINT, 3));
   6259 
   6260       nir_const_value *const_size =
   6261          b->workgroup_size_builtin->constant->values;
   6262 
   6263       b->shader->info.workgroup_size[0] = const_size[0].u32;
   6264       b->shader->info.workgroup_size[1] = const_size[1].u32;
   6265       b->shader->info.workgroup_size[2] = const_size[2].u32;
   6266    }
   6267 
   6268    /* Set types on all vtn_values */
   6269    vtn_foreach_instruction(b, words, word_end, vtn_set_instruction_result_type);
   6270 
   6271    vtn_build_cfg(b, words, word_end);
   6272 
   6273    if (!options->create_library) {
   6274       assert(b->entry_point->value_type == vtn_value_type_function);
   6275       b->entry_point->func->referenced = true;
   6276    }
   6277 
   6278    bool progress;
   6279    do {
   6280       progress = false;
   6281       vtn_foreach_cf_node(node, &b->functions) {
   6282          struct vtn_function *func = vtn_cf_node_as_function(node);
   6283          if ((options->create_library || func->referenced) && !func->emitted) {
   6284             b->const_table = _mesa_pointer_hash_table_create(b);
   6285 
   6286             vtn_function_emit(b, func, vtn_handle_body_instruction);
   6287             progress = true;
   6288          }
   6289       }
   6290    } while (progress);
   6291 
   6292    if (!options->create_library) {
   6293       vtn_assert(b->entry_point->value_type == vtn_value_type_function);
   6294       nir_function *entry_point = b->entry_point->func->nir_func;
   6295       vtn_assert(entry_point);
   6296 
   6297       /* post process entry_points with input params */
   6298       if (entry_point->num_params && b->shader->info.stage == MESA_SHADER_KERNEL)
   6299          entry_point = vtn_emit_kernel_entry_point_wrapper(b, entry_point);
   6300 
   6301       entry_point->is_entrypoint = true;
   6302    }
   6303 
   6304    /* structurize the CFG */
   6305    nir_lower_goto_ifs(b->shader);
   6306 
   6307    /* A SPIR-V module can have multiple shaders stages and also multiple
   6308     * shaders of the same stage.  Global variables are declared per-module.
   6309     *
   6310     * Starting in SPIR-V 1.4 the list of global variables is part of
   6311     * OpEntryPoint, so only valid ones will be created.  Previous versions
   6312     * only have Input and Output variables listed, so remove dead variables to
   6313     * clean up the remaining ones.
   6314     */
   6315    if (!options->create_library && b->version < 0x10400) {
   6316       const nir_remove_dead_variables_options dead_opts = {
   6317          .can_remove_var = can_remove,
   6318          .can_remove_var_data = b->vars_used_indirectly,
   6319       };
   6320       nir_remove_dead_variables(b->shader, ~(nir_var_function_temp |
   6321                                              nir_var_shader_out |
   6322                                              nir_var_shader_in |
   6323                                              nir_var_system_value),
   6324                                 b->vars_used_indirectly ? &dead_opts : NULL);
   6325    }
   6326 
   6327    nir_foreach_variable_in_shader(var, b->shader) {
   6328       switch (var->data.mode) {
   6329       case nir_var_mem_ubo:
   6330          b->shader->info.num_ubos++;
   6331          break;
   6332       case nir_var_mem_ssbo:
   6333          b->shader->info.num_ssbos++;
   6334          break;
   6335       case nir_var_mem_push_const:
   6336          vtn_assert(b->shader->num_uniforms == 0);
   6337          b->shader->num_uniforms =
   6338             glsl_get_explicit_size(glsl_without_array(var->type), false);
   6339          break;
   6340       }
   6341    }
   6342 
   6343    /* We sometimes generate bogus derefs that, while never used, give the
   6344     * validator a bit of heartburn.  Run dead code to get rid of them.
   6345     */
   6346    nir_opt_dce(b->shader);
   6347 
   6348    /* Per SPV_KHR_workgroup_storage_explicit_layout, if one shared variable is
   6349     * a Block, all of them will be and Blocks are explicitly laid out.
   6350     */
   6351    nir_foreach_variable_with_modes(var, b->shader, nir_var_mem_shared) {
   6352       if (glsl_type_is_interface(var->type)) {
   6353          assert(b->options->caps.workgroup_memory_explicit_layout);
   6354          b->shader->info.shared_memory_explicit_layout = true;
   6355          break;
   6356       }
   6357    }
   6358    if (b->shader->info.shared_memory_explicit_layout) {
   6359       unsigned size = 0;
   6360       nir_foreach_variable_with_modes(var, b->shader, nir_var_mem_shared) {
   6361          assert(glsl_type_is_interface(var->type));
   6362          const bool align_to_stride = false;
   6363          size = MAX2(size, glsl_get_explicit_size(var->type, align_to_stride));
   6364       }
   6365       b->shader->info.shared_size = size;
   6366    }
   6367 
   6368    /* Unparent the shader from the vtn_builder before we delete the builder */
   6369    ralloc_steal(NULL, b->shader);
   6370 
   6371    nir_shader *shader = b->shader;
   6372    ralloc_free(b);
   6373 
   6374    return shader;
   6375 }
   6376