Home | History | Annotate | Download | only in nir
      1 /*
      2  * Copyright  2014 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  *    Connor Abbott (cwabbott0 (at) gmail.com)
     25  *
     26  */
     27 
     28 #include "nir.h"
     29 #include "compiler/shader_enums.h"
     30 #include <stdio.h>
     31 #include <stdlib.h>
     32 #include <inttypes.h> /* for PRIx64 macro */
     33 
     34 static void
     35 print_tabs(unsigned num_tabs, FILE *fp)
     36 {
     37    for (unsigned i = 0; i < num_tabs; i++)
     38       fprintf(fp, "\t");
     39 }
     40 
     41 typedef struct {
     42    FILE *fp;
     43    nir_shader *shader;
     44    /** map from nir_variable -> printable name */
     45    struct hash_table *ht;
     46 
     47    /** set of names used so far for nir_variables */
     48    struct set *syms;
     49 
     50    /* an index used to make new non-conflicting names */
     51    unsigned index;
     52 
     53    /**
     54     * Optional table of annotations mapping nir object
     55     * (such as instr or var) to message to print.
     56     */
     57    struct hash_table *annotations;
     58 } print_state;
     59 
     60 static void
     61 print_annotation(print_state *state, void *obj)
     62 {
     63    if (!state->annotations)
     64       return;
     65 
     66    struct hash_entry *entry = _mesa_hash_table_search(state->annotations, obj);
     67    if (!entry)
     68       return;
     69 
     70    const char *note = entry->data;
     71    _mesa_hash_table_remove(state->annotations, entry);
     72 
     73    fprintf(stderr, "%s\n\n", note);
     74 }
     75 
     76 static void
     77 print_register(nir_register *reg, print_state *state)
     78 {
     79    FILE *fp = state->fp;
     80    if (reg->name != NULL)
     81       fprintf(fp, "/* %s */ ", reg->name);
     82    if (reg->is_global)
     83       fprintf(fp, "gr%u", reg->index);
     84    else
     85       fprintf(fp, "r%u", reg->index);
     86 }
     87 
     88 static const char *sizes[] = { "error", "vec1", "vec2", "vec3", "vec4" };
     89 
     90 static void
     91 print_register_decl(nir_register *reg, print_state *state)
     92 {
     93    FILE *fp = state->fp;
     94    fprintf(fp, "decl_reg %s %u ", sizes[reg->num_components], reg->bit_size);
     95    if (reg->is_packed)
     96       fprintf(fp, "(packed) ");
     97    print_register(reg, state);
     98    if (reg->num_array_elems != 0)
     99       fprintf(fp, "[%u]", reg->num_array_elems);
    100    fprintf(fp, "\n");
    101 }
    102 
    103 static void
    104 print_ssa_def(nir_ssa_def *def, print_state *state)
    105 {
    106    FILE *fp = state->fp;
    107    if (def->name != NULL)
    108       fprintf(fp, "/* %s */ ", def->name);
    109    fprintf(fp, "%s %u ssa_%u", sizes[def->num_components], def->bit_size,
    110            def->index);
    111 }
    112 
    113 static void
    114 print_ssa_use(nir_ssa_def *def, print_state *state)
    115 {
    116    FILE *fp = state->fp;
    117    if (def->name != NULL)
    118       fprintf(fp, "/* %s */ ", def->name);
    119    fprintf(fp, "ssa_%u", def->index);
    120 }
    121 
    122 static void print_src(nir_src *src, print_state *state);
    123 
    124 static void
    125 print_reg_src(nir_reg_src *src, print_state *state)
    126 {
    127    FILE *fp = state->fp;
    128    print_register(src->reg, state);
    129    if (src->reg->num_array_elems != 0) {
    130       fprintf(fp, "[%u", src->base_offset);
    131       if (src->indirect != NULL) {
    132          fprintf(fp, " + ");
    133          print_src(src->indirect, state);
    134       }
    135       fprintf(fp, "]");
    136    }
    137 }
    138 
    139 static void
    140 print_reg_dest(nir_reg_dest *dest, print_state *state)
    141 {
    142    FILE *fp = state->fp;
    143    print_register(dest->reg, state);
    144    if (dest->reg->num_array_elems != 0) {
    145       fprintf(fp, "[%u", dest->base_offset);
    146       if (dest->indirect != NULL) {
    147          fprintf(fp, " + ");
    148          print_src(dest->indirect, state);
    149       }
    150       fprintf(fp, "]");
    151    }
    152 }
    153 
    154 static void
    155 print_src(nir_src *src, print_state *state)
    156 {
    157    if (src->is_ssa)
    158       print_ssa_use(src->ssa, state);
    159    else
    160       print_reg_src(&src->reg, state);
    161 }
    162 
    163 static void
    164 print_dest(nir_dest *dest, print_state *state)
    165 {
    166    if (dest->is_ssa)
    167       print_ssa_def(&dest->ssa, state);
    168    else
    169       print_reg_dest(&dest->reg, state);
    170 }
    171 
    172 static void
    173 print_alu_src(nir_alu_instr *instr, unsigned src, print_state *state)
    174 {
    175    FILE *fp = state->fp;
    176 
    177    if (instr->src[src].negate)
    178       fprintf(fp, "-");
    179    if (instr->src[src].abs)
    180       fprintf(fp, "abs(");
    181 
    182    print_src(&instr->src[src].src, state);
    183 
    184    bool print_swizzle = false;
    185    unsigned used_channels = 0;
    186 
    187    for (unsigned i = 0; i < 4; i++) {
    188       if (!nir_alu_instr_channel_used(instr, src, i))
    189          continue;
    190 
    191       used_channels++;
    192 
    193       if (instr->src[src].swizzle[i] != i) {
    194          print_swizzle = true;
    195          break;
    196       }
    197    }
    198 
    199    unsigned live_channels = instr->src[src].src.is_ssa
    200       ? instr->src[src].src.ssa->num_components
    201       : instr->src[src].src.reg.reg->num_components;
    202 
    203    if (print_swizzle || used_channels != live_channels) {
    204       fprintf(fp, ".");
    205       for (unsigned i = 0; i < 4; i++) {
    206          if (!nir_alu_instr_channel_used(instr, src, i))
    207             continue;
    208 
    209          fprintf(fp, "%c", "xyzw"[instr->src[src].swizzle[i]]);
    210       }
    211    }
    212 
    213    if (instr->src[src].abs)
    214       fprintf(fp, ")");
    215 }
    216 
    217 static void
    218 print_alu_dest(nir_alu_dest *dest, print_state *state)
    219 {
    220    FILE *fp = state->fp;
    221    /* we're going to print the saturate modifier later, after the opcode */
    222 
    223    print_dest(&dest->dest, state);
    224 
    225    if (!dest->dest.is_ssa &&
    226        dest->write_mask != (1 << dest->dest.reg.reg->num_components) - 1) {
    227       fprintf(fp, ".");
    228       for (unsigned i = 0; i < 4; i++)
    229          if ((dest->write_mask >> i) & 1)
    230             fprintf(fp, "%c", "xyzw"[i]);
    231    }
    232 }
    233 
    234 static void
    235 print_alu_instr(nir_alu_instr *instr, print_state *state)
    236 {
    237    FILE *fp = state->fp;
    238 
    239    print_alu_dest(&instr->dest, state);
    240 
    241    fprintf(fp, " = %s", nir_op_infos[instr->op].name);
    242    if (instr->exact)
    243       fprintf(fp, "!");
    244    if (instr->dest.saturate)
    245       fprintf(fp, ".sat");
    246    fprintf(fp, " ");
    247 
    248    for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++) {
    249       if (i != 0)
    250          fprintf(fp, ", ");
    251 
    252       print_alu_src(instr, i, state);
    253    }
    254 }
    255 
    256 static const char *
    257 get_var_name(nir_variable *var, print_state *state)
    258 {
    259    if (state->ht == NULL)
    260       return var->name ? var->name : "unnamed";
    261 
    262    assert(state->syms);
    263 
    264    struct hash_entry *entry = _mesa_hash_table_search(state->ht, var);
    265    if (entry)
    266       return entry->data;
    267 
    268    char *name;
    269    if (var->name == NULL) {
    270       name = ralloc_asprintf(state->syms, "@%u", state->index++);
    271    } else {
    272       struct set_entry *set_entry = _mesa_set_search(state->syms, var->name);
    273       if (set_entry != NULL) {
    274          /* we have a collision with another name, append an @ + a unique
    275           * index */
    276          name = ralloc_asprintf(state->syms, "%s@%u", var->name,
    277                                 state->index++);
    278       } else {
    279          /* Mark this one as seen */
    280          _mesa_set_add(state->syms, var->name);
    281          name = var->name;
    282       }
    283    }
    284 
    285    _mesa_hash_table_insert(state->ht, var, name);
    286 
    287    return name;
    288 }
    289 
    290 static void
    291 print_constant(nir_constant *c, const struct glsl_type *type, print_state *state)
    292 {
    293    FILE *fp = state->fp;
    294    const unsigned rows = glsl_get_vector_elements(type);
    295    const unsigned cols = glsl_get_matrix_columns(type);
    296    unsigned i, j;
    297 
    298    switch (glsl_get_base_type(type)) {
    299    case GLSL_TYPE_UINT:
    300    case GLSL_TYPE_INT:
    301    case GLSL_TYPE_BOOL:
    302       /* Only float base types can be matrices. */
    303       assert(cols == 1);
    304 
    305       for (i = 0; i < rows; i++) {
    306          if (i > 0) fprintf(fp, ", ");
    307          fprintf(fp, "0x%08x", c->values[0].u32[i]);
    308       }
    309       break;
    310 
    311    case GLSL_TYPE_FLOAT:
    312       for (i = 0; i < cols; i++) {
    313          for (j = 0; j < rows; j++) {
    314             if (i + j > 0) fprintf(fp, ", ");
    315             fprintf(fp, "%f", c->values[i].f32[j]);
    316          }
    317       }
    318       break;
    319 
    320    case GLSL_TYPE_DOUBLE:
    321       for (i = 0; i < cols; i++) {
    322          for (j = 0; j < rows; j++) {
    323             if (i + j > 0) fprintf(fp, ", ");
    324             fprintf(fp, "%f", c->values[i].f64[j]);
    325          }
    326       }
    327       break;
    328 
    329    case GLSL_TYPE_UINT64:
    330    case GLSL_TYPE_INT64:
    331       /* Only float base types can be matrices. */
    332       assert(cols == 1);
    333 
    334       for (i = 0; i < cols; i++) {
    335          if (i > 0) fprintf(fp, ", ");
    336          fprintf(fp, "0x%08" PRIx64, c->values[0].u64[i]);
    337       }
    338       break;
    339 
    340    case GLSL_TYPE_STRUCT:
    341       for (i = 0; i < c->num_elements; i++) {
    342          if (i > 0) fprintf(fp, ", ");
    343          fprintf(fp, "{ ");
    344          print_constant(c->elements[i], glsl_get_struct_field(type, i), state);
    345          fprintf(fp, " }");
    346       }
    347       break;
    348 
    349    case GLSL_TYPE_ARRAY:
    350       for (i = 0; i < c->num_elements; i++) {
    351          if (i > 0) fprintf(fp, ", ");
    352          fprintf(fp, "{ ");
    353          print_constant(c->elements[i], glsl_get_array_element(type), state);
    354          fprintf(fp, " }");
    355       }
    356       break;
    357 
    358    default:
    359       unreachable("not reached");
    360    }
    361 }
    362 
    363 static const char *
    364 get_variable_mode_str(nir_variable_mode mode)
    365 {
    366    switch (mode) {
    367    case nir_var_shader_in:
    368       return "shader_in";
    369    case nir_var_shader_out:
    370       return "shader_out";
    371    case nir_var_uniform:
    372       return "uniform";
    373    case nir_var_shader_storage:
    374       return "shader_storage";
    375    case nir_var_system_value:
    376       return "system";
    377    case nir_var_shared:
    378       return "shared";
    379    case nir_var_param:
    380    case nir_var_global:
    381    case nir_var_local:
    382    default:
    383       return "";
    384    }
    385 }
    386 
    387 static void
    388 print_var_decl(nir_variable *var, print_state *state)
    389 {
    390    FILE *fp = state->fp;
    391 
    392    fprintf(fp, "decl_var ");
    393 
    394    const char *const cent = (var->data.centroid) ? "centroid " : "";
    395    const char *const samp = (var->data.sample) ? "sample " : "";
    396    const char *const patch = (var->data.patch) ? "patch " : "";
    397    const char *const inv = (var->data.invariant) ? "invariant " : "";
    398    fprintf(fp, "%s%s%s%s%s %s ",
    399            cent, samp, patch, inv, get_variable_mode_str(var->data.mode),
    400            glsl_interp_mode_name(var->data.interpolation));
    401 
    402    const char *const coher = (var->data.image.coherent) ? "coherent " : "";
    403    const char *const volat = (var->data.image._volatile) ? "volatile " : "";
    404    const char *const restr = (var->data.image.restrict_flag) ? "restrict " : "";
    405    const char *const ronly = (var->data.image.read_only) ? "readonly " : "";
    406    const char *const wonly = (var->data.image.write_only) ? "writeonly " : "";
    407    fprintf(fp, "%s%s%s%s%s", coher, volat, restr, ronly, wonly);
    408 
    409    fprintf(fp, "%s %s", glsl_get_type_name(var->type),
    410            get_var_name(var, state));
    411 
    412    if (var->data.mode == nir_var_shader_in ||
    413        var->data.mode == nir_var_shader_out ||
    414        var->data.mode == nir_var_uniform ||
    415        var->data.mode == nir_var_shader_storage) {
    416       const char *loc = NULL;
    417       char buf[4];
    418 
    419       switch (state->shader->info.stage) {
    420       case MESA_SHADER_VERTEX:
    421          if (var->data.mode == nir_var_shader_in)
    422             loc = gl_vert_attrib_name(var->data.location);
    423          else if (var->data.mode == nir_var_shader_out)
    424             loc = gl_varying_slot_name(var->data.location);
    425          break;
    426       case MESA_SHADER_GEOMETRY:
    427          if ((var->data.mode == nir_var_shader_in) ||
    428              (var->data.mode == nir_var_shader_out))
    429             loc = gl_varying_slot_name(var->data.location);
    430          break;
    431       case MESA_SHADER_FRAGMENT:
    432          if (var->data.mode == nir_var_shader_in)
    433             loc = gl_varying_slot_name(var->data.location);
    434          else if (var->data.mode == nir_var_shader_out)
    435             loc = gl_frag_result_name(var->data.location);
    436          break;
    437       case MESA_SHADER_TESS_CTRL:
    438       case MESA_SHADER_TESS_EVAL:
    439       case MESA_SHADER_COMPUTE:
    440       default:
    441          /* TODO */
    442          break;
    443       }
    444 
    445       if (!loc) {
    446          snprintf(buf, sizeof(buf), "%u", var->data.location);
    447          loc = buf;
    448       }
    449 
    450       /* For shader I/O vars that have been split to components or packed,
    451        * print the fractional location within the input/output.
    452        */
    453       unsigned int num_components =
    454          glsl_get_components(glsl_without_array(var->type));
    455       const char *components = NULL;
    456       char components_local[6] = {'.' /* the rest is 0-filled */};
    457       switch (var->data.mode) {
    458       case nir_var_shader_in:
    459       case nir_var_shader_out:
    460          if (num_components < 4 && num_components != 0) {
    461             const char *xyzw = "xyzw";
    462             for (int i = 0; i < num_components; i++)
    463                components_local[i + 1] = xyzw[i + var->data.location_frac];
    464 
    465             components = components_local;
    466          }
    467          break;
    468       default:
    469          break;
    470       }
    471 
    472       fprintf(fp, " (%s%s, %u, %u)%s", loc,
    473               components ? components : "",
    474               var->data.driver_location, var->data.binding,
    475               var->data.compact ? " compact" : "");
    476    }
    477 
    478    if (var->constant_initializer) {
    479       fprintf(fp, " = { ");
    480       print_constant(var->constant_initializer, var->type, state);
    481       fprintf(fp, " }");
    482    }
    483 
    484    fprintf(fp, "\n");
    485    print_annotation(state, var);
    486 }
    487 
    488 static void
    489 print_var(nir_variable *var, print_state *state)
    490 {
    491    FILE *fp = state->fp;
    492    fprintf(fp, "%s", get_var_name(var, state));
    493 }
    494 
    495 static void
    496 print_arg(nir_variable *var, print_state *state)
    497 {
    498    FILE *fp = state->fp;
    499    fprintf(fp, "%s %s", glsl_get_type_name(var->type),
    500            get_var_name(var, state));
    501 }
    502 
    503 static void
    504 print_deref_var(nir_deref_var *deref, print_state *state)
    505 {
    506    print_var(deref->var, state);
    507 }
    508 
    509 static void
    510 print_deref_array(nir_deref_array *deref, print_state *state)
    511 {
    512    FILE *fp = state->fp;
    513    fprintf(fp, "[");
    514    switch (deref->deref_array_type) {
    515    case nir_deref_array_type_direct:
    516       fprintf(fp, "%u", deref->base_offset);
    517       break;
    518    case nir_deref_array_type_indirect:
    519       if (deref->base_offset != 0)
    520          fprintf(fp, "%u + ", deref->base_offset);
    521       print_src(&deref->indirect, state);
    522       break;
    523    case nir_deref_array_type_wildcard:
    524       fprintf(fp, "*");
    525       break;
    526    }
    527    fprintf(fp, "]");
    528 }
    529 
    530 static void
    531 print_deref_struct(nir_deref_struct *deref, const struct glsl_type *parent_type,
    532                    print_state *state)
    533 {
    534    FILE *fp = state->fp;
    535    fprintf(fp, ".%s", glsl_get_struct_elem_name(parent_type, deref->index));
    536 }
    537 
    538 static void
    539 print_deref(nir_deref_var *deref, print_state *state)
    540 {
    541    nir_deref *tail = &deref->deref;
    542    nir_deref *pretail = NULL;
    543    while (tail != NULL) {
    544       switch (tail->deref_type) {
    545       case nir_deref_type_var:
    546          assert(pretail == NULL);
    547          assert(tail == &deref->deref);
    548          print_deref_var(deref, state);
    549          break;
    550 
    551       case nir_deref_type_array:
    552          assert(pretail != NULL);
    553          print_deref_array(nir_deref_as_array(tail), state);
    554          break;
    555 
    556       case nir_deref_type_struct:
    557          assert(pretail != NULL);
    558          print_deref_struct(nir_deref_as_struct(tail),
    559                             pretail->type, state);
    560          break;
    561 
    562       default:
    563          unreachable("Invalid deref type");
    564       }
    565 
    566       pretail = tail;
    567       tail = pretail->child;
    568    }
    569 }
    570 
    571 static void
    572 print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
    573 {
    574    const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic];
    575    unsigned num_srcs = info->num_srcs;
    576    FILE *fp = state->fp;
    577 
    578    if (info->has_dest) {
    579       print_dest(&instr->dest, state);
    580       fprintf(fp, " = ");
    581    }
    582 
    583    fprintf(fp, "intrinsic %s (", info->name);
    584 
    585    for (unsigned i = 0; i < num_srcs; i++) {
    586       if (i != 0)
    587          fprintf(fp, ", ");
    588 
    589       print_src(&instr->src[i], state);
    590    }
    591 
    592    fprintf(fp, ") (");
    593 
    594    for (unsigned i = 0; i < info->num_variables; i++) {
    595       if (i != 0)
    596          fprintf(fp, ", ");
    597 
    598       print_deref(instr->variables[i], state);
    599    }
    600 
    601    fprintf(fp, ") (");
    602 
    603    for (unsigned i = 0; i < info->num_indices; i++) {
    604       if (i != 0)
    605          fprintf(fp, ", ");
    606 
    607       fprintf(fp, "%d", instr->const_index[i]);
    608    }
    609 
    610    fprintf(fp, ")");
    611 
    612    static const char *index_name[NIR_INTRINSIC_NUM_INDEX_FLAGS] = {
    613       [NIR_INTRINSIC_BASE] = "base",
    614       [NIR_INTRINSIC_WRMASK] = "wrmask",
    615       [NIR_INTRINSIC_STREAM_ID] = "stream-id",
    616       [NIR_INTRINSIC_UCP_ID] = "ucp-id",
    617       [NIR_INTRINSIC_RANGE] = "range",
    618       [NIR_INTRINSIC_DESC_SET] = "desc-set",
    619       [NIR_INTRINSIC_BINDING] = "binding",
    620       [NIR_INTRINSIC_COMPONENT] = "component",
    621       [NIR_INTRINSIC_INTERP_MODE] = "interp_mode",
    622    };
    623    for (unsigned idx = 1; idx < NIR_INTRINSIC_NUM_INDEX_FLAGS; idx++) {
    624       if (!info->index_map[idx])
    625          continue;
    626       fprintf(fp, " /*");
    627       if (idx == NIR_INTRINSIC_WRMASK) {
    628          /* special case wrmask to show it as a writemask.. */
    629          unsigned wrmask = nir_intrinsic_write_mask(instr);
    630          fprintf(fp, " wrmask=");
    631          for (unsigned i = 0; i < 4; i++)
    632             if ((wrmask >> i) & 1)
    633                fprintf(fp, "%c", "xyzw"[i]);
    634       } else {
    635          unsigned off = info->index_map[idx] - 1;
    636          assert(index_name[idx]);  /* forgot to update index_name table? */
    637          fprintf(fp, " %s=%d", index_name[idx], instr->const_index[off]);
    638       }
    639       fprintf(fp, " */");
    640    }
    641 
    642    if (!state->shader)
    643       return;
    644 
    645    struct exec_list *var_list = NULL;
    646 
    647    switch (instr->intrinsic) {
    648    case nir_intrinsic_load_uniform:
    649       var_list = &state->shader->uniforms;
    650       break;
    651    case nir_intrinsic_load_input:
    652    case nir_intrinsic_load_per_vertex_input:
    653       var_list = &state->shader->inputs;
    654       break;
    655    case nir_intrinsic_load_output:
    656    case nir_intrinsic_store_output:
    657    case nir_intrinsic_store_per_vertex_output:
    658       var_list = &state->shader->outputs;
    659       break;
    660    default:
    661       return;
    662    }
    663 
    664    nir_foreach_variable(var, var_list) {
    665       if ((var->data.driver_location == nir_intrinsic_base(instr)) &&
    666           (instr->intrinsic == nir_intrinsic_load_uniform ||
    667            var->data.location_frac == nir_intrinsic_component(instr)) &&
    668           var->name) {
    669          fprintf(fp, "\t/* %s */", var->name);
    670          break;
    671       }
    672    }
    673 }
    674 
    675 static void
    676 print_tex_instr(nir_tex_instr *instr, print_state *state)
    677 {
    678    FILE *fp = state->fp;
    679 
    680    print_dest(&instr->dest, state);
    681 
    682    fprintf(fp, " = ");
    683 
    684    switch (instr->op) {
    685    case nir_texop_tex:
    686       fprintf(fp, "tex ");
    687       break;
    688    case nir_texop_txb:
    689       fprintf(fp, "txb ");
    690       break;
    691    case nir_texop_txl:
    692       fprintf(fp, "txl ");
    693       break;
    694    case nir_texop_txd:
    695       fprintf(fp, "txd ");
    696       break;
    697    case nir_texop_txf:
    698       fprintf(fp, "txf ");
    699       break;
    700    case nir_texop_txf_ms:
    701       fprintf(fp, "txf_ms ");
    702       break;
    703    case nir_texop_txf_ms_mcs:
    704       fprintf(fp, "txf_ms_mcs ");
    705       break;
    706    case nir_texop_txs:
    707       fprintf(fp, "txs ");
    708       break;
    709    case nir_texop_lod:
    710       fprintf(fp, "lod ");
    711       break;
    712    case nir_texop_tg4:
    713       fprintf(fp, "tg4 ");
    714       break;
    715    case nir_texop_query_levels:
    716       fprintf(fp, "query_levels ");
    717       break;
    718    case nir_texop_texture_samples:
    719       fprintf(fp, "texture_samples ");
    720       break;
    721    case nir_texop_samples_identical:
    722       fprintf(fp, "samples_identical ");
    723       break;
    724    default:
    725       unreachable("Invalid texture operation");
    726       break;
    727    }
    728 
    729    for (unsigned i = 0; i < instr->num_srcs; i++) {
    730       print_src(&instr->src[i].src, state);
    731 
    732       fprintf(fp, " ");
    733 
    734       switch(instr->src[i].src_type) {
    735       case nir_tex_src_coord:
    736          fprintf(fp, "(coord)");
    737          break;
    738       case nir_tex_src_projector:
    739          fprintf(fp, "(projector)");
    740          break;
    741       case nir_tex_src_comparator:
    742          fprintf(fp, "(comparator)");
    743          break;
    744       case nir_tex_src_offset:
    745          fprintf(fp, "(offset)");
    746          break;
    747       case nir_tex_src_bias:
    748          fprintf(fp, "(bias)");
    749          break;
    750       case nir_tex_src_lod:
    751          fprintf(fp, "(lod)");
    752          break;
    753       case nir_tex_src_ms_index:
    754          fprintf(fp, "(ms_index)");
    755          break;
    756       case nir_tex_src_ms_mcs:
    757          fprintf(fp, "(ms_mcs)");
    758          break;
    759       case nir_tex_src_ddx:
    760          fprintf(fp, "(ddx)");
    761          break;
    762       case nir_tex_src_ddy:
    763          fprintf(fp, "(ddy)");
    764          break;
    765       case nir_tex_src_texture_offset:
    766          fprintf(fp, "(texture_offset)");
    767          break;
    768       case nir_tex_src_sampler_offset:
    769          fprintf(fp, "(sampler_offset)");
    770          break;
    771       case nir_tex_src_plane:
    772          fprintf(fp, "(plane)");
    773          break;
    774 
    775       default:
    776          unreachable("Invalid texture source type");
    777          break;
    778       }
    779 
    780       fprintf(fp, ", ");
    781    }
    782 
    783    if (instr->op == nir_texop_tg4) {
    784       fprintf(fp, "%u (gather_component), ", instr->component);
    785    }
    786 
    787    if (instr->texture) {
    788       print_deref(instr->texture, state);
    789       fprintf(fp, " (texture)");
    790       if (instr->sampler) {
    791          print_deref(instr->sampler, state);
    792          fprintf(fp, " (sampler)");
    793       }
    794    } else {
    795       assert(instr->sampler == NULL);
    796       fprintf(fp, "%u (texture) %u (sampler)",
    797               instr->texture_index, instr->sampler_index);
    798    }
    799 }
    800 
    801 static void
    802 print_call_instr(nir_call_instr *instr, print_state *state)
    803 {
    804    FILE *fp = state->fp;
    805 
    806    fprintf(fp, "call %s ", instr->callee->name);
    807 
    808    for (unsigned i = 0; i < instr->num_params; i++) {
    809       if (i != 0)
    810          fprintf(fp, ", ");
    811 
    812       print_deref(instr->params[i], state);
    813    }
    814 
    815    if (instr->return_deref != NULL) {
    816       if (instr->num_params != 0)
    817          fprintf(fp, ", ");
    818       fprintf(fp, "returning ");
    819       print_deref(instr->return_deref, state);
    820    }
    821 }
    822 
    823 static void
    824 print_load_const_instr(nir_load_const_instr *instr, print_state *state)
    825 {
    826    FILE *fp = state->fp;
    827 
    828    print_ssa_def(&instr->def, state);
    829 
    830    fprintf(fp, " = load_const (");
    831 
    832    for (unsigned i = 0; i < instr->def.num_components; i++) {
    833       if (i != 0)
    834          fprintf(fp, ", ");
    835 
    836       /*
    837        * we don't really know the type of the constant (if it will be used as a
    838        * float or an int), so just print the raw constant in hex for fidelity
    839        * and then print the float in a comment for readability.
    840        */
    841 
    842       if (instr->def.bit_size == 64)
    843          fprintf(fp, "0x%16" PRIx64 " /* %f */", instr->value.u64[i],
    844                  instr->value.f64[i]);
    845       else
    846          fprintf(fp, "0x%08x /* %f */", instr->value.u32[i], instr->value.f32[i]);
    847    }
    848 
    849    fprintf(fp, ")");
    850 }
    851 
    852 static void
    853 print_jump_instr(nir_jump_instr *instr, print_state *state)
    854 {
    855    FILE *fp = state->fp;
    856 
    857    switch (instr->type) {
    858    case nir_jump_break:
    859       fprintf(fp, "break");
    860       break;
    861 
    862    case nir_jump_continue:
    863       fprintf(fp, "continue");
    864       break;
    865 
    866    case nir_jump_return:
    867       fprintf(fp, "return");
    868       break;
    869    }
    870 }
    871 
    872 static void
    873 print_ssa_undef_instr(nir_ssa_undef_instr* instr, print_state *state)
    874 {
    875    FILE *fp = state->fp;
    876    print_ssa_def(&instr->def, state);
    877    fprintf(fp, " = undefined");
    878 }
    879 
    880 static void
    881 print_phi_instr(nir_phi_instr *instr, print_state *state)
    882 {
    883    FILE *fp = state->fp;
    884    print_dest(&instr->dest, state);
    885    fprintf(fp, " = phi ");
    886    nir_foreach_phi_src(src, instr) {
    887       if (&src->node != exec_list_get_head(&instr->srcs))
    888          fprintf(fp, ", ");
    889 
    890       fprintf(fp, "block_%u: ", src->pred->index);
    891       print_src(&src->src, state);
    892    }
    893 }
    894 
    895 static void
    896 print_parallel_copy_instr(nir_parallel_copy_instr *instr, print_state *state)
    897 {
    898    FILE *fp = state->fp;
    899    nir_foreach_parallel_copy_entry(entry, instr) {
    900       if (&entry->node != exec_list_get_head(&instr->entries))
    901          fprintf(fp, "; ");
    902 
    903       print_dest(&entry->dest, state);
    904       fprintf(fp, " = ");
    905       print_src(&entry->src, state);
    906    }
    907 }
    908 
    909 static void
    910 print_instr(const nir_instr *instr, print_state *state, unsigned tabs)
    911 {
    912    FILE *fp = state->fp;
    913    print_tabs(tabs, fp);
    914 
    915    switch (instr->type) {
    916    case nir_instr_type_alu:
    917       print_alu_instr(nir_instr_as_alu(instr), state);
    918       break;
    919 
    920    case nir_instr_type_call:
    921       print_call_instr(nir_instr_as_call(instr), state);
    922       break;
    923 
    924    case nir_instr_type_intrinsic:
    925       print_intrinsic_instr(nir_instr_as_intrinsic(instr), state);
    926       break;
    927 
    928    case nir_instr_type_tex:
    929       print_tex_instr(nir_instr_as_tex(instr), state);
    930       break;
    931 
    932    case nir_instr_type_load_const:
    933       print_load_const_instr(nir_instr_as_load_const(instr), state);
    934       break;
    935 
    936    case nir_instr_type_jump:
    937       print_jump_instr(nir_instr_as_jump(instr), state);
    938       break;
    939 
    940    case nir_instr_type_ssa_undef:
    941       print_ssa_undef_instr(nir_instr_as_ssa_undef(instr), state);
    942       break;
    943 
    944    case nir_instr_type_phi:
    945       print_phi_instr(nir_instr_as_phi(instr), state);
    946       break;
    947 
    948    case nir_instr_type_parallel_copy:
    949       print_parallel_copy_instr(nir_instr_as_parallel_copy(instr), state);
    950       break;
    951 
    952    default:
    953       unreachable("Invalid instruction type");
    954       break;
    955    }
    956 }
    957 
    958 static int
    959 compare_block_index(const void *p1, const void *p2)
    960 {
    961    const nir_block *block1 = *((const nir_block **) p1);
    962    const nir_block *block2 = *((const nir_block **) p2);
    963 
    964    return (int) block1->index - (int) block2->index;
    965 }
    966 
    967 static void print_cf_node(nir_cf_node *node, print_state *state,
    968                           unsigned tabs);
    969 
    970 static void
    971 print_block(nir_block *block, print_state *state, unsigned tabs)
    972 {
    973    FILE *fp = state->fp;
    974 
    975    print_tabs(tabs, fp);
    976    fprintf(fp, "block block_%u:\n", block->index);
    977 
    978    /* sort the predecessors by index so we consistently print the same thing */
    979 
    980    nir_block **preds =
    981       malloc(block->predecessors->entries * sizeof(nir_block *));
    982 
    983    struct set_entry *entry;
    984    unsigned i = 0;
    985    set_foreach(block->predecessors, entry) {
    986       preds[i++] = (nir_block *) entry->key;
    987    }
    988 
    989    qsort(preds, block->predecessors->entries, sizeof(nir_block *),
    990          compare_block_index);
    991 
    992    print_tabs(tabs, fp);
    993    fprintf(fp, "/* preds: ");
    994    for (unsigned i = 0; i < block->predecessors->entries; i++) {
    995       fprintf(fp, "block_%u ", preds[i]->index);
    996    }
    997    fprintf(fp, "*/\n");
    998 
    999    free(preds);
   1000 
   1001    nir_foreach_instr(instr, block) {
   1002       print_instr(instr, state, tabs);
   1003       fprintf(fp, "\n");
   1004       print_annotation(state, instr);
   1005    }
   1006 
   1007    print_tabs(tabs, fp);
   1008    fprintf(fp, "/* succs: ");
   1009    for (unsigned i = 0; i < 2; i++)
   1010       if (block->successors[i]) {
   1011          fprintf(fp, "block_%u ", block->successors[i]->index);
   1012       }
   1013    fprintf(fp, "*/\n");
   1014 }
   1015 
   1016 static void
   1017 print_if(nir_if *if_stmt, print_state *state, unsigned tabs)
   1018 {
   1019    FILE *fp = state->fp;
   1020 
   1021    print_tabs(tabs, fp);
   1022    fprintf(fp, "if ");
   1023    print_src(&if_stmt->condition, state);
   1024    fprintf(fp, " {\n");
   1025    foreach_list_typed(nir_cf_node, node, node, &if_stmt->then_list) {
   1026       print_cf_node(node, state, tabs + 1);
   1027    }
   1028    print_tabs(tabs, fp);
   1029    fprintf(fp, "} else {\n");
   1030    foreach_list_typed(nir_cf_node, node, node, &if_stmt->else_list) {
   1031       print_cf_node(node, state, tabs + 1);
   1032    }
   1033    print_tabs(tabs, fp);
   1034    fprintf(fp, "}\n");
   1035 }
   1036 
   1037 static void
   1038 print_loop(nir_loop *loop, print_state *state, unsigned tabs)
   1039 {
   1040    FILE *fp = state->fp;
   1041 
   1042    print_tabs(tabs, fp);
   1043    fprintf(fp, "loop {\n");
   1044    foreach_list_typed(nir_cf_node, node, node, &loop->body) {
   1045       print_cf_node(node, state, tabs + 1);
   1046    }
   1047    print_tabs(tabs, fp);
   1048    fprintf(fp, "}\n");
   1049 }
   1050 
   1051 static void
   1052 print_cf_node(nir_cf_node *node, print_state *state, unsigned int tabs)
   1053 {
   1054    switch (node->type) {
   1055    case nir_cf_node_block:
   1056       print_block(nir_cf_node_as_block(node), state, tabs);
   1057       break;
   1058 
   1059    case nir_cf_node_if:
   1060       print_if(nir_cf_node_as_if(node), state, tabs);
   1061       break;
   1062 
   1063    case nir_cf_node_loop:
   1064       print_loop(nir_cf_node_as_loop(node), state, tabs);
   1065       break;
   1066 
   1067    default:
   1068       unreachable("Invalid CFG node type");
   1069    }
   1070 }
   1071 
   1072 static void
   1073 print_function_impl(nir_function_impl *impl, print_state *state)
   1074 {
   1075    FILE *fp = state->fp;
   1076 
   1077    fprintf(fp, "\nimpl %s ", impl->function->name);
   1078 
   1079    for (unsigned i = 0; i < impl->num_params; i++) {
   1080       if (i != 0)
   1081          fprintf(fp, ", ");
   1082 
   1083       print_arg(impl->params[i], state);
   1084    }
   1085 
   1086    if (impl->return_var != NULL) {
   1087       if (impl->num_params != 0)
   1088          fprintf(fp, ", ");
   1089       fprintf(fp, "returning ");
   1090       print_arg(impl->return_var, state);
   1091    }
   1092 
   1093    fprintf(fp, "{\n");
   1094 
   1095    nir_foreach_variable(var, &impl->locals) {
   1096       fprintf(fp, "\t");
   1097       print_var_decl(var, state);
   1098    }
   1099 
   1100    foreach_list_typed(nir_register, reg, node, &impl->registers) {
   1101       fprintf(fp, "\t");
   1102       print_register_decl(reg, state);
   1103    }
   1104 
   1105    nir_index_blocks(impl);
   1106 
   1107    foreach_list_typed(nir_cf_node, node, node, &impl->body) {
   1108       print_cf_node(node, state, 1);
   1109    }
   1110 
   1111    fprintf(fp, "\tblock block_%u:\n}\n\n", impl->end_block->index);
   1112 }
   1113 
   1114 static void
   1115 print_function(nir_function *function, print_state *state)
   1116 {
   1117    FILE *fp = state->fp;
   1118 
   1119    fprintf(fp, "decl_function %s ", function->name);
   1120 
   1121    for (unsigned i = 0; i < function->num_params; i++) {
   1122       if (i != 0)
   1123          fprintf(fp, ", ");
   1124 
   1125       switch (function->params[i].param_type) {
   1126       case nir_parameter_in:
   1127          fprintf(fp, "in ");
   1128          break;
   1129       case nir_parameter_out:
   1130          fprintf(fp, "out ");
   1131          break;
   1132       case nir_parameter_inout:
   1133          fprintf(fp, "inout ");
   1134          break;
   1135       default:
   1136          unreachable("Invalid parameter type");
   1137       }
   1138 
   1139       fprintf(fp, "%s", glsl_get_type_name(function->params[i].type));
   1140    }
   1141 
   1142    if (function->return_type != NULL) {
   1143       if (function->num_params != 0)
   1144          fprintf(fp, ", ");
   1145       fprintf(fp, "returning %s", glsl_get_type_name(function->return_type));
   1146    }
   1147 
   1148    fprintf(fp, "\n");
   1149 
   1150    if (function->impl != NULL) {
   1151       print_function_impl(function->impl, state);
   1152       return;
   1153    }
   1154 }
   1155 
   1156 static void
   1157 init_print_state(print_state *state, nir_shader *shader, FILE *fp)
   1158 {
   1159    state->fp = fp;
   1160    state->shader = shader;
   1161    state->ht = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
   1162                                        _mesa_key_pointer_equal);
   1163    state->syms = _mesa_set_create(NULL, _mesa_key_hash_string,
   1164                                   _mesa_key_string_equal);
   1165    state->index = 0;
   1166 }
   1167 
   1168 static void
   1169 destroy_print_state(print_state *state)
   1170 {
   1171    _mesa_hash_table_destroy(state->ht, NULL);
   1172    _mesa_set_destroy(state->syms, NULL);
   1173 }
   1174 
   1175 void
   1176 nir_print_shader_annotated(nir_shader *shader, FILE *fp,
   1177                            struct hash_table *annotations)
   1178 {
   1179    print_state state;
   1180    init_print_state(&state, shader, fp);
   1181 
   1182    state.annotations = annotations;
   1183 
   1184    fprintf(fp, "shader: %s\n", gl_shader_stage_name(shader->info.stage));
   1185 
   1186    if (shader->info.name)
   1187       fprintf(fp, "name: %s\n", shader->info.name);
   1188 
   1189    if (shader->info.label)
   1190       fprintf(fp, "label: %s\n", shader->info.label);
   1191 
   1192    switch (shader->info.stage) {
   1193    case MESA_SHADER_COMPUTE:
   1194       fprintf(fp, "local-size: %u, %u, %u%s\n",
   1195               shader->info.cs.local_size[0],
   1196               shader->info.cs.local_size[1],
   1197               shader->info.cs.local_size[2],
   1198               shader->info.cs.local_size_variable ? " (variable)" : "");
   1199       fprintf(fp, "shared-size: %u\n", shader->info.cs.shared_size);
   1200       break;
   1201    default:
   1202       break;
   1203    }
   1204 
   1205    fprintf(fp, "inputs: %u\n", shader->num_inputs);
   1206    fprintf(fp, "outputs: %u\n", shader->num_outputs);
   1207    fprintf(fp, "uniforms: %u\n", shader->num_uniforms);
   1208    fprintf(fp, "shared: %u\n", shader->num_shared);
   1209 
   1210    nir_foreach_variable(var, &shader->uniforms) {
   1211       print_var_decl(var, &state);
   1212    }
   1213 
   1214    nir_foreach_variable(var, &shader->inputs) {
   1215       print_var_decl(var, &state);
   1216    }
   1217 
   1218    nir_foreach_variable(var, &shader->outputs) {
   1219       print_var_decl(var, &state);
   1220    }
   1221 
   1222    nir_foreach_variable(var, &shader->shared) {
   1223       print_var_decl(var, &state);
   1224    }
   1225 
   1226    nir_foreach_variable(var, &shader->globals) {
   1227       print_var_decl(var, &state);
   1228    }
   1229 
   1230    nir_foreach_variable(var, &shader->system_values) {
   1231       print_var_decl(var, &state);
   1232    }
   1233 
   1234    foreach_list_typed(nir_register, reg, node, &shader->registers) {
   1235       print_register_decl(reg, &state);
   1236    }
   1237 
   1238    foreach_list_typed(nir_function, func, node, &shader->functions) {
   1239       print_function(func, &state);
   1240    }
   1241 
   1242    destroy_print_state(&state);
   1243 }
   1244 
   1245 void
   1246 nir_print_shader(nir_shader *shader, FILE *fp)
   1247 {
   1248    nir_print_shader_annotated(shader, fp, NULL);
   1249 }
   1250 
   1251 void
   1252 nir_print_instr(const nir_instr *instr, FILE *fp)
   1253 {
   1254    print_state state = {
   1255       .fp = fp,
   1256    };
   1257    print_instr(instr, &state, 0);
   1258 
   1259 }
   1260