Home | History | Annotate | Download | only in ilo
      1 /*
      2  * Mesa 3-D graphics library
      3  *
      4  * Copyright (C) 2012-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 "core/ilo_builder_3d.h"
     29 #include "core/ilo_builder_media.h"
     30 
     31 #include "ilo_common.h"
     32 #include "ilo_blitter.h"
     33 #include "ilo_shader.h"
     34 #include "ilo_state.h"
     35 #include "ilo_render_gen.h"
     36 
     37 #define DIRTY(state) (session->pipe_dirty & ILO_DIRTY_ ## state)
     38 
     39 static void
     40 gen6_emit_draw_dynamic_viewports(struct ilo_render *r,
     41                                  const struct ilo_state_vector *vec,
     42                                  struct ilo_render_draw_session *session)
     43 {
     44    ILO_DEV_ASSERT(r->dev, 6, 6);
     45 
     46    /* CLIP_VIEWPORT, SF_VIEWPORT, and CC_VIEWPORT */
     47    if ((session->vp_delta.dirty & (ILO_STATE_VIEWPORT_SF_CLIP_VIEWPORT |
     48                                    ILO_STATE_VIEWPORT_CC_VIEWPORT)) ||
     49        r->state_bo_changed) {
     50       r->state.CLIP_VIEWPORT = gen6_CLIP_VIEWPORT(r->builder,
     51             &vec->viewport.vp);
     52       r->state.SF_VIEWPORT = gen6_SF_VIEWPORT(r->builder, &vec->viewport.vp);
     53       r->state.CC_VIEWPORT = gen6_CC_VIEWPORT(r->builder, &vec->viewport.vp);
     54 
     55       session->viewport_changed = true;
     56    }
     57 }
     58 
     59 static void
     60 gen7_emit_draw_dynamic_viewports(struct ilo_render *r,
     61                                  const struct ilo_state_vector *vec,
     62                                  struct ilo_render_draw_session *session)
     63 {
     64    ILO_DEV_ASSERT(r->dev, 7, 8);
     65 
     66    /* SF_CLIP_VIEWPORT and CC_VIEWPORT */
     67    if ((session->vp_delta.dirty & (ILO_STATE_VIEWPORT_SF_CLIP_VIEWPORT |
     68                                    ILO_STATE_VIEWPORT_CC_VIEWPORT)) ||
     69        r->state_bo_changed) {
     70       r->state.SF_CLIP_VIEWPORT = gen7_SF_CLIP_VIEWPORT(r->builder,
     71             &vec->viewport.vp);
     72       r->state.CC_VIEWPORT = gen6_CC_VIEWPORT(r->builder, &vec->viewport.vp);
     73 
     74       session->viewport_changed = true;
     75    }
     76 }
     77 
     78 static void
     79 gen6_emit_draw_dynamic_scissors(struct ilo_render *r,
     80                                 const struct ilo_state_vector *vec,
     81                                 struct ilo_render_draw_session *session)
     82 {
     83    ILO_DEV_ASSERT(r->dev, 6, 8);
     84 
     85    /* SCISSOR_RECT */
     86    if ((session->vp_delta.dirty & ILO_STATE_VIEWPORT_SCISSOR_RECT) ||
     87        r->state_bo_changed) {
     88       r->state.SCISSOR_RECT = gen6_SCISSOR_RECT(r->builder,
     89             &vec->viewport.vp);
     90 
     91       session->scissor_changed = true;
     92    }
     93 }
     94 
     95 static void
     96 gen6_emit_draw_dynamic_cc(struct ilo_render *r,
     97                           const struct ilo_state_vector *vec,
     98                           struct ilo_render_draw_session *session)
     99 {
    100    ILO_DEV_ASSERT(r->dev, 6, 8);
    101 
    102    /* BLEND_STATE */
    103    if ((session->cc_delta.dirty & ILO_STATE_CC_BLEND_STATE) ||
    104         r->state_bo_changed) {
    105       if (ilo_dev_gen(r->dev) >= ILO_GEN(8))
    106          r->state.BLEND_STATE = gen8_BLEND_STATE(r->builder, &vec->blend->cc);
    107       else
    108          r->state.BLEND_STATE = gen6_BLEND_STATE(r->builder, &vec->blend->cc);
    109 
    110       session->blend_changed = true;
    111    }
    112 
    113    /* COLOR_CALC_STATE */
    114    if ((session->cc_delta.dirty & ILO_STATE_CC_COLOR_CALC_STATE) ||
    115        r->state_bo_changed) {
    116       r->state.COLOR_CALC_STATE =
    117          gen6_COLOR_CALC_STATE(r->builder, &vec->blend->cc);
    118       session->cc_changed = true;
    119    }
    120 
    121    /* DEPTH_STENCIL_STATE */
    122    if (ilo_dev_gen(r->dev) < ILO_GEN(8) &&
    123        ((session->cc_delta.dirty & ILO_STATE_CC_DEPTH_STENCIL_STATE) ||
    124         r->state_bo_changed)) {
    125       r->state.DEPTH_STENCIL_STATE =
    126          gen6_DEPTH_STENCIL_STATE(r->builder, &vec->blend->cc);
    127       session->dsa_changed = true;
    128    }
    129 }
    130 
    131 static void
    132 gen6_emit_draw_dynamic_samplers(struct ilo_render *r,
    133                                 const struct ilo_state_vector *vec,
    134                                 int shader_type,
    135                                 struct ilo_render_draw_session *session)
    136 {
    137    const struct ilo_view_cso * const *views =
    138       (const struct ilo_view_cso **) vec->view[shader_type].states;
    139    struct ilo_state_sampler samplers[ILO_MAX_SAMPLERS];
    140    uint32_t *sampler_state, *border_color_state;
    141    int sampler_count, i;
    142    bool emit_border_color = false;
    143    bool skip = false;
    144 
    145    ILO_DEV_ASSERT(r->dev, 6, 8);
    146 
    147    /* SAMPLER_BORDER_COLOR_STATE and SAMPLER_STATE */
    148    switch (shader_type) {
    149    case PIPE_SHADER_VERTEX:
    150       if (DIRTY(VS) || DIRTY(SAMPLER_VS) || DIRTY(VIEW_VS)) {
    151          sampler_state = &r->state.vs.SAMPLER_STATE;
    152          border_color_state = r->state.vs.SAMPLER_BORDER_COLOR_STATE;
    153 
    154          if (DIRTY(VS) || DIRTY(SAMPLER_VS))
    155             emit_border_color = true;
    156 
    157          sampler_count = (vec->vs) ? ilo_shader_get_kernel_param(vec->vs,
    158                ILO_KERNEL_SAMPLER_COUNT) : 0;
    159 
    160          session->sampler_vs_changed = true;
    161       } else {
    162          skip = true;
    163       }
    164       break;
    165    case PIPE_SHADER_FRAGMENT:
    166       if (DIRTY(FS) || DIRTY(SAMPLER_FS) || DIRTY(VIEW_FS)) {
    167          sampler_state = &r->state.wm.SAMPLER_STATE;
    168          border_color_state = r->state.wm.SAMPLER_BORDER_COLOR_STATE;
    169 
    170          if (DIRTY(VS) || DIRTY(SAMPLER_FS))
    171             emit_border_color = true;
    172 
    173          sampler_count = (vec->fs) ? ilo_shader_get_kernel_param(vec->fs,
    174                ILO_KERNEL_SAMPLER_COUNT) : 0;
    175 
    176          session->sampler_fs_changed = true;
    177       } else {
    178          skip = true;
    179       }
    180       break;
    181    default:
    182       skip = true;
    183       break;
    184    }
    185 
    186    if (skip)
    187       return;
    188 
    189    assert(sampler_count <= ARRAY_SIZE(vec->view[shader_type].states) &&
    190           sampler_count <= ARRAY_SIZE(vec->sampler[shader_type].cso));
    191 
    192    if (emit_border_color) {
    193       for (i = 0; i < sampler_count; i++) {
    194          const struct ilo_sampler_cso *cso = vec->sampler[shader_type].cso[i];
    195 
    196          border_color_state[i] = (cso) ?
    197             gen6_SAMPLER_BORDER_COLOR_STATE(r->builder, &cso->border) : 0;
    198       }
    199    }
    200 
    201    for (i = 0; i < sampler_count; i++) {
    202       const struct ilo_sampler_cso *cso = vec->sampler[shader_type].cso[i];
    203 
    204       if (cso && views[i]) {
    205          samplers[i] = cso->sampler;
    206          ilo_state_sampler_set_surface(&samplers[i],
    207                r->dev, &views[i]->surface);
    208       } else {
    209          samplers[i] = vec->disabled_sampler;
    210       }
    211    }
    212 
    213    *sampler_state = gen6_SAMPLER_STATE(r->builder, samplers,
    214          border_color_state, sampler_count);
    215 }
    216 
    217 static void
    218 gen6_emit_draw_dynamic_pcb(struct ilo_render *r,
    219                            const struct ilo_state_vector *vec,
    220                            struct ilo_render_draw_session *session)
    221 {
    222    ILO_DEV_ASSERT(r->dev, 6, 8);
    223 
    224    /* push constant buffer for VS */
    225    if (DIRTY(VS) || DIRTY(CBUF) || DIRTY(CLIP)) {
    226       const int cbuf0_size = (vec->vs) ?
    227             ilo_shader_get_kernel_param(vec->vs,
    228                   ILO_KERNEL_PCB_CBUF0_SIZE) : 0;
    229       const int clip_state_size = (vec->vs) ?
    230             ilo_shader_get_kernel_param(vec->vs,
    231                   ILO_KERNEL_VS_PCB_UCP_SIZE) : 0;
    232       const int total_size = cbuf0_size + clip_state_size;
    233 
    234       if (total_size) {
    235          void *pcb;
    236 
    237          r->state.vs.PUSH_CONSTANT_BUFFER =
    238             gen6_push_constant_buffer(r->builder, total_size, &pcb);
    239          r->state.vs.PUSH_CONSTANT_BUFFER_size = total_size;
    240 
    241          if (cbuf0_size) {
    242             const struct ilo_cbuf_state *cbuf =
    243                &vec->cbuf[PIPE_SHADER_VERTEX];
    244 
    245             if (cbuf0_size <= cbuf->cso[0].info.size) {
    246                memcpy(pcb, cbuf->cso[0].user_buffer, cbuf0_size);
    247             } else {
    248                memcpy(pcb, cbuf->cso[0].user_buffer,
    249                      cbuf->cso[0].info.size);
    250                memset(pcb + cbuf->cso[0].info.size, 0,
    251                      cbuf0_size - cbuf->cso[0].info.size);
    252             }
    253 
    254             pcb += cbuf0_size;
    255          }
    256 
    257          if (clip_state_size)
    258             memcpy(pcb, &vec->clip, clip_state_size);
    259 
    260          session->pcb_vs_changed = true;
    261       } else if (r->state.vs.PUSH_CONSTANT_BUFFER_size) {
    262          r->state.vs.PUSH_CONSTANT_BUFFER = 0;
    263          r->state.vs.PUSH_CONSTANT_BUFFER_size = 0;
    264 
    265          session->pcb_vs_changed = true;
    266       }
    267    }
    268 
    269    /* push constant buffer for FS */
    270    if (DIRTY(FS) || DIRTY(CBUF)) {
    271       const int cbuf0_size = (vec->fs) ?
    272          ilo_shader_get_kernel_param(vec->fs, ILO_KERNEL_PCB_CBUF0_SIZE) : 0;
    273 
    274       if (cbuf0_size) {
    275          const struct ilo_cbuf_state *cbuf = &vec->cbuf[PIPE_SHADER_FRAGMENT];
    276          void *pcb;
    277 
    278          r->state.wm.PUSH_CONSTANT_BUFFER =
    279             gen6_push_constant_buffer(r->builder, cbuf0_size, &pcb);
    280          r->state.wm.PUSH_CONSTANT_BUFFER_size = cbuf0_size;
    281 
    282          if (cbuf0_size <= cbuf->cso[0].info.size) {
    283             memcpy(pcb, cbuf->cso[0].user_buffer, cbuf0_size);
    284          } else {
    285             memcpy(pcb, cbuf->cso[0].user_buffer,
    286                   cbuf->cso[0].info.size);
    287             memset(pcb + cbuf->cso[0].info.size, 0,
    288                   cbuf0_size - cbuf->cso[0].info.size);
    289          }
    290 
    291          session->pcb_fs_changed = true;
    292       } else if (r->state.wm.PUSH_CONSTANT_BUFFER_size) {
    293          r->state.wm.PUSH_CONSTANT_BUFFER = 0;
    294          r->state.wm.PUSH_CONSTANT_BUFFER_size = 0;
    295 
    296          session->pcb_fs_changed = true;
    297       }
    298    }
    299 }
    300 
    301 #undef DIRTY
    302 
    303 int
    304 ilo_render_get_draw_dynamic_states_len(const struct ilo_render *render,
    305                                        const struct ilo_state_vector *vec)
    306 {
    307    static int static_len;
    308    int sh_type, len;
    309 
    310    ILO_DEV_ASSERT(render->dev, 6, 8);
    311 
    312    if (!static_len) {
    313       /* 64 bytes, or 16 dwords */
    314       const int alignment = 64 / 4;
    315 
    316       /* pad first */
    317       len = alignment - 1;
    318 
    319       /* CC states */
    320       len += align(GEN6_BLEND_STATE__SIZE, alignment);
    321       len += align(GEN6_COLOR_CALC_STATE__SIZE, alignment);
    322       if (ilo_dev_gen(render->dev) < ILO_GEN(8))
    323          len += align(GEN6_DEPTH_STENCIL_STATE__SIZE, alignment);
    324 
    325       /* viewport arrays */
    326       if (ilo_dev_gen(render->dev) >= ILO_GEN(7)) {
    327          len += 15 + /* pad first */
    328             align(GEN7_SF_CLIP_VIEWPORT__SIZE, 16) +
    329             align(GEN6_CC_VIEWPORT__SIZE, 8) +
    330             align(GEN6_SCISSOR_RECT__SIZE, 8);
    331       } else {
    332          len += 7 + /* pad first */
    333             align(GEN6_SF_VIEWPORT__SIZE, 8) +
    334             align(GEN6_CLIP_VIEWPORT__SIZE, 8) +
    335             align(GEN6_CC_VIEWPORT__SIZE, 8) +
    336             align(GEN6_SCISSOR_RECT__SIZE, 8);
    337       }
    338 
    339       static_len = len;
    340    }
    341 
    342    len = static_len;
    343 
    344    for (sh_type = 0; sh_type < PIPE_SHADER_TYPES; sh_type++) {
    345       const int alignment = 32 / 4;
    346       int num_samplers = 0, pcb_len = 0;
    347 
    348       switch (sh_type) {
    349       case PIPE_SHADER_VERTEX:
    350          if (vec->vs) {
    351             num_samplers = ilo_shader_get_kernel_param(vec->vs,
    352                   ILO_KERNEL_SAMPLER_COUNT);
    353             pcb_len = ilo_shader_get_kernel_param(vec->vs,
    354                   ILO_KERNEL_PCB_CBUF0_SIZE);
    355             pcb_len += ilo_shader_get_kernel_param(vec->vs,
    356                   ILO_KERNEL_VS_PCB_UCP_SIZE);
    357          }
    358          break;
    359       case PIPE_SHADER_GEOMETRY:
    360          break;
    361       case PIPE_SHADER_FRAGMENT:
    362          if (vec->fs) {
    363             num_samplers = ilo_shader_get_kernel_param(vec->fs,
    364                   ILO_KERNEL_SAMPLER_COUNT);
    365             pcb_len = ilo_shader_get_kernel_param(vec->fs,
    366                   ILO_KERNEL_PCB_CBUF0_SIZE);
    367          }
    368          break;
    369       default:
    370          break;
    371       }
    372 
    373       /* SAMPLER_STATE array and SAMPLER_BORDER_COLORs */
    374       if (num_samplers) {
    375          /* prefetches are done in multiples of 4 */
    376          num_samplers = align(num_samplers, 4);
    377 
    378          len += align(GEN6_SAMPLER_STATE__SIZE * num_samplers, alignment);
    379 
    380          if (ilo_dev_gen(render->dev) >= ILO_GEN(8)) {
    381             len += align(GEN6_SAMPLER_BORDER_COLOR_STATE__SIZE, 64 / 4) *
    382                num_samplers;
    383          } else {
    384             len += align(GEN6_SAMPLER_BORDER_COLOR_STATE__SIZE, alignment) *
    385                num_samplers;
    386          }
    387       }
    388 
    389       /* PCB */
    390       if (pcb_len)
    391          len += align(pcb_len, alignment);
    392    }
    393 
    394    return len;
    395 }
    396 
    397 void
    398 ilo_render_emit_draw_dynamic_states(struct ilo_render *render,
    399                                     const struct ilo_state_vector *vec,
    400                                     struct ilo_render_draw_session *session)
    401 {
    402    const unsigned dynamic_used = ilo_builder_dynamic_used(render->builder);
    403 
    404    ILO_DEV_ASSERT(render->dev, 6, 8);
    405 
    406    if (ilo_dev_gen(render->dev) >= ILO_GEN(7))
    407       gen7_emit_draw_dynamic_viewports(render, vec, session);
    408    else
    409       gen6_emit_draw_dynamic_viewports(render, vec, session);
    410 
    411    gen6_emit_draw_dynamic_cc(render, vec, session);
    412    gen6_emit_draw_dynamic_scissors(render, vec, session);
    413    gen6_emit_draw_dynamic_pcb(render, vec, session);
    414 
    415    gen6_emit_draw_dynamic_samplers(render, vec,
    416          PIPE_SHADER_VERTEX, session);
    417    gen6_emit_draw_dynamic_samplers(render, vec,
    418          PIPE_SHADER_FRAGMENT, session);
    419 
    420    assert(ilo_builder_dynamic_used(render->builder) <= dynamic_used +
    421          ilo_render_get_draw_dynamic_states_len(render, vec));
    422 }
    423 
    424 int
    425 ilo_render_get_rectlist_dynamic_states_len(const struct ilo_render *render,
    426                                            const struct ilo_blitter *blitter)
    427 {
    428    ILO_DEV_ASSERT(render->dev, 6, 8);
    429 
    430    return (ilo_dev_gen(render->dev) >= ILO_GEN(8)) ? 0 : 96;
    431 }
    432 
    433 void
    434 ilo_render_emit_rectlist_dynamic_states(struct ilo_render *render,
    435                                         const struct ilo_blitter *blitter,
    436                                         struct ilo_render_rectlist_session *session)
    437 {
    438    const unsigned dynamic_used = ilo_builder_dynamic_used(render->builder);
    439 
    440    ILO_DEV_ASSERT(render->dev, 6, 8);
    441 
    442    if (ilo_dev_gen(render->dev) >= ILO_GEN(8))
    443       return;
    444 
    445    /* both are inclusive */
    446    session->vb_start = gen6_user_vertex_buffer(render->builder,
    447          sizeof(blitter->vertices), (const void *) blitter->vertices);
    448    session->vb_end = session->vb_start + sizeof(blitter->vertices) - 1;
    449 
    450    if (blitter->uses & ILO_BLITTER_USE_DSA) {
    451       render->state.DEPTH_STENCIL_STATE =
    452          gen6_DEPTH_STENCIL_STATE(render->builder, &blitter->cc);
    453    }
    454 
    455    if (blitter->uses & ILO_BLITTER_USE_CC) {
    456       render->state.COLOR_CALC_STATE =
    457          gen6_COLOR_CALC_STATE(render->builder, &blitter->cc);
    458    }
    459 
    460    if (blitter->uses & ILO_BLITTER_USE_VIEWPORT) {
    461       render->state.CC_VIEWPORT =
    462          gen6_CC_VIEWPORT(render->builder, &blitter->vp);
    463    }
    464 
    465    assert(ilo_builder_dynamic_used(render->builder) <= dynamic_used +
    466          ilo_render_get_rectlist_dynamic_states_len(render, blitter));
    467 }
    468 
    469 static void
    470 gen6_emit_launch_grid_dynamic_samplers(struct ilo_render *r,
    471                                        const struct ilo_state_vector *vec,
    472                                        struct ilo_render_launch_grid_session *session)
    473 {
    474    const unsigned shader_type = PIPE_SHADER_COMPUTE;
    475    const struct ilo_shader_state *cs = vec->cs;
    476    const struct ilo_view_cso * const *views =
    477       (const struct ilo_view_cso **) vec->view[shader_type].states;
    478    struct ilo_state_sampler samplers[ILO_MAX_SAMPLERS];
    479    int sampler_count, i;
    480 
    481    ILO_DEV_ASSERT(r->dev, 7, 7.5);
    482 
    483    sampler_count = ilo_shader_get_kernel_param(cs, ILO_KERNEL_SAMPLER_COUNT);
    484 
    485    assert(sampler_count <= ARRAY_SIZE(vec->view[shader_type].states) &&
    486           sampler_count <= ARRAY_SIZE(vec->sampler[shader_type].cso));
    487 
    488    for (i = 0; i < sampler_count; i++) {
    489       const struct ilo_sampler_cso *cso = vec->sampler[shader_type].cso[i];
    490 
    491       r->state.cs.SAMPLER_BORDER_COLOR_STATE[i] = (cso) ?
    492          gen6_SAMPLER_BORDER_COLOR_STATE(r->builder, &cso->border) : 0;
    493    }
    494 
    495    for (i = 0; i < sampler_count; i++) {
    496       const struct ilo_sampler_cso *cso = vec->sampler[shader_type].cso[i];
    497 
    498       if (cso && views[i]) {
    499          samplers[i] = cso->sampler;
    500          ilo_state_sampler_set_surface(&samplers[i],
    501                r->dev, &views[i]->surface);
    502       } else {
    503          samplers[i] = vec->disabled_sampler;
    504       }
    505    }
    506 
    507    r->state.cs.SAMPLER_STATE = gen6_SAMPLER_STATE(r->builder, samplers,
    508          r->state.cs.SAMPLER_BORDER_COLOR_STATE, sampler_count);
    509 }
    510 
    511 static void
    512 gen6_emit_launch_grid_dynamic_pcb(struct ilo_render *r,
    513                                   const struct ilo_state_vector *vec,
    514                                   struct ilo_render_launch_grid_session *session)
    515 {
    516    r->state.cs.PUSH_CONSTANT_BUFFER = 0;
    517    r->state.cs.PUSH_CONSTANT_BUFFER_size = 0;
    518 }
    519 
    520 static void
    521 gen6_emit_launch_grid_dynamic_idrt(struct ilo_render *r,
    522                                    const struct ilo_state_vector *vec,
    523                                    struct ilo_render_launch_grid_session *session)
    524 {
    525    const struct ilo_shader_state *cs = vec->cs;
    526    struct ilo_state_compute_interface_info interface;
    527    struct ilo_state_compute_info info;
    528    uint32_t kernel_offset;
    529 
    530    ILO_DEV_ASSERT(r->dev, 7, 7.5);
    531 
    532    memset(&interface, 0, sizeof(interface));
    533 
    534    interface.sampler_count =
    535       ilo_shader_get_kernel_param(cs, ILO_KERNEL_SAMPLER_COUNT);
    536    interface.surface_count =
    537       ilo_shader_get_kernel_param(cs, ILO_KERNEL_SURFACE_TOTAL_COUNT);
    538    interface.thread_group_size = session->thread_group_size;
    539    interface.slm_size =
    540       ilo_shader_get_kernel_param(cs, ILO_KERNEL_CS_LOCAL_SIZE);
    541    interface.curbe_read_length = r->state.cs.PUSH_CONSTANT_BUFFER_size;
    542 
    543    memset(&info, 0, sizeof(info));
    544    info.data = session->compute_data;
    545    info.data_size = sizeof(session->compute_data);
    546    info.interfaces = &interface;
    547    info.interface_count = 1;
    548    info.cv_urb_alloc_size = r->dev->urb_size;
    549    info.curbe_alloc_size = r->state.cs.PUSH_CONSTANT_BUFFER_size;
    550 
    551    ilo_state_compute_init(&session->compute, r->dev, &info);
    552 
    553    kernel_offset = ilo_shader_get_kernel_offset(cs);
    554 
    555    session->idrt = gen6_INTERFACE_DESCRIPTOR_DATA(r->builder,
    556          &session->compute, &kernel_offset,
    557          &r->state.cs.SAMPLER_STATE, &r->state.cs.BINDING_TABLE_STATE);
    558 
    559    session->idrt_size = 32;
    560 }
    561 
    562 int
    563 ilo_render_get_launch_grid_dynamic_states_len(const struct ilo_render *render,
    564                                               const struct ilo_state_vector *vec)
    565 {
    566    const int alignment = 32 / 4;
    567    int num_samplers;
    568    int len = 0;
    569 
    570    ILO_DEV_ASSERT(render->dev, 7, 7.5);
    571 
    572    num_samplers = ilo_shader_get_kernel_param(vec->cs,
    573          ILO_KERNEL_SAMPLER_COUNT);
    574 
    575    /* SAMPLER_STATE array and SAMPLER_BORDER_COLORs */
    576    if (num_samplers) {
    577       /* prefetches are done in multiples of 4 */
    578       num_samplers = align(num_samplers, 4);
    579 
    580       len += align(GEN6_SAMPLER_STATE__SIZE * num_samplers, alignment) +
    581              align(GEN6_SAMPLER_BORDER_COLOR_STATE__SIZE, alignment) *
    582              num_samplers;
    583    }
    584 
    585    len += GEN6_INTERFACE_DESCRIPTOR_DATA__SIZE;
    586 
    587    return len;
    588 }
    589 
    590 void
    591 ilo_render_emit_launch_grid_dynamic_states(struct ilo_render *render,
    592                                            const struct ilo_state_vector *vec,
    593                                            struct ilo_render_launch_grid_session *session)
    594 {
    595    const unsigned dynamic_used = ilo_builder_dynamic_used(render->builder);
    596 
    597    ILO_DEV_ASSERT(render->dev, 7, 7.5);
    598 
    599    gen6_emit_launch_grid_dynamic_samplers(render, vec, session);
    600    gen6_emit_launch_grid_dynamic_pcb(render, vec, session);
    601    gen6_emit_launch_grid_dynamic_idrt(render, vec, session);
    602 
    603    assert(ilo_builder_dynamic_used(render->builder) <= dynamic_used +
    604          ilo_render_get_launch_grid_dynamic_states_len(render, vec));
    605 }
    606