Home | History | Annotate | Download | only in core
      1 /*
      2  * Mesa 3-D graphics library
      3  *
      4  * Copyright (C) 2014 LunarG, Inc.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included
     14  * in all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     22  * DEALINGS IN THE SOFTWARE.
     23  *
     24  * Authors:
     25  *    Chia-I Wu <olv (at) lunarg.com>
     26  */
     27 
     28 #include <stdio.h>
     29 #include <stdarg.h>
     30 #include "genhw/genhw.h"
     31 #include "../shader/toy_compiler.h"
     32 
     33 #include "intel_winsys.h"
     34 #include "ilo_builder.h"
     35 
     36 static const uint32_t *
     37 writer_pointer(const struct ilo_builder *builder,
     38                enum ilo_builder_writer_type which,
     39                unsigned offset)
     40 {
     41    const struct ilo_builder_writer *writer = &builder->writers[which];
     42    return (const uint32_t *) ((const char *) writer->ptr + offset);
     43 }
     44 
     45 static uint32_t _util_printf_format(5, 6)
     46 writer_dw(const struct ilo_builder *builder,
     47           enum ilo_builder_writer_type which,
     48           unsigned offset, unsigned dw_index,
     49           const char *format, ...)
     50 {
     51    const uint32_t *dw = writer_pointer(builder, which, offset);
     52    va_list ap;
     53    char desc[16];
     54    int len;
     55 
     56    ilo_printf("0x%08x:      0x%08x: ",
     57          offset + (dw_index << 2), dw[dw_index]);
     58 
     59    va_start(ap, format);
     60    len = vsnprintf(desc, sizeof(desc), format, ap);
     61    va_end(ap);
     62 
     63    if (len >= sizeof(desc)) {
     64       len = sizeof(desc) - 1;
     65       desc[len] = '\0';
     66    }
     67 
     68    if (desc[len - 1] == '\n') {
     69       desc[len - 1] = '\0';
     70       ilo_printf("%8s: \n", desc);
     71    } else {
     72       ilo_printf("%8s: ", desc);
     73    }
     74 
     75    return dw[dw_index];
     76 }
     77 
     78 static void
     79 writer_decode_blob(const struct ilo_builder *builder,
     80                    enum ilo_builder_writer_type which,
     81                    const struct ilo_builder_item *item)
     82 {
     83    const unsigned state_size = sizeof(uint32_t);
     84    const unsigned count = item->size / state_size;
     85    unsigned offset = item->offset;
     86    unsigned i;
     87 
     88    for (i = 0; i < count; i += 4) {
     89       const uint32_t *dw = writer_pointer(builder, which, offset);
     90 
     91       writer_dw(builder, which, offset, 0, "BLOB%d", i / 4);
     92 
     93       switch (count - i) {
     94       case 1:
     95          ilo_printf("(%10.4f, %10c, %10c, %10c) "
     96                     "(0x%08x, %10c, %10c, %10c)\n",
     97                     uif(dw[0]), 'X', 'X', 'X',
     98                         dw[0],  'X', 'X', 'X');
     99          break;
    100       case 2:
    101          ilo_printf("(%10.4f, %10.4f, %10c, %10c) "
    102                     "(0x%08x, 0x%08x, %10c, %10c)\n",
    103                     uif(dw[0]), uif(dw[1]), 'X', 'X',
    104                         dw[0],      dw[1],  'X', 'X');
    105          break;
    106       case 3:
    107          ilo_printf("(%10.4f, %10.4f, %10.4f, %10c) "
    108                     "(0x%08x, 0x%08x, 0x%08x, %10c)\n",
    109                     uif(dw[0]), uif(dw[1]), uif(dw[2]), 'X',
    110                         dw[0],      dw[1],      dw[2],  'X');
    111          break;
    112       default:
    113          ilo_printf("(%10.4f, %10.4f, %10.4f, %10.4f) "
    114                     "(0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
    115                     uif(dw[0]), uif(dw[1]), uif(dw[2]), uif(dw[3]),
    116                         dw[0],      dw[1],      dw[2],      dw[3]);
    117          break;
    118       }
    119 
    120       offset += state_size * 4;
    121    }
    122 }
    123 
    124 static void
    125 writer_decode_clip_viewport(const struct ilo_builder *builder,
    126                             enum ilo_builder_writer_type which,
    127                             const struct ilo_builder_item *item)
    128 {
    129    const unsigned state_size = sizeof(uint32_t) * 4;
    130    const unsigned count = item->size / state_size;
    131    unsigned offset = item->offset;
    132    unsigned i;
    133 
    134    for (i = 0; i < count; i++) {
    135       uint32_t dw;
    136 
    137       dw = writer_dw(builder, which, offset, 0, "CLIP VP%d", i);
    138       ilo_printf("xmin = %f\n", uif(dw));
    139 
    140       dw = writer_dw(builder, which, offset, 1, "CLIP VP%d", i);
    141       ilo_printf("xmax = %f\n", uif(dw));
    142 
    143       dw = writer_dw(builder, which, offset, 2, "CLIP VP%d", i);
    144       ilo_printf("ymin = %f\n", uif(dw));
    145 
    146       dw = writer_dw(builder, which, offset, 3, "CLIP VP%d", i);
    147       ilo_printf("ymax = %f\n", uif(dw));
    148 
    149       offset += state_size;
    150    }
    151 }
    152 
    153 static void
    154 writer_decode_sf_clip_viewport_gen7(const struct ilo_builder *builder,
    155                                     enum ilo_builder_writer_type which,
    156                                     const struct ilo_builder_item *item)
    157 {
    158    const unsigned state_size = sizeof(uint32_t) * 16;
    159    const unsigned count = item->size / state_size;
    160    unsigned offset = item->offset;
    161    unsigned i;
    162 
    163    for (i = 0; i < count; i++) {
    164       uint32_t dw;
    165 
    166       dw = writer_dw(builder, which, offset, 0, "SF_CLIP VP%d", i);
    167       ilo_printf("m00 = %f\n", uif(dw));
    168 
    169       dw = writer_dw(builder, which, offset, 1, "SF_CLIP VP%d", i);
    170       ilo_printf("m11 = %f\n", uif(dw));
    171 
    172       dw = writer_dw(builder, which, offset, 2, "SF_CLIP VP%d", i);
    173       ilo_printf("m22 = %f\n", uif(dw));
    174 
    175       dw = writer_dw(builder, which, offset, 3, "SF_CLIP VP%d", i);
    176       ilo_printf("m30 = %f\n", uif(dw));
    177 
    178       dw = writer_dw(builder, which, offset, 4, "SF_CLIP VP%d", i);
    179       ilo_printf("m31 = %f\n", uif(dw));
    180 
    181       dw = writer_dw(builder, which, offset, 5, "SF_CLIP VP%d", i);
    182       ilo_printf("m32 = %f\n", uif(dw));
    183 
    184       dw = writer_dw(builder, which, offset, 8, "SF_CLIP VP%d", i);
    185       ilo_printf("guardband xmin = %f\n", uif(dw));
    186 
    187       dw = writer_dw(builder, which, offset, 9, "SF_CLIP VP%d", i);
    188       ilo_printf("guardband xmax = %f\n", uif(dw));
    189 
    190       dw = writer_dw(builder, which, offset, 10, "SF_CLIP VP%d", i);
    191       ilo_printf("guardband ymin = %f\n", uif(dw));
    192 
    193       dw = writer_dw(builder, which, offset, 11, "SF_CLIP VP%d", i);
    194       ilo_printf("guardband ymax = %f\n", uif(dw));
    195 
    196       if (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) {
    197          dw = writer_dw(builder, which, offset, 12, "SF_CLIP VP%d", i);
    198          ilo_printf("extent xmin = %f\n", uif(dw));
    199 
    200          dw = writer_dw(builder, which, offset, 13, "SF_CLIP VP%d", i);
    201          ilo_printf("extent xmax = %f\n", uif(dw));
    202 
    203          dw = writer_dw(builder, which, offset, 14, "SF_CLIP VP%d", i);
    204          ilo_printf("extent ymin = %f\n", uif(dw));
    205 
    206          dw = writer_dw(builder, which, offset, 15, "SF_CLIP VP%d", i);
    207          ilo_printf("extent ymax = %f\n", uif(dw));
    208       }
    209 
    210       offset += state_size;
    211    }
    212 }
    213 
    214 static void
    215 writer_decode_sf_viewport_gen6(const struct ilo_builder *builder,
    216                                enum ilo_builder_writer_type which,
    217                                const struct ilo_builder_item *item)
    218 {
    219    const unsigned state_size = sizeof(uint32_t) * 8;
    220    const unsigned count = item->size / state_size;
    221    unsigned offset = item->offset;
    222    unsigned i;
    223 
    224    for (i = 0; i < count; i++) {
    225       uint32_t dw;
    226 
    227       dw = writer_dw(builder, which, offset, 0, "SF VP%d", i);
    228       ilo_printf("m00 = %f\n", uif(dw));
    229 
    230       dw = writer_dw(builder, which, offset, 1, "SF VP%d", i);
    231       ilo_printf("m11 = %f\n", uif(dw));
    232 
    233       dw = writer_dw(builder, which, offset, 2, "SF VP%d", i);
    234       ilo_printf("m22 = %f\n", uif(dw));
    235 
    236       dw = writer_dw(builder, which, offset, 3, "SF VP%d", i);
    237       ilo_printf("m30 = %f\n", uif(dw));
    238 
    239       dw = writer_dw(builder, which, offset, 4, "SF VP%d", i);
    240       ilo_printf("m31 = %f\n", uif(dw));
    241 
    242       dw = writer_dw(builder, which, offset, 5, "SF VP%d", i);
    243       ilo_printf("m32 = %f\n", uif(dw));
    244 
    245       offset += state_size;
    246    }
    247 }
    248 
    249 static void
    250 writer_decode_sf_viewport(const struct ilo_builder *builder,
    251                           enum ilo_builder_writer_type which,
    252                           const struct ilo_builder_item *item)
    253 {
    254    if (ilo_dev_gen(builder->dev) >= ILO_GEN(7))
    255       writer_decode_sf_clip_viewport_gen7(builder, which, item);
    256    else
    257       writer_decode_sf_viewport_gen6(builder, which, item);
    258 }
    259 
    260 static void
    261 writer_decode_scissor_rect(const struct ilo_builder *builder,
    262                            enum ilo_builder_writer_type which,
    263                            const struct ilo_builder_item *item)
    264 {
    265    const unsigned state_size = sizeof(uint32_t) * 2;
    266    const unsigned count = item->size / state_size;
    267    unsigned offset = item->offset;
    268    unsigned i;
    269 
    270    for (i = 0; i < count; i++) {
    271       uint32_t dw;
    272 
    273       dw = writer_dw(builder, which, offset, 0, "SCISSOR%d", i);
    274       ilo_printf("xmin %d, ymin %d\n",
    275             GEN_EXTRACT(dw, GEN6_SCISSOR_DW0_MIN_X),
    276             GEN_EXTRACT(dw, GEN6_SCISSOR_DW0_MIN_Y));
    277 
    278       dw = writer_dw(builder, which, offset, 1, "SCISSOR%d", i);
    279       ilo_printf("xmax %d, ymax %d\n",
    280             GEN_EXTRACT(dw, GEN6_SCISSOR_DW1_MAX_X),
    281             GEN_EXTRACT(dw, GEN6_SCISSOR_DW1_MAX_Y));
    282 
    283       offset += state_size;
    284    }
    285 }
    286 
    287 static void
    288 writer_decode_cc_viewport(const struct ilo_builder *builder,
    289                           enum ilo_builder_writer_type which,
    290                           const struct ilo_builder_item *item)
    291 {
    292    const unsigned state_size = sizeof(uint32_t) * 2;
    293    const unsigned count = item->size / state_size;
    294    unsigned offset = item->offset;
    295    unsigned i;
    296 
    297    for (i = 0; i < count; i++) {
    298       uint32_t dw;
    299 
    300       dw = writer_dw(builder, which, offset, 0, "CC VP%d", i);
    301       ilo_printf("min_depth = %f\n", uif(dw));
    302 
    303       dw = writer_dw(builder, which, offset, 1, "CC VP%d", i);
    304       ilo_printf("max_depth = %f\n", uif(dw));
    305 
    306       offset += state_size;
    307    }
    308 }
    309 
    310 static void
    311 writer_decode_color_calc(const struct ilo_builder *builder,
    312                          enum ilo_builder_writer_type which,
    313                          const struct ilo_builder_item *item)
    314 {
    315    uint32_t dw;
    316 
    317    dw = writer_dw(builder, which, item->offset, 0, "CC");
    318    ilo_printf("alpha test format %s, round disable %d, "
    319               "stencil ref %d, bf stencil ref %d\n",
    320 	      GEN_EXTRACT(dw, GEN6_CC_DW0_ALPHATEST) ? "FLOAT32" : "UNORM8",
    321 	      (bool) (dw & GEN6_CC_DW0_ROUND_DISABLE_DISABLE),
    322 	      GEN_EXTRACT(dw, GEN6_CC_DW0_STENCIL_REF),
    323 	      GEN_EXTRACT(dw, GEN6_CC_DW0_STENCIL1_REF));
    324 
    325    writer_dw(builder, which, item->offset, 1, "CC\n");
    326 
    327    dw = writer_dw(builder, which, item->offset, 2, "CC");
    328    ilo_printf("constant red %f\n", uif(dw));
    329 
    330    dw = writer_dw(builder, which, item->offset, 3, "CC");
    331    ilo_printf("constant green %f\n", uif(dw));
    332 
    333    dw = writer_dw(builder, which, item->offset, 4, "CC");
    334    ilo_printf("constant blue %f\n", uif(dw));
    335 
    336    dw = writer_dw(builder, which, item->offset, 5, "CC");
    337    ilo_printf("constant alpha %f\n", uif(dw));
    338 }
    339 
    340 static void
    341 writer_decode_depth_stencil(const struct ilo_builder *builder,
    342                             enum ilo_builder_writer_type which,
    343                             const struct ilo_builder_item *item)
    344 {
    345    uint32_t dw;
    346 
    347    dw = writer_dw(builder, which, item->offset, 0, "D_S");
    348    ilo_printf("stencil %sable, func %d, write %sable\n",
    349          (dw & GEN6_ZS_DW0_STENCIL_TEST_ENABLE) ? "en" : "dis",
    350          GEN_EXTRACT(dw, GEN6_ZS_DW0_STENCIL_FUNC),
    351          (dw & GEN6_ZS_DW0_STENCIL_WRITE_ENABLE) ? "en" : "dis");
    352 
    353    dw = writer_dw(builder, which, item->offset, 1, "D_S");
    354    ilo_printf("stencil test mask 0x%x, write mask 0x%x\n",
    355          GEN_EXTRACT(dw, GEN6_ZS_DW1_STENCIL_TEST_MASK),
    356          GEN_EXTRACT(dw, GEN6_ZS_DW1_STENCIL_WRITE_MASK));
    357 
    358    dw = writer_dw(builder, which, item->offset, 2, "D_S");
    359    ilo_printf("depth test %sable, func %d, write %sable\n",
    360          (dw & GEN6_ZS_DW2_DEPTH_TEST_ENABLE) ? "en" : "dis",
    361          GEN_EXTRACT(dw, GEN6_ZS_DW2_DEPTH_FUNC),
    362          (dw & GEN6_ZS_DW2_DEPTH_WRITE_ENABLE) ? "en" : "dis");
    363 }
    364 
    365 static void
    366 writer_decode_blend(const struct ilo_builder *builder,
    367                     enum ilo_builder_writer_type which,
    368                     const struct ilo_builder_item *item)
    369 {
    370    const unsigned state_size = sizeof(uint32_t) * 2;
    371    const unsigned count = item->size / state_size;
    372    unsigned offset = item->offset;
    373    unsigned i;
    374 
    375    if (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) {
    376       writer_dw(builder, which, offset, 0, "BLEND\n");
    377       offset += 4;
    378    }
    379 
    380    for (i = 0; i < count; i++) {
    381       writer_dw(builder, which, offset, 0, "BLEND%d\n", i);
    382       writer_dw(builder, which, offset, 1, "BLEND%d\n", i);
    383 
    384       offset += state_size;
    385    }
    386 }
    387 
    388 static void
    389 writer_decode_sampler(const struct ilo_builder *builder,
    390                       enum ilo_builder_writer_type which,
    391                       const struct ilo_builder_item *item)
    392 {
    393    const unsigned state_size = sizeof(uint32_t) * 4;
    394    const unsigned count = item->size / state_size;
    395    unsigned offset = item->offset;
    396    unsigned i;
    397 
    398    for (i = 0; i < count; i++) {
    399       writer_dw(builder, which, offset, 0, "WM SAMP%d", i);
    400       ilo_printf("filtering\n");
    401 
    402       writer_dw(builder, which, offset, 1, "WM SAMP%d", i);
    403       ilo_printf("wrapping, lod\n");
    404 
    405       writer_dw(builder, which, offset, 2, "WM SAMP%d", i);
    406       ilo_printf("default color pointer\n");
    407 
    408       writer_dw(builder, which, offset, 3, "WM SAMP%d", i);
    409       ilo_printf("chroma key, aniso\n");
    410 
    411       offset += state_size;
    412    }
    413 }
    414 
    415 static void
    416 writer_decode_interface_descriptor(const struct ilo_builder *builder,
    417                                    enum ilo_builder_writer_type which,
    418                                    const struct ilo_builder_item *item)
    419 {
    420    const unsigned state_size = sizeof(uint32_t) * 8;
    421    const unsigned count = item->size / state_size;
    422    unsigned offset = item->offset;
    423    unsigned i;
    424 
    425    for (i = 0; i < count; i++) {
    426       writer_dw(builder, which, offset, 0, "IDRT[%d]", i);
    427       ilo_printf("kernel\n");
    428 
    429       writer_dw(builder, which, offset, 1, "IDRT[%d]", i);
    430       ilo_printf("spf, fp mode\n");
    431 
    432       writer_dw(builder, which, offset, 2, "IDRT[%d]", i);
    433       ilo_printf("sampler\n");
    434 
    435       writer_dw(builder, which, offset, 3, "IDRT[%d]", i);
    436       ilo_printf("binding table\n");
    437 
    438       writer_dw(builder, which, offset, 4, "IDRT[%d]", i);
    439       ilo_printf("curbe read len\n");
    440 
    441       writer_dw(builder, which, offset, 5, "IDRT[%d]", i);
    442       ilo_printf("rounding mode, slm size\n");
    443 
    444       writer_dw(builder, which, offset, 6, "IDRT[%d]", i);
    445       ilo_printf("cross-thread curbe read len\n");
    446 
    447       writer_dw(builder, which, offset, 7, "IDRT[%d]", i);
    448       ilo_printf("mbz\n");
    449 
    450       offset += state_size;
    451    }
    452 }
    453 
    454 static void
    455 writer_decode_surface_gen7(const struct ilo_builder *builder,
    456                            enum ilo_builder_writer_type which,
    457                            const struct ilo_builder_item *item)
    458 {
    459    uint32_t dw;
    460 
    461    if (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) {
    462       dw = writer_dw(builder, which, item->offset, 0, "SURF");
    463       ilo_printf("type 0x%x, format 0x%x, tiling %d, %s array\n",
    464             GEN_EXTRACT(dw, GEN7_SURFACE_DW0_TYPE),
    465             GEN_EXTRACT(dw, GEN7_SURFACE_DW0_FORMAT),
    466             GEN_EXTRACT(dw, GEN8_SURFACE_DW0_TILING),
    467             (dw & GEN7_SURFACE_DW0_IS_ARRAY) ? "is" : "not");
    468 
    469       writer_dw(builder, which, item->offset, 1, "SURF");
    470       ilo_printf("qpitch\n");
    471    } else {
    472       dw = writer_dw(builder, which, item->offset, 0, "SURF");
    473       ilo_printf("type 0x%x, format 0x%x, tiling %d, %s array\n",
    474             GEN_EXTRACT(dw, GEN7_SURFACE_DW0_TYPE),
    475             GEN_EXTRACT(dw, GEN7_SURFACE_DW0_FORMAT),
    476             GEN_EXTRACT(dw, GEN7_SURFACE_DW0_TILING),
    477             (dw & GEN7_SURFACE_DW0_IS_ARRAY) ? "is" : "not");
    478 
    479       writer_dw(builder, which, item->offset, 1, "SURF");
    480       ilo_printf("offset\n");
    481    }
    482 
    483    dw = writer_dw(builder, which, item->offset, 2, "SURF");
    484    ilo_printf("%dx%d size\n",
    485          GEN_EXTRACT(dw, GEN7_SURFACE_DW2_WIDTH),
    486          GEN_EXTRACT(dw, GEN7_SURFACE_DW2_HEIGHT));
    487 
    488    dw = writer_dw(builder, which, item->offset, 3, "SURF");
    489    ilo_printf("depth %d, pitch %d\n",
    490          GEN_EXTRACT(dw, GEN7_SURFACE_DW3_DEPTH),
    491          GEN_EXTRACT(dw, GEN7_SURFACE_DW3_PITCH));
    492 
    493    dw = writer_dw(builder, which, item->offset, 4, "SURF");
    494    ilo_printf("min array element %d, array extent %d\n",
    495          GEN_EXTRACT(dw, GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT),
    496          GEN_EXTRACT(dw, GEN7_SURFACE_DW4_RT_VIEW_EXTENT));
    497 
    498    dw = writer_dw(builder, which, item->offset, 5, "SURF");
    499    ilo_printf("mip base %d, mips %d, x,y offset: %d,%d\n",
    500          GEN_EXTRACT(dw, GEN7_SURFACE_DW5_MIN_LOD),
    501          GEN_EXTRACT(dw, GEN7_SURFACE_DW5_MIP_COUNT_LOD),
    502          GEN_EXTRACT(dw, GEN7_SURFACE_DW5_X_OFFSET),
    503          GEN_EXTRACT(dw, GEN7_SURFACE_DW5_Y_OFFSET));
    504 
    505    writer_dw(builder, which, item->offset, 6, "SURF\n");
    506    writer_dw(builder, which, item->offset, 7, "SURF\n");
    507 
    508    if (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) {
    509       writer_dw(builder, which, item->offset, 8, "SURF\n");
    510       writer_dw(builder, which, item->offset, 9, "SURF\n");
    511       writer_dw(builder, which, item->offset, 10, "SURF\n");
    512       writer_dw(builder, which, item->offset, 11, "SURF\n");
    513       writer_dw(builder, which, item->offset, 12, "SURF\n");
    514    }
    515 }
    516 
    517 static void
    518 writer_decode_surface_gen6(const struct ilo_builder *builder,
    519                            enum ilo_builder_writer_type which,
    520                            const struct ilo_builder_item *item)
    521 {
    522    uint32_t dw;
    523 
    524    dw = writer_dw(builder, which, item->offset, 0, "SURF");
    525    ilo_printf("type 0x%x, format 0x%x\n",
    526          GEN_EXTRACT(dw, GEN6_SURFACE_DW0_TYPE),
    527          GEN_EXTRACT(dw, GEN6_SURFACE_DW0_FORMAT));
    528 
    529    writer_dw(builder, which, item->offset, 1, "SURF");
    530    ilo_printf("offset\n");
    531 
    532    dw = writer_dw(builder, which, item->offset, 2, "SURF");
    533    ilo_printf("%dx%d size, %d mips\n",
    534          GEN_EXTRACT(dw, GEN6_SURFACE_DW2_WIDTH),
    535          GEN_EXTRACT(dw, GEN6_SURFACE_DW2_HEIGHT),
    536          GEN_EXTRACT(dw, GEN6_SURFACE_DW2_MIP_COUNT_LOD));
    537 
    538    dw = writer_dw(builder, which, item->offset, 3, "SURF");
    539    ilo_printf("pitch %d, tiling %d\n",
    540          GEN_EXTRACT(dw, GEN6_SURFACE_DW3_PITCH),
    541          GEN_EXTRACT(dw, GEN6_SURFACE_DW3_TILING));
    542 
    543    dw = writer_dw(builder, which, item->offset, 4, "SURF");
    544    ilo_printf("mip base %d\n",
    545          GEN_EXTRACT(dw, GEN6_SURFACE_DW4_MIN_LOD));
    546 
    547    dw = writer_dw(builder, which, item->offset, 5, "SURF");
    548    ilo_printf("x,y offset: %d,%d\n",
    549          GEN_EXTRACT(dw, GEN6_SURFACE_DW5_X_OFFSET),
    550          GEN_EXTRACT(dw, GEN6_SURFACE_DW5_Y_OFFSET));
    551 }
    552 
    553 static void
    554 writer_decode_surface(const struct ilo_builder *builder,
    555                       enum ilo_builder_writer_type which,
    556                       const struct ilo_builder_item *item)
    557 {
    558    if (ilo_dev_gen(builder->dev) >= ILO_GEN(7))
    559       writer_decode_surface_gen7(builder, which, item);
    560    else
    561       writer_decode_surface_gen6(builder, which, item);
    562 }
    563 
    564 static void
    565 writer_decode_binding_table(const struct ilo_builder *builder,
    566                             enum ilo_builder_writer_type which,
    567                             const struct ilo_builder_item *item)
    568 {
    569    const unsigned state_size = sizeof(uint32_t) * 1;
    570    const unsigned count = item->size / state_size;
    571    unsigned offset = item->offset;
    572    unsigned i;
    573 
    574    for (i = 0; i < count; i++) {
    575       writer_dw(builder, which, offset, 0, "BIND");
    576       ilo_printf("BINDING_TABLE_STATE[%d]\n", i);
    577 
    578       offset += state_size;
    579    }
    580 }
    581 
    582 static void
    583 writer_decode_kernel(const struct ilo_builder *builder,
    584                      enum ilo_builder_writer_type which,
    585                      const struct ilo_builder_item *item)
    586 {
    587    const void *kernel;
    588 
    589    ilo_printf("0x%08x:\n", item->offset);
    590    kernel = (const void *) writer_pointer(builder, which, item->offset);
    591    toy_compiler_disassemble(builder->dev, kernel, item->size, true);
    592 }
    593 
    594 static const struct {
    595    void (*func)(const struct ilo_builder *builder,
    596                 enum ilo_builder_writer_type which,
    597                 const struct ilo_builder_item *item);
    598 } writer_decode_table[ILO_BUILDER_ITEM_COUNT] = {
    599    [ILO_BUILDER_ITEM_BLOB]                = { writer_decode_blob },
    600    [ILO_BUILDER_ITEM_CLIP_VIEWPORT]       = { writer_decode_clip_viewport },
    601    [ILO_BUILDER_ITEM_SF_VIEWPORT]         = { writer_decode_sf_viewport },
    602    [ILO_BUILDER_ITEM_SCISSOR_RECT]        = { writer_decode_scissor_rect },
    603    [ILO_BUILDER_ITEM_CC_VIEWPORT]         = { writer_decode_cc_viewport },
    604    [ILO_BUILDER_ITEM_COLOR_CALC]          = { writer_decode_color_calc },
    605    [ILO_BUILDER_ITEM_DEPTH_STENCIL]       = { writer_decode_depth_stencil },
    606    [ILO_BUILDER_ITEM_BLEND]               = { writer_decode_blend },
    607    [ILO_BUILDER_ITEM_SAMPLER]             = { writer_decode_sampler },
    608    [ILO_BUILDER_ITEM_INTERFACE_DESCRIPTOR] = { writer_decode_interface_descriptor },
    609    [ILO_BUILDER_ITEM_SURFACE]             = { writer_decode_surface },
    610    [ILO_BUILDER_ITEM_BINDING_TABLE]       = { writer_decode_binding_table },
    611    [ILO_BUILDER_ITEM_KERNEL]              = { writer_decode_kernel },
    612 };
    613 
    614 static void
    615 ilo_builder_writer_decode_items(struct ilo_builder *builder,
    616                                 enum ilo_builder_writer_type which)
    617 {
    618    struct ilo_builder_writer *writer = &builder->writers[which];
    619    int i;
    620 
    621    if (!writer->item_used)
    622       return;
    623 
    624    writer->ptr = intel_bo_map(writer->bo, false);
    625    if (!writer->ptr)
    626       return;
    627 
    628    for (i = 0; i < writer->item_used; i++) {
    629       const struct ilo_builder_item *item = &writer->items[i];
    630 
    631       writer_decode_table[item->type].func(builder, which, item);
    632    }
    633 
    634    intel_bo_unmap(writer->bo);
    635    writer->ptr = NULL;
    636 }
    637 
    638 static void
    639 ilo_builder_writer_decode(struct ilo_builder *builder,
    640                           enum ilo_builder_writer_type which)
    641 {
    642    struct ilo_builder_writer *writer = &builder->writers[which];
    643 
    644    assert(writer->bo && !writer->ptr);
    645 
    646    switch (which) {
    647    case ILO_BUILDER_WRITER_BATCH:
    648       ilo_printf("decoding batch buffer: %d bytes\n", writer->used);
    649       if (writer->used)
    650          intel_winsys_decode_bo(builder->winsys, writer->bo, writer->used);
    651 
    652       ilo_printf("decoding dynamic/surface buffer: %d states\n",
    653             writer->item_used);
    654       ilo_builder_writer_decode_items(builder, which);
    655       break;
    656    case ILO_BUILDER_WRITER_INSTRUCTION:
    657       if (true) {
    658          ilo_printf("skipping instruction buffer: %d kernels\n",
    659                writer->item_used);
    660       } else {
    661          ilo_printf("decoding instruction buffer: %d kernels\n",
    662                writer->item_used);
    663 
    664          ilo_builder_writer_decode_items(builder, which);
    665       }
    666       break;
    667    default:
    668       break;
    669    }
    670 }
    671 
    672 /**
    673  * Decode the builder according to the recorded items.  This can be called
    674  * only after a successful ilo_builder_end().
    675  */
    676 void
    677 ilo_builder_decode(struct ilo_builder *builder)
    678 {
    679    int i;
    680 
    681    assert(!builder->unrecoverable_error);
    682 
    683    for (i = 0; i < ILO_BUILDER_WRITER_COUNT; i++)
    684       ilo_builder_writer_decode(builder, i);
    685 }
    686