Home | History | Annotate | Download | only in state_tracker
      1 /**************************************************************************
      2  *
      3  * Copyright 2007 VMware, Inc.
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation the rights to use, copy, modify, merge, publish,
     10  * distribute, sub license, and/or sell copies of the Software, and to
     11  * permit persons to whom the Software is furnished to do so, subject to
     12  * the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial portions
     16  * of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     21  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
     22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  **************************************************************************/
     27  /*
     28   * Authors:
     29   *   Keith Whitwell <keithw (at) vmware.com>
     30   *   Brian Paul
     31   */
     32 
     33 
     34 #include "main/imports.h"
     35 #include "main/hash.h"
     36 #include "main/mtypes.h"
     37 #include "program/prog_parameter.h"
     38 #include "program/prog_print.h"
     39 #include "program/programopt.h"
     40 
     41 #include "compiler/nir/nir.h"
     42 
     43 #include "pipe/p_context.h"
     44 #include "pipe/p_defines.h"
     45 #include "pipe/p_shader_tokens.h"
     46 #include "draw/draw_context.h"
     47 #include "tgsi/tgsi_dump.h"
     48 #include "tgsi/tgsi_emulate.h"
     49 #include "tgsi/tgsi_parse.h"
     50 #include "tgsi/tgsi_ureg.h"
     51 
     52 #include "st_debug.h"
     53 #include "st_cb_bitmap.h"
     54 #include "st_cb_drawpixels.h"
     55 #include "st_context.h"
     56 #include "st_tgsi_lower_yuv.h"
     57 #include "st_program.h"
     58 #include "st_mesa_to_tgsi.h"
     59 #include "st_atifs_to_tgsi.h"
     60 #include "st_nir.h"
     61 #include "st_shader_cache.h"
     62 #include "cso_cache/cso_context.h"
     63 
     64 
     65 
     66 static void
     67 set_affected_state_flags(uint64_t *states,
     68                          struct gl_program *prog,
     69                          uint64_t new_constants,
     70                          uint64_t new_sampler_views,
     71                          uint64_t new_samplers,
     72                          uint64_t new_images,
     73                          uint64_t new_ubos,
     74                          uint64_t new_ssbos,
     75                          uint64_t new_atomics)
     76 {
     77    if (prog->Parameters->NumParameters)
     78       *states |= new_constants;
     79 
     80    if (prog->info.num_textures)
     81       *states |= new_sampler_views | new_samplers;
     82 
     83    if (prog->info.num_images)
     84       *states |= new_images;
     85 
     86    if (prog->info.num_ubos)
     87       *states |= new_ubos;
     88 
     89    if (prog->info.num_ssbos)
     90       *states |= new_ssbos;
     91 
     92    if (prog->info.num_abos)
     93       *states |= new_atomics;
     94 }
     95 
     96 /**
     97  * This determines which states will be updated when the shader is bound.
     98  */
     99 void
    100 st_set_prog_affected_state_flags(struct gl_program *prog)
    101 {
    102    uint64_t *states;
    103 
    104    switch (prog->info.stage) {
    105    case MESA_SHADER_VERTEX:
    106       states = &((struct st_vertex_program*)prog)->affected_states;
    107 
    108       *states = ST_NEW_VS_STATE |
    109                 ST_NEW_RASTERIZER |
    110                 ST_NEW_VERTEX_ARRAYS;
    111 
    112       set_affected_state_flags(states, prog,
    113                                ST_NEW_VS_CONSTANTS,
    114                                ST_NEW_VS_SAMPLER_VIEWS,
    115                                ST_NEW_VS_SAMPLERS,
    116                                ST_NEW_VS_IMAGES,
    117                                ST_NEW_VS_UBOS,
    118                                ST_NEW_VS_SSBOS,
    119                                ST_NEW_VS_ATOMICS);
    120       break;
    121 
    122    case MESA_SHADER_TESS_CTRL:
    123       states = &(st_common_program(prog))->affected_states;
    124 
    125       *states = ST_NEW_TCS_STATE;
    126 
    127       set_affected_state_flags(states, prog,
    128                                ST_NEW_TCS_CONSTANTS,
    129                                ST_NEW_TCS_SAMPLER_VIEWS,
    130                                ST_NEW_TCS_SAMPLERS,
    131                                ST_NEW_TCS_IMAGES,
    132                                ST_NEW_TCS_UBOS,
    133                                ST_NEW_TCS_SSBOS,
    134                                ST_NEW_TCS_ATOMICS);
    135       break;
    136 
    137    case MESA_SHADER_TESS_EVAL:
    138       states = &(st_common_program(prog))->affected_states;
    139 
    140       *states = ST_NEW_TES_STATE |
    141                 ST_NEW_RASTERIZER;
    142 
    143       set_affected_state_flags(states, prog,
    144                                ST_NEW_TES_CONSTANTS,
    145                                ST_NEW_TES_SAMPLER_VIEWS,
    146                                ST_NEW_TES_SAMPLERS,
    147                                ST_NEW_TES_IMAGES,
    148                                ST_NEW_TES_UBOS,
    149                                ST_NEW_TES_SSBOS,
    150                                ST_NEW_TES_ATOMICS);
    151       break;
    152 
    153    case MESA_SHADER_GEOMETRY:
    154       states = &(st_common_program(prog))->affected_states;
    155 
    156       *states = ST_NEW_GS_STATE |
    157                 ST_NEW_RASTERIZER;
    158 
    159       set_affected_state_flags(states, prog,
    160                                ST_NEW_GS_CONSTANTS,
    161                                ST_NEW_GS_SAMPLER_VIEWS,
    162                                ST_NEW_GS_SAMPLERS,
    163                                ST_NEW_GS_IMAGES,
    164                                ST_NEW_GS_UBOS,
    165                                ST_NEW_GS_SSBOS,
    166                                ST_NEW_GS_ATOMICS);
    167       break;
    168 
    169    case MESA_SHADER_FRAGMENT:
    170       states = &((struct st_fragment_program*)prog)->affected_states;
    171 
    172       /* gl_FragCoord and glDrawPixels always use constants. */
    173       *states = ST_NEW_FS_STATE |
    174                 ST_NEW_SAMPLE_SHADING |
    175                 ST_NEW_FS_CONSTANTS;
    176 
    177       set_affected_state_flags(states, prog,
    178                                ST_NEW_FS_CONSTANTS,
    179                                ST_NEW_FS_SAMPLER_VIEWS,
    180                                ST_NEW_FS_SAMPLERS,
    181                                ST_NEW_FS_IMAGES,
    182                                ST_NEW_FS_UBOS,
    183                                ST_NEW_FS_SSBOS,
    184                                ST_NEW_FS_ATOMICS);
    185       break;
    186 
    187    case MESA_SHADER_COMPUTE:
    188       states = &((struct st_compute_program*)prog)->affected_states;
    189 
    190       *states = ST_NEW_CS_STATE;
    191 
    192       set_affected_state_flags(states, prog,
    193                                ST_NEW_CS_CONSTANTS,
    194                                ST_NEW_CS_SAMPLER_VIEWS,
    195                                ST_NEW_CS_SAMPLERS,
    196                                ST_NEW_CS_IMAGES,
    197                                ST_NEW_CS_UBOS,
    198                                ST_NEW_CS_SSBOS,
    199                                ST_NEW_CS_ATOMICS);
    200       break;
    201 
    202    default:
    203       unreachable("unhandled shader stage");
    204    }
    205 }
    206 
    207 /**
    208  * Delete a vertex program variant.  Note the caller must unlink
    209  * the variant from the linked list.
    210  */
    211 static void
    212 delete_vp_variant(struct st_context *st, struct st_vp_variant *vpv)
    213 {
    214    if (vpv->driver_shader)
    215       cso_delete_vertex_shader(st->cso_context, vpv->driver_shader);
    216 
    217    if (vpv->draw_shader)
    218       draw_delete_vertex_shader( st->draw, vpv->draw_shader );
    219 
    220    if (((vpv->tgsi.type == PIPE_SHADER_IR_TGSI)) && vpv->tgsi.tokens)
    221       ureg_free_tokens(vpv->tgsi.tokens);
    222 
    223    free( vpv );
    224 }
    225 
    226 
    227 
    228 /**
    229  * Clean out any old compilations:
    230  */
    231 void
    232 st_release_vp_variants( struct st_context *st,
    233                         struct st_vertex_program *stvp )
    234 {
    235    struct st_vp_variant *vpv;
    236 
    237    for (vpv = stvp->variants; vpv; ) {
    238       struct st_vp_variant *next = vpv->next;
    239       delete_vp_variant(st, vpv);
    240       vpv = next;
    241    }
    242 
    243    stvp->variants = NULL;
    244 
    245    if ((stvp->tgsi.type == PIPE_SHADER_IR_TGSI) && stvp->tgsi.tokens) {
    246       tgsi_free_tokens(stvp->tgsi.tokens);
    247       stvp->tgsi.tokens = NULL;
    248    }
    249 }
    250 
    251 
    252 
    253 /**
    254  * Delete a fragment program variant.  Note the caller must unlink
    255  * the variant from the linked list.
    256  */
    257 static void
    258 delete_fp_variant(struct st_context *st, struct st_fp_variant *fpv)
    259 {
    260    if (fpv->driver_shader)
    261       cso_delete_fragment_shader(st->cso_context, fpv->driver_shader);
    262    free(fpv);
    263 }
    264 
    265 
    266 /**
    267  * Free all variants of a fragment program.
    268  */
    269 void
    270 st_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp)
    271 {
    272    struct st_fp_variant *fpv;
    273 
    274    for (fpv = stfp->variants; fpv; ) {
    275       struct st_fp_variant *next = fpv->next;
    276       delete_fp_variant(st, fpv);
    277       fpv = next;
    278    }
    279 
    280    stfp->variants = NULL;
    281 
    282    if ((stfp->tgsi.type == PIPE_SHADER_IR_TGSI) && stfp->tgsi.tokens) {
    283       ureg_free_tokens(stfp->tgsi.tokens);
    284       stfp->tgsi.tokens = NULL;
    285    }
    286 }
    287 
    288 
    289 /**
    290  * Delete a basic program variant.  Note the caller must unlink
    291  * the variant from the linked list.
    292  */
    293 static void
    294 delete_basic_variant(struct st_context *st, struct st_basic_variant *v,
    295                      GLenum target)
    296 {
    297    if (v->driver_shader) {
    298       switch (target) {
    299       case GL_TESS_CONTROL_PROGRAM_NV:
    300          cso_delete_tessctrl_shader(st->cso_context, v->driver_shader);
    301          break;
    302       case GL_TESS_EVALUATION_PROGRAM_NV:
    303          cso_delete_tesseval_shader(st->cso_context, v->driver_shader);
    304          break;
    305       case GL_GEOMETRY_PROGRAM_NV:
    306          cso_delete_geometry_shader(st->cso_context, v->driver_shader);
    307          break;
    308       case GL_COMPUTE_PROGRAM_NV:
    309          cso_delete_compute_shader(st->cso_context, v->driver_shader);
    310          break;
    311       default:
    312          assert(!"this shouldn't occur");
    313       }
    314    }
    315 
    316    free(v);
    317 }
    318 
    319 
    320 /**
    321  * Free all basic program variants.
    322  */
    323 void
    324 st_release_basic_variants(struct st_context *st, GLenum target,
    325                           struct st_basic_variant **variants,
    326                           struct pipe_shader_state *tgsi)
    327 {
    328    struct st_basic_variant *v;
    329 
    330    for (v = *variants; v; ) {
    331       struct st_basic_variant *next = v->next;
    332       delete_basic_variant(st, v, target);
    333       v = next;
    334    }
    335 
    336    *variants = NULL;
    337 
    338    if (tgsi->tokens) {
    339       ureg_free_tokens(tgsi->tokens);
    340       tgsi->tokens = NULL;
    341    }
    342 }
    343 
    344 
    345 /**
    346  * Free all variants of a compute program.
    347  */
    348 void
    349 st_release_cp_variants(struct st_context *st, struct st_compute_program *stcp)
    350 {
    351    struct st_basic_variant **variants = &stcp->variants;
    352    struct st_basic_variant *v;
    353 
    354    for (v = *variants; v; ) {
    355       struct st_basic_variant *next = v->next;
    356       delete_basic_variant(st, v, stcp->Base.Target);
    357       v = next;
    358    }
    359 
    360    *variants = NULL;
    361 
    362    if (stcp->tgsi.prog) {
    363       switch (stcp->tgsi.ir_type) {
    364       case PIPE_SHADER_IR_TGSI:
    365          ureg_free_tokens(stcp->tgsi.prog);
    366          stcp->tgsi.prog = NULL;
    367          break;
    368       case PIPE_SHADER_IR_NIR:
    369          /* pipe driver took ownership of prog */
    370          break;
    371       case PIPE_SHADER_IR_LLVM:
    372       case PIPE_SHADER_IR_NATIVE:
    373          /* ??? */
    374          stcp->tgsi.prog = NULL;
    375          break;
    376       }
    377    }
    378 }
    379 
    380 /**
    381  * Translate a vertex program.
    382  */
    383 bool
    384 st_translate_vertex_program(struct st_context *st,
    385                             struct st_vertex_program *stvp)
    386 {
    387    struct ureg_program *ureg;
    388    enum pipe_error error;
    389    unsigned num_outputs = 0;
    390    unsigned attr;
    391    ubyte input_to_index[VERT_ATTRIB_MAX] = {0};
    392    ubyte output_semantic_name[VARYING_SLOT_MAX] = {0};
    393    ubyte output_semantic_index[VARYING_SLOT_MAX] = {0};
    394 
    395    stvp->num_inputs = 0;
    396 
    397    if (stvp->Base.arb.IsPositionInvariant)
    398       _mesa_insert_mvp_code(st->ctx, &stvp->Base);
    399 
    400    /*
    401     * Determine number of inputs, the mappings between VERT_ATTRIB_x
    402     * and TGSI generic input indexes, plus input attrib semantic info.
    403     */
    404    for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
    405       if ((stvp->Base.info.inputs_read & BITFIELD64_BIT(attr)) != 0) {
    406          input_to_index[attr] = stvp->num_inputs;
    407          stvp->index_to_input[stvp->num_inputs] = attr;
    408          stvp->num_inputs++;
    409          if ((stvp->Base.info.double_inputs_read &
    410               BITFIELD64_BIT(attr)) != 0) {
    411             /* add placeholder for second part of a double attribute */
    412             stvp->index_to_input[stvp->num_inputs] = ST_DOUBLE_ATTRIB_PLACEHOLDER;
    413             stvp->num_inputs++;
    414          }
    415       }
    416    }
    417    /* bit of a hack, presetup potentially unused edgeflag input */
    418    input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs;
    419    stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG;
    420 
    421    /* Compute mapping of vertex program outputs to slots.
    422     */
    423    for (attr = 0; attr < VARYING_SLOT_MAX; attr++) {
    424       if ((stvp->Base.info.outputs_written & BITFIELD64_BIT(attr)) == 0) {
    425          stvp->result_to_output[attr] = ~0;
    426       }
    427       else {
    428          unsigned slot = num_outputs++;
    429 
    430          stvp->result_to_output[attr] = slot;
    431 
    432          unsigned semantic_name, semantic_index;
    433          tgsi_get_gl_varying_semantic(attr, st->needs_texcoord_semantic,
    434                                       &semantic_name, &semantic_index);
    435          output_semantic_name[slot] = semantic_name;
    436          output_semantic_index[slot] = semantic_index;
    437       }
    438    }
    439    /* similar hack to above, presetup potentially unused edgeflag output */
    440    stvp->result_to_output[VARYING_SLOT_EDGE] = num_outputs;
    441    output_semantic_name[num_outputs] = TGSI_SEMANTIC_EDGEFLAG;
    442    output_semantic_index[num_outputs] = 0;
    443 
    444    /* ARB_vp: */
    445    if (!stvp->glsl_to_tgsi && !stvp->shader_program) {
    446       _mesa_remove_output_reads(&stvp->Base, PROGRAM_OUTPUT);
    447 
    448       /* This determines which states will be updated when the assembly
    449        * shader is bound.
    450        */
    451       stvp->affected_states = ST_NEW_VS_STATE |
    452                               ST_NEW_RASTERIZER |
    453                               ST_NEW_VERTEX_ARRAYS;
    454 
    455       if (stvp->Base.Parameters->NumParameters)
    456          stvp->affected_states |= ST_NEW_VS_CONSTANTS;
    457 
    458       /* No samplers are allowed in ARB_vp. */
    459    }
    460 
    461    if (stvp->shader_program) {
    462       struct gl_program *prog = stvp->shader_program->last_vert_prog;
    463       if (prog) {
    464          st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback,
    465                                           stvp->result_to_output,
    466                                           &stvp->tgsi.stream_output);
    467       }
    468 
    469       return true;
    470    }
    471 
    472    ureg = ureg_create_with_screen(PIPE_SHADER_VERTEX, st->pipe->screen);
    473    if (ureg == NULL)
    474       return false;
    475 
    476    if (stvp->Base.info.clip_distance_array_size)
    477       ureg_property(ureg, TGSI_PROPERTY_NUM_CLIPDIST_ENABLED,
    478                     stvp->Base.info.clip_distance_array_size);
    479    if (stvp->Base.info.cull_distance_array_size)
    480       ureg_property(ureg, TGSI_PROPERTY_NUM_CULLDIST_ENABLED,
    481                     stvp->Base.info.cull_distance_array_size);
    482 
    483    if (ST_DEBUG & DEBUG_MESA) {
    484       _mesa_print_program(&stvp->Base);
    485       _mesa_print_program_parameters(st->ctx, &stvp->Base);
    486       debug_printf("\n");
    487    }
    488 
    489    if (stvp->glsl_to_tgsi) {
    490       error = st_translate_program(st->ctx,
    491                                    PIPE_SHADER_VERTEX,
    492                                    ureg,
    493                                    stvp->glsl_to_tgsi,
    494                                    &stvp->Base,
    495                                    /* inputs */
    496                                    stvp->num_inputs,
    497                                    input_to_index,
    498                                    NULL, /* inputSlotToAttr */
    499                                    NULL, /* input semantic name */
    500                                    NULL, /* input semantic index */
    501                                    NULL, /* interp mode */
    502                                    /* outputs */
    503                                    num_outputs,
    504                                    stvp->result_to_output,
    505                                    output_semantic_name,
    506                                    output_semantic_index);
    507 
    508       st_translate_stream_output_info(stvp->glsl_to_tgsi,
    509                                       stvp->result_to_output,
    510                                       &stvp->tgsi.stream_output);
    511 
    512       free_glsl_to_tgsi_visitor(stvp->glsl_to_tgsi);
    513    } else
    514       error = st_translate_mesa_program(st->ctx,
    515                                         PIPE_SHADER_VERTEX,
    516                                         ureg,
    517                                         &stvp->Base,
    518                                         /* inputs */
    519                                         stvp->num_inputs,
    520                                         input_to_index,
    521                                         NULL, /* input semantic name */
    522                                         NULL, /* input semantic index */
    523                                         NULL,
    524                                         /* outputs */
    525                                         num_outputs,
    526                                         stvp->result_to_output,
    527                                         output_semantic_name,
    528                                         output_semantic_index);
    529 
    530    if (error) {
    531       debug_printf("%s: failed to translate Mesa program:\n", __func__);
    532       _mesa_print_program(&stvp->Base);
    533       debug_assert(0);
    534       return false;
    535    }
    536 
    537    stvp->tgsi.tokens = ureg_get_tokens(ureg, &stvp->num_tgsi_tokens);
    538    ureg_destroy(ureg);
    539 
    540    if (stvp->glsl_to_tgsi) {
    541       stvp->glsl_to_tgsi = NULL;
    542       st_store_tgsi_in_disk_cache(st, &stvp->Base);
    543    }
    544 
    545    return stvp->tgsi.tokens != NULL;
    546 }
    547 
    548 static struct st_vp_variant *
    549 st_create_vp_variant(struct st_context *st,
    550                      struct st_vertex_program *stvp,
    551                      const struct st_vp_variant_key *key)
    552 {
    553    struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant);
    554    struct pipe_context *pipe = st->pipe;
    555 
    556    vpv->key = *key;
    557    vpv->tgsi.stream_output = stvp->tgsi.stream_output;
    558    vpv->num_inputs = stvp->num_inputs;
    559 
    560    if (stvp->tgsi.type == PIPE_SHADER_IR_NIR) {
    561       vpv->tgsi.type = PIPE_SHADER_IR_NIR;
    562       vpv->tgsi.ir.nir = nir_shader_clone(NULL, stvp->tgsi.ir.nir);
    563       if (key->clamp_color)
    564          NIR_PASS_V(vpv->tgsi.ir.nir, nir_lower_clamp_color_outputs);
    565       if (key->passthrough_edgeflags) {
    566          NIR_PASS_V(vpv->tgsi.ir.nir, nir_lower_passthrough_edgeflags);
    567          vpv->num_inputs++;
    568       }
    569 
    570       st_finalize_nir(st, &stvp->Base, stvp->shader_program,
    571                       vpv->tgsi.ir.nir);
    572 
    573       vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
    574       /* driver takes ownership of IR: */
    575       vpv->tgsi.ir.nir = NULL;
    576       return vpv;
    577    }
    578 
    579    vpv->tgsi.tokens = tgsi_dup_tokens(stvp->tgsi.tokens);
    580 
    581    /* Emulate features. */
    582    if (key->clamp_color || key->passthrough_edgeflags) {
    583       const struct tgsi_token *tokens;
    584       unsigned flags =
    585          (key->clamp_color ? TGSI_EMU_CLAMP_COLOR_OUTPUTS : 0) |
    586          (key->passthrough_edgeflags ? TGSI_EMU_PASSTHROUGH_EDGEFLAG : 0);
    587 
    588       tokens = tgsi_emulate(vpv->tgsi.tokens, flags);
    589 
    590       if (tokens) {
    591          tgsi_free_tokens(vpv->tgsi.tokens);
    592          vpv->tgsi.tokens = tokens;
    593 
    594          if (key->passthrough_edgeflags)
    595             vpv->num_inputs++;
    596       } else
    597          fprintf(stderr, "mesa: cannot emulate deprecated features\n");
    598    }
    599 
    600    if (ST_DEBUG & DEBUG_TGSI) {
    601       tgsi_dump(vpv->tgsi.tokens, 0);
    602       debug_printf("\n");
    603    }
    604 
    605    vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
    606    return vpv;
    607 }
    608 
    609 
    610 /**
    611  * Find/create a vertex program variant.
    612  */
    613 struct st_vp_variant *
    614 st_get_vp_variant(struct st_context *st,
    615                   struct st_vertex_program *stvp,
    616                   const struct st_vp_variant_key *key)
    617 {
    618    struct st_vp_variant *vpv;
    619 
    620    /* Search for existing variant */
    621    for (vpv = stvp->variants; vpv; vpv = vpv->next) {
    622       if (memcmp(&vpv->key, key, sizeof(*key)) == 0) {
    623          break;
    624       }
    625    }
    626 
    627    if (!vpv) {
    628       /* create now */
    629       vpv = st_create_vp_variant(st, stvp, key);
    630       if (vpv) {
    631          /* insert into list */
    632          vpv->next = stvp->variants;
    633          stvp->variants = vpv;
    634       }
    635    }
    636 
    637    return vpv;
    638 }
    639 
    640 
    641 /**
    642  * Translate a Mesa fragment shader into a TGSI shader.
    643  */
    644 bool
    645 st_translate_fragment_program(struct st_context *st,
    646                               struct st_fragment_program *stfp)
    647 {
    648    ubyte outputMapping[2 * FRAG_RESULT_MAX];
    649    ubyte inputMapping[VARYING_SLOT_MAX];
    650    ubyte inputSlotToAttr[VARYING_SLOT_MAX];
    651    ubyte interpMode[PIPE_MAX_SHADER_INPUTS];  /* XXX size? */
    652    GLuint attr;
    653    GLbitfield64 inputsRead;
    654    struct ureg_program *ureg;
    655 
    656    GLboolean write_all = GL_FALSE;
    657 
    658    ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
    659    ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
    660    uint fs_num_inputs = 0;
    661 
    662    ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
    663    ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
    664    uint fs_num_outputs = 0;
    665 
    666    memset(inputSlotToAttr, ~0, sizeof(inputSlotToAttr));
    667 
    668    /* Non-GLSL programs: */
    669    if (!stfp->glsl_to_tgsi && !stfp->shader_program) {
    670       _mesa_remove_output_reads(&stfp->Base, PROGRAM_OUTPUT);
    671       if (st->ctx->Const.GLSLFragCoordIsSysVal)
    672          _mesa_program_fragment_position_to_sysval(&stfp->Base);
    673 
    674       /* This determines which states will be updated when the assembly
    675        * shader is bound.
    676        *
    677        * fragment.position and glDrawPixels always use constants.
    678        */
    679       stfp->affected_states = ST_NEW_FS_STATE |
    680                               ST_NEW_SAMPLE_SHADING |
    681                               ST_NEW_FS_CONSTANTS;
    682 
    683       if (stfp->ati_fs) {
    684          /* Just set them for ATI_fs unconditionally. */
    685          stfp->affected_states |= ST_NEW_FS_SAMPLER_VIEWS |
    686                                   ST_NEW_FS_SAMPLERS;
    687       } else {
    688          /* ARB_fp */
    689          if (stfp->Base.SamplersUsed)
    690             stfp->affected_states |= ST_NEW_FS_SAMPLER_VIEWS |
    691                                      ST_NEW_FS_SAMPLERS;
    692       }
    693    }
    694 
    695    /*
    696     * Convert Mesa program inputs to TGSI input register semantics.
    697     */
    698    inputsRead = stfp->Base.info.inputs_read;
    699    for (attr = 0; attr < VARYING_SLOT_MAX; attr++) {
    700       if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
    701          const GLuint slot = fs_num_inputs++;
    702 
    703          inputMapping[attr] = slot;
    704          inputSlotToAttr[slot] = attr;
    705 
    706          switch (attr) {
    707          case VARYING_SLOT_POS:
    708             input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
    709             input_semantic_index[slot] = 0;
    710             interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
    711             break;
    712          case VARYING_SLOT_COL0:
    713             input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
    714             input_semantic_index[slot] = 0;
    715             interpMode[slot] = stfp->glsl_to_tgsi ?
    716                TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_COLOR;
    717             break;
    718          case VARYING_SLOT_COL1:
    719             input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
    720             input_semantic_index[slot] = 1;
    721             interpMode[slot] = stfp->glsl_to_tgsi ?
    722                TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_COLOR;
    723             break;
    724          case VARYING_SLOT_FOGC:
    725             input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
    726             input_semantic_index[slot] = 0;
    727             interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
    728             break;
    729          case VARYING_SLOT_FACE:
    730             input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
    731             input_semantic_index[slot] = 0;
    732             interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
    733             break;
    734          case VARYING_SLOT_PRIMITIVE_ID:
    735             input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID;
    736             input_semantic_index[slot] = 0;
    737             interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
    738             break;
    739          case VARYING_SLOT_LAYER:
    740             input_semantic_name[slot] = TGSI_SEMANTIC_LAYER;
    741             input_semantic_index[slot] = 0;
    742             interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
    743             break;
    744          case VARYING_SLOT_VIEWPORT:
    745             input_semantic_name[slot] = TGSI_SEMANTIC_VIEWPORT_INDEX;
    746             input_semantic_index[slot] = 0;
    747             interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
    748             break;
    749          case VARYING_SLOT_CLIP_DIST0:
    750             input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
    751             input_semantic_index[slot] = 0;
    752             interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
    753             break;
    754          case VARYING_SLOT_CLIP_DIST1:
    755             input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
    756             input_semantic_index[slot] = 1;
    757             interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
    758             break;
    759          case VARYING_SLOT_CULL_DIST0:
    760          case VARYING_SLOT_CULL_DIST1:
    761             /* these should have been lowered by GLSL */
    762             assert(0);
    763             break;
    764             /* In most cases, there is nothing special about these
    765              * inputs, so adopt a convention to use the generic
    766              * semantic name and the mesa VARYING_SLOT_ number as the
    767              * index.
    768              *
    769              * All that is required is that the vertex shader labels
    770              * its own outputs similarly, and that the vertex shader
    771              * generates at least every output required by the
    772              * fragment shader plus fixed-function hardware (such as
    773              * BFC).
    774              *
    775              * However, some drivers may need us to identify the PNTC and TEXi
    776              * varyings if, for example, their capability to replace them with
    777              * sprite coordinates is limited.
    778              */
    779          case VARYING_SLOT_PNTC:
    780             if (st->needs_texcoord_semantic) {
    781                input_semantic_name[slot] = TGSI_SEMANTIC_PCOORD;
    782                input_semantic_index[slot] = 0;
    783                interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
    784                break;
    785             }
    786             /* fall through */
    787          case VARYING_SLOT_TEX0:
    788          case VARYING_SLOT_TEX1:
    789          case VARYING_SLOT_TEX2:
    790          case VARYING_SLOT_TEX3:
    791          case VARYING_SLOT_TEX4:
    792          case VARYING_SLOT_TEX5:
    793          case VARYING_SLOT_TEX6:
    794          case VARYING_SLOT_TEX7:
    795             if (st->needs_texcoord_semantic) {
    796                input_semantic_name[slot] = TGSI_SEMANTIC_TEXCOORD;
    797                input_semantic_index[slot] = attr - VARYING_SLOT_TEX0;
    798                interpMode[slot] = stfp->glsl_to_tgsi ?
    799                   TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_PERSPECTIVE;
    800                break;
    801             }
    802             /* fall through */
    803          case VARYING_SLOT_VAR0:
    804          default:
    805             /* Semantic indices should be zero-based because drivers may choose
    806              * to assign a fixed slot determined by that index.
    807              * This is useful because ARB_separate_shader_objects uses location
    808              * qualifiers for linkage, and if the semantic index corresponds to
    809              * these locations, linkage passes in the driver become unecessary.
    810              *
    811              * If needs_texcoord_semantic is true, no semantic indices will be
    812              * consumed for the TEXi varyings, and we can base the locations of
    813              * the user varyings on VAR0.  Otherwise, we use TEX0 as base index.
    814              */
    815             assert(attr >= VARYING_SLOT_VAR0 || attr == VARYING_SLOT_PNTC ||
    816                    (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7));
    817             input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
    818             input_semantic_index[slot] = st_get_generic_varying_index(st, attr);
    819             if (attr == VARYING_SLOT_PNTC)
    820                interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
    821             else {
    822                interpMode[slot] = stfp->glsl_to_tgsi ?
    823                   TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_PERSPECTIVE;
    824             }
    825             break;
    826          }
    827       }
    828       else {
    829          inputMapping[attr] = -1;
    830       }
    831    }
    832 
    833    /*
    834     * Semantics and mapping for outputs
    835     */
    836    GLbitfield64 outputsWritten = stfp->Base.info.outputs_written;
    837 
    838    /* if z is written, emit that first */
    839    if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
    840       fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
    841       fs_output_semantic_index[fs_num_outputs] = 0;
    842       outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
    843       fs_num_outputs++;
    844       outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
    845    }
    846 
    847    if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
    848       fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL;
    849       fs_output_semantic_index[fs_num_outputs] = 0;
    850       outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
    851       fs_num_outputs++;
    852       outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
    853    }
    854 
    855    if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)) {
    856       fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_SAMPLEMASK;
    857       fs_output_semantic_index[fs_num_outputs] = 0;
    858       outputMapping[FRAG_RESULT_SAMPLE_MASK] = fs_num_outputs;
    859       fs_num_outputs++;
    860       outputsWritten &= ~(1 << FRAG_RESULT_SAMPLE_MASK);
    861    }
    862 
    863    /* handle remaining outputs (color) */
    864    for (attr = 0; attr < ARRAY_SIZE(outputMapping); attr++) {
    865       const GLbitfield64 written = attr < FRAG_RESULT_MAX ? outputsWritten :
    866          stfp->Base.SecondaryOutputsWritten;
    867       const unsigned loc = attr % FRAG_RESULT_MAX;
    868 
    869       if (written & BITFIELD64_BIT(loc)) {
    870          switch (loc) {
    871          case FRAG_RESULT_DEPTH:
    872          case FRAG_RESULT_STENCIL:
    873          case FRAG_RESULT_SAMPLE_MASK:
    874             /* handled above */
    875             assert(0);
    876             break;
    877          case FRAG_RESULT_COLOR:
    878             write_all = GL_TRUE; /* fallthrough */
    879          default: {
    880             int index;
    881             assert(loc == FRAG_RESULT_COLOR ||
    882                    (FRAG_RESULT_DATA0 <= loc && loc < FRAG_RESULT_MAX));
    883 
    884             index = (loc == FRAG_RESULT_COLOR) ? 0 : (loc - FRAG_RESULT_DATA0);
    885 
    886             if (attr >= FRAG_RESULT_MAX) {
    887                /* Secondary color for dual source blending. */
    888                assert(index == 0);
    889                index++;
    890             }
    891 
    892             fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
    893             fs_output_semantic_index[fs_num_outputs] = index;
    894             outputMapping[attr] = fs_num_outputs;
    895             break;
    896          }
    897          }
    898 
    899          fs_num_outputs++;
    900       }
    901    }
    902 
    903    /* We have already compiler to NIR so just return */
    904    if (stfp->shader_program)
    905       return true;
    906 
    907    ureg = ureg_create_with_screen(PIPE_SHADER_FRAGMENT, st->pipe->screen);
    908    if (ureg == NULL)
    909       return false;
    910 
    911    if (ST_DEBUG & DEBUG_MESA) {
    912       _mesa_print_program(&stfp->Base);
    913       _mesa_print_program_parameters(st->ctx, &stfp->Base);
    914       debug_printf("\n");
    915    }
    916    if (write_all == GL_TRUE)
    917       ureg_property(ureg, TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS, 1);
    918 
    919    if (stfp->Base.info.fs.depth_layout != FRAG_DEPTH_LAYOUT_NONE) {
    920       switch (stfp->Base.info.fs.depth_layout) {
    921       case FRAG_DEPTH_LAYOUT_ANY:
    922          ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
    923                        TGSI_FS_DEPTH_LAYOUT_ANY);
    924          break;
    925       case FRAG_DEPTH_LAYOUT_GREATER:
    926          ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
    927                        TGSI_FS_DEPTH_LAYOUT_GREATER);
    928          break;
    929       case FRAG_DEPTH_LAYOUT_LESS:
    930          ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
    931                        TGSI_FS_DEPTH_LAYOUT_LESS);
    932          break;
    933       case FRAG_DEPTH_LAYOUT_UNCHANGED:
    934          ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
    935                        TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
    936          break;
    937       default:
    938          assert(0);
    939       }
    940    }
    941 
    942    if (stfp->glsl_to_tgsi) {
    943       st_translate_program(st->ctx,
    944                            PIPE_SHADER_FRAGMENT,
    945                            ureg,
    946                            stfp->glsl_to_tgsi,
    947                            &stfp->Base,
    948                            /* inputs */
    949                            fs_num_inputs,
    950                            inputMapping,
    951                            inputSlotToAttr,
    952                            input_semantic_name,
    953                            input_semantic_index,
    954                            interpMode,
    955                            /* outputs */
    956                            fs_num_outputs,
    957                            outputMapping,
    958                            fs_output_semantic_name,
    959                            fs_output_semantic_index);
    960 
    961       free_glsl_to_tgsi_visitor(stfp->glsl_to_tgsi);
    962    } else if (stfp->ati_fs)
    963       st_translate_atifs_program(ureg,
    964                                  stfp->ati_fs,
    965                                  &stfp->Base,
    966                                  /* inputs */
    967                                  fs_num_inputs,
    968                                  inputMapping,
    969                                  input_semantic_name,
    970                                  input_semantic_index,
    971                                  interpMode,
    972                                  /* outputs */
    973                                  fs_num_outputs,
    974                                  outputMapping,
    975                                  fs_output_semantic_name,
    976                                  fs_output_semantic_index);
    977    else
    978       st_translate_mesa_program(st->ctx,
    979                                 PIPE_SHADER_FRAGMENT,
    980                                 ureg,
    981                                 &stfp->Base,
    982                                 /* inputs */
    983                                 fs_num_inputs,
    984                                 inputMapping,
    985                                 input_semantic_name,
    986                                 input_semantic_index,
    987                                 interpMode,
    988                                 /* outputs */
    989                                 fs_num_outputs,
    990                                 outputMapping,
    991                                 fs_output_semantic_name,
    992                                 fs_output_semantic_index);
    993 
    994    stfp->tgsi.tokens = ureg_get_tokens(ureg, &stfp->num_tgsi_tokens);
    995    ureg_destroy(ureg);
    996 
    997    if (stfp->glsl_to_tgsi) {
    998       stfp->glsl_to_tgsi = NULL;
    999       st_store_tgsi_in_disk_cache(st, &stfp->Base);
   1000    }
   1001 
   1002    return stfp->tgsi.tokens != NULL;
   1003 }
   1004 
   1005 static struct st_fp_variant *
   1006 st_create_fp_variant(struct st_context *st,
   1007                      struct st_fragment_program *stfp,
   1008                      const struct st_fp_variant_key *key)
   1009 {
   1010    struct pipe_context *pipe = st->pipe;
   1011    struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant);
   1012    struct pipe_shader_state tgsi = {0};
   1013    struct gl_program_parameter_list *params = stfp->Base.Parameters;
   1014    static const gl_state_index texcoord_state[STATE_LENGTH] =
   1015       { STATE_INTERNAL, STATE_CURRENT_ATTRIB, VERT_ATTRIB_TEX0 };
   1016    static const gl_state_index scale_state[STATE_LENGTH] =
   1017       { STATE_INTERNAL, STATE_PT_SCALE };
   1018    static const gl_state_index bias_state[STATE_LENGTH] =
   1019       { STATE_INTERNAL, STATE_PT_BIAS };
   1020 
   1021    if (!variant)
   1022       return NULL;
   1023 
   1024    if (stfp->tgsi.type == PIPE_SHADER_IR_NIR) {
   1025       tgsi.type = PIPE_SHADER_IR_NIR;
   1026       tgsi.ir.nir = nir_shader_clone(NULL, stfp->tgsi.ir.nir);
   1027 
   1028       if (key->clamp_color)
   1029          NIR_PASS_V(tgsi.ir.nir, nir_lower_clamp_color_outputs);
   1030 
   1031       if (key->persample_shading) {
   1032           nir_shader *shader = tgsi.ir.nir;
   1033           nir_foreach_variable(var, &shader->inputs)
   1034              var->data.sample = true;
   1035       }
   1036 
   1037       assert(!(key->bitmap && key->drawpixels));
   1038 
   1039       /* glBitmap */
   1040       if (key->bitmap) {
   1041          nir_lower_bitmap_options options = {0};
   1042 
   1043          variant->bitmap_sampler = ffs(~stfp->Base.SamplersUsed) - 1;
   1044          options.sampler = variant->bitmap_sampler;
   1045          options.swizzle_xxxx = (st->bitmap.tex_format == PIPE_FORMAT_L8_UNORM);
   1046 
   1047          NIR_PASS_V(tgsi.ir.nir, nir_lower_bitmap, &options);
   1048       }
   1049 
   1050       /* glDrawPixels (color only) */
   1051       if (key->drawpixels) {
   1052          nir_lower_drawpixels_options options = {{0}};
   1053          unsigned samplers_used = stfp->Base.SamplersUsed;
   1054 
   1055          /* Find the first unused slot. */
   1056          variant->drawpix_sampler = ffs(~samplers_used) - 1;
   1057          options.drawpix_sampler = variant->drawpix_sampler;
   1058          samplers_used |= (1 << variant->drawpix_sampler);
   1059 
   1060          options.pixel_maps = key->pixelMaps;
   1061          if (key->pixelMaps) {
   1062             variant->pixelmap_sampler = ffs(~samplers_used) - 1;
   1063             options.pixelmap_sampler = variant->pixelmap_sampler;
   1064          }
   1065 
   1066          options.scale_and_bias = key->scaleAndBias;
   1067          if (key->scaleAndBias) {
   1068             _mesa_add_state_reference(params, scale_state);
   1069             memcpy(options.scale_state_tokens, scale_state,
   1070                    sizeof(options.scale_state_tokens));
   1071             _mesa_add_state_reference(params, bias_state);
   1072             memcpy(options.bias_state_tokens, bias_state,
   1073                    sizeof(options.bias_state_tokens));
   1074          }
   1075 
   1076          _mesa_add_state_reference(params, texcoord_state);
   1077          memcpy(options.texcoord_state_tokens, texcoord_state,
   1078                 sizeof(options.texcoord_state_tokens));
   1079 
   1080          NIR_PASS_V(tgsi.ir.nir, nir_lower_drawpixels, &options);
   1081       }
   1082 
   1083       if (unlikely(key->external.lower_nv12 || key->external.lower_iyuv)) {
   1084          nir_lower_tex_options options = {0};
   1085          options.lower_y_uv_external = key->external.lower_nv12;
   1086          options.lower_y_u_v_external = key->external.lower_iyuv;
   1087          NIR_PASS_V(tgsi.ir.nir, nir_lower_tex, &options);
   1088       }
   1089 
   1090       st_finalize_nir(st, &stfp->Base, stfp->shader_program, tgsi.ir.nir);
   1091 
   1092       if (unlikely(key->external.lower_nv12 || key->external.lower_iyuv)) {
   1093          /* This pass needs to happen *after* nir_lower_sampler */
   1094          NIR_PASS_V(tgsi.ir.nir, st_nir_lower_tex_src_plane,
   1095                     ~stfp->Base.SamplersUsed,
   1096                     key->external.lower_nv12,
   1097                     key->external.lower_iyuv);
   1098       }
   1099 
   1100       variant->driver_shader = pipe->create_fs_state(pipe, &tgsi);
   1101       variant->key = *key;
   1102 
   1103       return variant;
   1104    }
   1105 
   1106    tgsi.tokens = stfp->tgsi.tokens;
   1107 
   1108    assert(!(key->bitmap && key->drawpixels));
   1109 
   1110    /* Fix texture targets and add fog for ATI_fs */
   1111    if (stfp->ati_fs) {
   1112       const struct tgsi_token *tokens = st_fixup_atifs(tgsi.tokens, key);
   1113 
   1114       if (tokens)
   1115          tgsi.tokens = tokens;
   1116       else
   1117          fprintf(stderr, "mesa: cannot post-process ATI_fs\n");
   1118    }
   1119 
   1120    /* Emulate features. */
   1121    if (key->clamp_color || key->persample_shading) {
   1122       const struct tgsi_token *tokens;
   1123       unsigned flags =
   1124          (key->clamp_color ? TGSI_EMU_CLAMP_COLOR_OUTPUTS : 0) |
   1125          (key->persample_shading ? TGSI_EMU_FORCE_PERSAMPLE_INTERP : 0);
   1126 
   1127       tokens = tgsi_emulate(tgsi.tokens, flags);
   1128 
   1129       if (tokens) {
   1130          if (tgsi.tokens != stfp->tgsi.tokens)
   1131             tgsi_free_tokens(tgsi.tokens);
   1132          tgsi.tokens = tokens;
   1133       } else
   1134          fprintf(stderr, "mesa: cannot emulate deprecated features\n");
   1135    }
   1136 
   1137    /* glBitmap */
   1138    if (key->bitmap) {
   1139       const struct tgsi_token *tokens;
   1140 
   1141       variant->bitmap_sampler = ffs(~stfp->Base.SamplersUsed) - 1;
   1142 
   1143       tokens = st_get_bitmap_shader(tgsi.tokens,
   1144                                     st->internal_target,
   1145                                     variant->bitmap_sampler,
   1146                                     st->needs_texcoord_semantic,
   1147                                     st->bitmap.tex_format ==
   1148                                     PIPE_FORMAT_L8_UNORM);
   1149 
   1150       if (tokens) {
   1151          if (tgsi.tokens != stfp->tgsi.tokens)
   1152             tgsi_free_tokens(tgsi.tokens);
   1153          tgsi.tokens = tokens;
   1154       } else
   1155          fprintf(stderr, "mesa: cannot create a shader for glBitmap\n");
   1156    }
   1157 
   1158    /* glDrawPixels (color only) */
   1159    if (key->drawpixels) {
   1160       const struct tgsi_token *tokens;
   1161       unsigned scale_const = 0, bias_const = 0, texcoord_const = 0;
   1162 
   1163       /* Find the first unused slot. */
   1164       variant->drawpix_sampler = ffs(~stfp->Base.SamplersUsed) - 1;
   1165 
   1166       if (key->pixelMaps) {
   1167          unsigned samplers_used = stfp->Base.SamplersUsed |
   1168                                   (1 << variant->drawpix_sampler);
   1169 
   1170          variant->pixelmap_sampler = ffs(~samplers_used) - 1;
   1171       }
   1172 
   1173       if (key->scaleAndBias) {
   1174          scale_const = _mesa_add_state_reference(params, scale_state);
   1175          bias_const = _mesa_add_state_reference(params, bias_state);
   1176       }
   1177 
   1178       texcoord_const = _mesa_add_state_reference(params, texcoord_state);
   1179 
   1180       tokens = st_get_drawpix_shader(tgsi.tokens,
   1181                                      st->needs_texcoord_semantic,
   1182                                      key->scaleAndBias, scale_const,
   1183                                      bias_const, key->pixelMaps,
   1184                                      variant->drawpix_sampler,
   1185                                      variant->pixelmap_sampler,
   1186                                      texcoord_const, st->internal_target);
   1187 
   1188       if (tokens) {
   1189          if (tgsi.tokens != stfp->tgsi.tokens)
   1190             tgsi_free_tokens(tgsi.tokens);
   1191          tgsi.tokens = tokens;
   1192       } else
   1193          fprintf(stderr, "mesa: cannot create a shader for glDrawPixels\n");
   1194    }
   1195 
   1196    if (unlikely(key->external.lower_nv12 || key->external.lower_iyuv)) {
   1197       const struct tgsi_token *tokens;
   1198 
   1199       /* samplers inserted would conflict, but this should be unpossible: */
   1200       assert(!(key->bitmap || key->drawpixels));
   1201 
   1202       tokens = st_tgsi_lower_yuv(tgsi.tokens,
   1203                                  ~stfp->Base.SamplersUsed,
   1204                                  key->external.lower_nv12,
   1205                                  key->external.lower_iyuv);
   1206       if (tokens) {
   1207          if (tgsi.tokens != stfp->tgsi.tokens)
   1208             tgsi_free_tokens(tgsi.tokens);
   1209          tgsi.tokens = tokens;
   1210       } else {
   1211          fprintf(stderr, "mesa: cannot create a shader for samplerExternalOES\n");
   1212       }
   1213    }
   1214 
   1215    if (ST_DEBUG & DEBUG_TGSI) {
   1216       tgsi_dump(tgsi.tokens, 0);
   1217       debug_printf("\n");
   1218    }
   1219 
   1220    /* fill in variant */
   1221    variant->driver_shader = pipe->create_fs_state(pipe, &tgsi);
   1222    variant->key = *key;
   1223 
   1224    if (tgsi.tokens != stfp->tgsi.tokens)
   1225       tgsi_free_tokens(tgsi.tokens);
   1226    return variant;
   1227 }
   1228 
   1229 /**
   1230  * Translate fragment program if needed.
   1231  */
   1232 struct st_fp_variant *
   1233 st_get_fp_variant(struct st_context *st,
   1234                   struct st_fragment_program *stfp,
   1235                   const struct st_fp_variant_key *key)
   1236 {
   1237    struct st_fp_variant *fpv;
   1238 
   1239    /* Search for existing variant */
   1240    for (fpv = stfp->variants; fpv; fpv = fpv->next) {
   1241       if (memcmp(&fpv->key, key, sizeof(*key)) == 0) {
   1242          break;
   1243       }
   1244    }
   1245 
   1246    if (!fpv) {
   1247       /* create new */
   1248       fpv = st_create_fp_variant(st, stfp, key);
   1249       if (fpv) {
   1250          if (key->bitmap || key->drawpixels) {
   1251             /* Regular variants should always come before the
   1252              * bitmap & drawpixels variants, (unless there
   1253              * are no regular variants) so that
   1254              * st_update_fp can take a fast path when
   1255              * shader_has_one_variant is set.
   1256              */
   1257             if (!stfp->variants) {
   1258                stfp->variants = fpv;
   1259             } else {
   1260                /* insert into list after the first one */
   1261                fpv->next = stfp->variants->next;
   1262                stfp->variants->next = fpv;
   1263             }
   1264          } else {
   1265             /* insert into list */
   1266             fpv->next = stfp->variants;
   1267             stfp->variants = fpv;
   1268          }
   1269       }
   1270    }
   1271 
   1272    return fpv;
   1273 }
   1274 
   1275 
   1276 /**
   1277  * Translate a program. This is common code for geometry and tessellation
   1278  * shaders.
   1279  */
   1280 static void
   1281 st_translate_program_common(struct st_context *st,
   1282                             struct gl_program *prog,
   1283                             struct glsl_to_tgsi_visitor *glsl_to_tgsi,
   1284                             struct ureg_program *ureg,
   1285                             unsigned tgsi_processor,
   1286                             struct pipe_shader_state *out_state)
   1287 {
   1288    ubyte inputSlotToAttr[VARYING_SLOT_TESS_MAX];
   1289    ubyte inputMapping[VARYING_SLOT_TESS_MAX];
   1290    ubyte outputMapping[VARYING_SLOT_TESS_MAX];
   1291    GLuint attr;
   1292 
   1293    ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
   1294    ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
   1295    uint num_inputs = 0;
   1296 
   1297    ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
   1298    ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
   1299    uint num_outputs = 0;
   1300 
   1301    GLint i;
   1302 
   1303    memset(inputSlotToAttr, 0, sizeof(inputSlotToAttr));
   1304    memset(inputMapping, 0, sizeof(inputMapping));
   1305    memset(outputMapping, 0, sizeof(outputMapping));
   1306    memset(out_state, 0, sizeof(*out_state));
   1307 
   1308    if (prog->info.clip_distance_array_size)
   1309       ureg_property(ureg, TGSI_PROPERTY_NUM_CLIPDIST_ENABLED,
   1310                     prog->info.clip_distance_array_size);
   1311    if (prog->info.cull_distance_array_size)
   1312       ureg_property(ureg, TGSI_PROPERTY_NUM_CULLDIST_ENABLED,
   1313                     prog->info.cull_distance_array_size);
   1314 
   1315    /*
   1316     * Convert Mesa program inputs to TGSI input register semantics.
   1317     */
   1318    for (attr = 0; attr < VARYING_SLOT_MAX; attr++) {
   1319       if ((prog->info.inputs_read & BITFIELD64_BIT(attr)) == 0)
   1320          continue;
   1321 
   1322       unsigned slot = num_inputs++;
   1323 
   1324       inputMapping[attr] = slot;
   1325       inputSlotToAttr[slot] = attr;
   1326 
   1327       unsigned semantic_name, semantic_index;
   1328       tgsi_get_gl_varying_semantic(attr, st->needs_texcoord_semantic,
   1329                                    &semantic_name, &semantic_index);
   1330       input_semantic_name[slot] = semantic_name;
   1331       input_semantic_index[slot] = semantic_index;
   1332    }
   1333 
   1334    /* Also add patch inputs. */
   1335    for (attr = 0; attr < 32; attr++) {
   1336       if (prog->info.patch_inputs_read & (1u << attr)) {
   1337          GLuint slot = num_inputs++;
   1338          GLuint patch_attr = VARYING_SLOT_PATCH0 + attr;
   1339 
   1340          inputMapping[patch_attr] = slot;
   1341          inputSlotToAttr[slot] = patch_attr;
   1342          input_semantic_name[slot] = TGSI_SEMANTIC_PATCH;
   1343          input_semantic_index[slot] = attr;
   1344       }
   1345    }
   1346 
   1347    /* initialize output semantics to defaults */
   1348    for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) {
   1349       output_semantic_name[i] = TGSI_SEMANTIC_GENERIC;
   1350       output_semantic_index[i] = 0;
   1351    }
   1352 
   1353    /*
   1354     * Determine number of outputs, the (default) output register
   1355     * mapping and the semantic information for each output.
   1356     */
   1357    for (attr = 0; attr < VARYING_SLOT_MAX; attr++) {
   1358       if (prog->info.outputs_written & BITFIELD64_BIT(attr)) {
   1359          GLuint slot = num_outputs++;
   1360 
   1361          outputMapping[attr] = slot;
   1362 
   1363          unsigned semantic_name, semantic_index;
   1364          tgsi_get_gl_varying_semantic(attr, st->needs_texcoord_semantic,
   1365                                       &semantic_name, &semantic_index);
   1366          output_semantic_name[slot] = semantic_name;
   1367          output_semantic_index[slot] = semantic_index;
   1368       }
   1369    }
   1370 
   1371    /* Also add patch outputs. */
   1372    for (attr = 0; attr < 32; attr++) {
   1373       if (prog->info.patch_outputs_written & (1u << attr)) {
   1374          GLuint slot = num_outputs++;
   1375          GLuint patch_attr = VARYING_SLOT_PATCH0 + attr;
   1376 
   1377          outputMapping[patch_attr] = slot;
   1378          output_semantic_name[slot] = TGSI_SEMANTIC_PATCH;
   1379          output_semantic_index[slot] = attr;
   1380       }
   1381    }
   1382 
   1383    st_translate_program(st->ctx,
   1384                         tgsi_processor,
   1385                         ureg,
   1386                         glsl_to_tgsi,
   1387                         prog,
   1388                         /* inputs */
   1389                         num_inputs,
   1390                         inputMapping,
   1391                         inputSlotToAttr,
   1392                         input_semantic_name,
   1393                         input_semantic_index,
   1394                         NULL,
   1395                         /* outputs */
   1396                         num_outputs,
   1397                         outputMapping,
   1398                         output_semantic_name,
   1399                         output_semantic_index);
   1400 
   1401    if (tgsi_processor == PIPE_SHADER_COMPUTE) {
   1402       struct st_compute_program *stcp = (struct st_compute_program *) prog;
   1403       out_state->tokens = ureg_get_tokens(ureg, &stcp->num_tgsi_tokens);
   1404       stcp->tgsi.prog = out_state->tokens;
   1405    } else {
   1406       struct st_common_program *stcp = (struct st_common_program *) prog;
   1407       out_state->tokens = ureg_get_tokens(ureg, &stcp->num_tgsi_tokens);
   1408    }
   1409    ureg_destroy(ureg);
   1410 
   1411    st_translate_stream_output_info(glsl_to_tgsi,
   1412                                    outputMapping,
   1413                                    &out_state->stream_output);
   1414 
   1415    st_store_tgsi_in_disk_cache(st, prog);
   1416 
   1417    if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
   1418       _mesa_print_program(prog);
   1419       debug_printf("\n");
   1420    }
   1421 
   1422    if (ST_DEBUG & DEBUG_TGSI) {
   1423       tgsi_dump(out_state->tokens, 0);
   1424       debug_printf("\n");
   1425    }
   1426 }
   1427 
   1428 /**
   1429  * Update stream-output info for GS/TCS/TES.  Normally this is done in
   1430  * st_translate_program_common() but that is not called for glsl_to_nir
   1431  * case.
   1432  */
   1433 static void
   1434 st_translate_program_stream_output(struct gl_program *prog,
   1435                                    struct pipe_stream_output_info *stream_output)
   1436 {
   1437    if (!prog->sh.LinkedTransformFeedback)
   1438       return;
   1439 
   1440    ubyte outputMapping[VARYING_SLOT_TESS_MAX];
   1441    GLuint attr;
   1442    uint num_outputs = 0;
   1443 
   1444    memset(outputMapping, 0, sizeof(outputMapping));
   1445 
   1446    /*
   1447     * Determine number of outputs, the (default) output register
   1448     * mapping and the semantic information for each output.
   1449     */
   1450    for (attr = 0; attr < VARYING_SLOT_MAX; attr++) {
   1451       if (prog->info.outputs_written & BITFIELD64_BIT(attr)) {
   1452          GLuint slot = num_outputs++;
   1453 
   1454          outputMapping[attr] = slot;
   1455       }
   1456    }
   1457 
   1458    st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback,
   1459                                     outputMapping,
   1460                                     stream_output);
   1461 }
   1462 
   1463 /**
   1464  * Translate a geometry program to create a new variant.
   1465  */
   1466 bool
   1467 st_translate_geometry_program(struct st_context *st,
   1468                               struct st_common_program *stgp)
   1469 {
   1470    struct ureg_program *ureg;
   1471 
   1472    /* We have already compiled to NIR so just return */
   1473    if (stgp->shader_program) {
   1474       st_translate_program_stream_output(&stgp->Base, &stgp->tgsi.stream_output);
   1475       return true;
   1476    }
   1477 
   1478    ureg = ureg_create_with_screen(PIPE_SHADER_GEOMETRY, st->pipe->screen);
   1479    if (ureg == NULL)
   1480       return false;
   1481 
   1482    ureg_property(ureg, TGSI_PROPERTY_GS_INPUT_PRIM,
   1483                  stgp->Base.info.gs.input_primitive);
   1484    ureg_property(ureg, TGSI_PROPERTY_GS_OUTPUT_PRIM,
   1485                  stgp->Base.info.gs.output_primitive);
   1486    ureg_property(ureg, TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES,
   1487                  stgp->Base.info.gs.vertices_out);
   1488    ureg_property(ureg, TGSI_PROPERTY_GS_INVOCATIONS,
   1489                  stgp->Base.info.gs.invocations);
   1490 
   1491    st_translate_program_common(st, &stgp->Base, stgp->glsl_to_tgsi, ureg,
   1492                                PIPE_SHADER_GEOMETRY, &stgp->tgsi);
   1493 
   1494    free_glsl_to_tgsi_visitor(stgp->glsl_to_tgsi);
   1495    stgp->glsl_to_tgsi = NULL;
   1496    return true;
   1497 }
   1498 
   1499 
   1500 /**
   1501  * Get/create a basic program variant.
   1502  */
   1503 struct st_basic_variant *
   1504 st_get_basic_variant(struct st_context *st,
   1505                      unsigned pipe_shader,
   1506                      struct st_common_program *prog)
   1507 {
   1508    struct pipe_context *pipe = st->pipe;
   1509    struct st_basic_variant *v;
   1510    struct st_basic_variant_key key;
   1511    struct pipe_shader_state tgsi = {0};
   1512    memset(&key, 0, sizeof(key));
   1513    key.st = st->has_shareable_shaders ? NULL : st;
   1514 
   1515    /* Search for existing variant */
   1516    for (v = prog->variants; v; v = v->next) {
   1517       if (memcmp(&v->key, &key, sizeof(key)) == 0) {
   1518          break;
   1519       }
   1520    }
   1521 
   1522    if (!v) {
   1523       /* create new */
   1524       v = CALLOC_STRUCT(st_basic_variant);
   1525       if (v) {
   1526 
   1527 	 if (prog->tgsi.type == PIPE_SHADER_IR_NIR) {
   1528 	    tgsi.type = PIPE_SHADER_IR_NIR;
   1529 	    tgsi.ir.nir = nir_shader_clone(NULL, prog->tgsi.ir.nir);
   1530 	    st_finalize_nir(st, &prog->Base, prog->shader_program,
   1531                             tgsi.ir.nir);
   1532             tgsi.stream_output = prog->tgsi.stream_output;
   1533 	 } else
   1534 	    tgsi = prog->tgsi;
   1535          /* fill in new variant */
   1536          switch (pipe_shader) {
   1537          case PIPE_SHADER_TESS_CTRL:
   1538             v->driver_shader = pipe->create_tcs_state(pipe, &tgsi);
   1539             break;
   1540          case PIPE_SHADER_TESS_EVAL:
   1541             v->driver_shader = pipe->create_tes_state(pipe, &tgsi);
   1542             break;
   1543          case PIPE_SHADER_GEOMETRY:
   1544             v->driver_shader = pipe->create_gs_state(pipe, &tgsi);
   1545             break;
   1546          default:
   1547             assert(!"unhandled shader type");
   1548             free(v);
   1549             return NULL;
   1550          }
   1551 
   1552          v->key = key;
   1553 
   1554          /* insert into list */
   1555          v->next = prog->variants;
   1556          prog->variants = v;
   1557       }
   1558    }
   1559 
   1560    return v;
   1561 }
   1562 
   1563 
   1564 /**
   1565  * Translate a tessellation control program to create a new variant.
   1566  */
   1567 bool
   1568 st_translate_tessctrl_program(struct st_context *st,
   1569                               struct st_common_program *sttcp)
   1570 {
   1571    struct ureg_program *ureg;
   1572 
   1573    /* We have already compiled to NIR so just return */
   1574    if (sttcp->shader_program)
   1575       return true;
   1576 
   1577    ureg = ureg_create_with_screen(PIPE_SHADER_TESS_CTRL, st->pipe->screen);
   1578    if (ureg == NULL)
   1579       return false;
   1580 
   1581    ureg_property(ureg, TGSI_PROPERTY_TCS_VERTICES_OUT,
   1582                  sttcp->Base.info.tess.tcs_vertices_out);
   1583 
   1584    st_translate_program_common(st, &sttcp->Base, sttcp->glsl_to_tgsi, ureg,
   1585                                PIPE_SHADER_TESS_CTRL, &sttcp->tgsi);
   1586 
   1587    free_glsl_to_tgsi_visitor(sttcp->glsl_to_tgsi);
   1588    sttcp->glsl_to_tgsi = NULL;
   1589    return true;
   1590 }
   1591 
   1592 
   1593 /**
   1594  * Translate a tessellation evaluation program to create a new variant.
   1595  */
   1596 bool
   1597 st_translate_tesseval_program(struct st_context *st,
   1598                               struct st_common_program *sttep)
   1599 {
   1600    struct ureg_program *ureg;
   1601 
   1602    /* We have already compiled to NIR so just return */
   1603    if (sttep->shader_program) {
   1604       st_translate_program_stream_output(&sttep->Base, &sttep->tgsi.stream_output);
   1605       return true;
   1606    }
   1607 
   1608    ureg = ureg_create_with_screen(PIPE_SHADER_TESS_EVAL, st->pipe->screen);
   1609    if (ureg == NULL)
   1610       return false;
   1611 
   1612    if (sttep->Base.info.tess.primitive_mode == GL_ISOLINES)
   1613       ureg_property(ureg, TGSI_PROPERTY_TES_PRIM_MODE, GL_LINES);
   1614    else
   1615       ureg_property(ureg, TGSI_PROPERTY_TES_PRIM_MODE,
   1616                     sttep->Base.info.tess.primitive_mode);
   1617 
   1618    STATIC_ASSERT((TESS_SPACING_EQUAL + 1) % 3 == PIPE_TESS_SPACING_EQUAL);
   1619    STATIC_ASSERT((TESS_SPACING_FRACTIONAL_ODD + 1) % 3 ==
   1620                  PIPE_TESS_SPACING_FRACTIONAL_ODD);
   1621    STATIC_ASSERT((TESS_SPACING_FRACTIONAL_EVEN + 1) % 3 ==
   1622                  PIPE_TESS_SPACING_FRACTIONAL_EVEN);
   1623 
   1624    ureg_property(ureg, TGSI_PROPERTY_TES_SPACING,
   1625                  (sttep->Base.info.tess.spacing + 1) % 3);
   1626 
   1627    ureg_property(ureg, TGSI_PROPERTY_TES_VERTEX_ORDER_CW,
   1628                  !sttep->Base.info.tess.ccw);
   1629    ureg_property(ureg, TGSI_PROPERTY_TES_POINT_MODE,
   1630                  sttep->Base.info.tess.point_mode);
   1631 
   1632    st_translate_program_common(st, &sttep->Base, sttep->glsl_to_tgsi,
   1633                                ureg, PIPE_SHADER_TESS_EVAL, &sttep->tgsi);
   1634 
   1635    free_glsl_to_tgsi_visitor(sttep->glsl_to_tgsi);
   1636    sttep->glsl_to_tgsi = NULL;
   1637    return true;
   1638 }
   1639 
   1640 
   1641 /**
   1642  * Translate a compute program to create a new variant.
   1643  */
   1644 bool
   1645 st_translate_compute_program(struct st_context *st,
   1646                              struct st_compute_program *stcp)
   1647 {
   1648    struct ureg_program *ureg;
   1649    struct pipe_shader_state prog;
   1650 
   1651    if (stcp->shader_program) {
   1652       /* no compute variants: */
   1653       st_finalize_nir(st, &stcp->Base, stcp->shader_program,
   1654                       (struct nir_shader *) stcp->tgsi.prog);
   1655 
   1656       return true;
   1657    }
   1658 
   1659    ureg = ureg_create_with_screen(PIPE_SHADER_COMPUTE, st->pipe->screen);
   1660    if (ureg == NULL)
   1661       return false;
   1662 
   1663    st_translate_program_common(st, &stcp->Base, stcp->glsl_to_tgsi, ureg,
   1664                                PIPE_SHADER_COMPUTE, &prog);
   1665 
   1666    stcp->tgsi.ir_type = PIPE_SHADER_IR_TGSI;
   1667    stcp->tgsi.req_local_mem = stcp->Base.info.cs.shared_size;
   1668    stcp->tgsi.req_private_mem = 0;
   1669    stcp->tgsi.req_input_mem = 0;
   1670 
   1671    free_glsl_to_tgsi_visitor(stcp->glsl_to_tgsi);
   1672    stcp->glsl_to_tgsi = NULL;
   1673    return true;
   1674 }
   1675 
   1676 
   1677 /**
   1678  * Get/create compute program variant.
   1679  */
   1680 struct st_basic_variant *
   1681 st_get_cp_variant(struct st_context *st,
   1682                   struct pipe_compute_state *tgsi,
   1683                   struct st_basic_variant **variants)
   1684 {
   1685    struct pipe_context *pipe = st->pipe;
   1686    struct st_basic_variant *v;
   1687    struct st_basic_variant_key key;
   1688 
   1689    memset(&key, 0, sizeof(key));
   1690    key.st = st->has_shareable_shaders ? NULL : st;
   1691 
   1692    /* Search for existing variant */
   1693    for (v = *variants; v; v = v->next) {
   1694       if (memcmp(&v->key, &key, sizeof(key)) == 0) {
   1695          break;
   1696       }
   1697    }
   1698 
   1699    if (!v) {
   1700       /* create new */
   1701       v = CALLOC_STRUCT(st_basic_variant);
   1702       if (v) {
   1703          /* fill in new variant */
   1704          struct pipe_compute_state cs = *tgsi;
   1705          if (tgsi->ir_type == PIPE_SHADER_IR_NIR)
   1706             cs.prog = nir_shader_clone(NULL, tgsi->prog);
   1707          v->driver_shader = pipe->create_compute_state(pipe, &cs);
   1708          v->key = key;
   1709 
   1710          /* insert into list */
   1711          v->next = *variants;
   1712          *variants = v;
   1713       }
   1714    }
   1715 
   1716    return v;
   1717 }
   1718 
   1719 
   1720 /**
   1721  * Vert/Geom/Frag programs have per-context variants.  Free all the
   1722  * variants attached to the given program which match the given context.
   1723  */
   1724 static void
   1725 destroy_program_variants(struct st_context *st, struct gl_program *target)
   1726 {
   1727    if (!target || target == &_mesa_DummyProgram)
   1728       return;
   1729 
   1730    switch (target->Target) {
   1731    case GL_VERTEX_PROGRAM_ARB:
   1732       {
   1733          struct st_vertex_program *stvp = (struct st_vertex_program *) target;
   1734          struct st_vp_variant *vpv, **prevPtr = &stvp->variants;
   1735 
   1736          for (vpv = stvp->variants; vpv; ) {
   1737             struct st_vp_variant *next = vpv->next;
   1738             if (vpv->key.st == st) {
   1739                /* unlink from list */
   1740                *prevPtr = next;
   1741                /* destroy this variant */
   1742                delete_vp_variant(st, vpv);
   1743             }
   1744             else {
   1745                prevPtr = &vpv->next;
   1746             }
   1747             vpv = next;
   1748          }
   1749       }
   1750       break;
   1751    case GL_FRAGMENT_PROGRAM_ARB:
   1752       {
   1753          struct st_fragment_program *stfp =
   1754             (struct st_fragment_program *) target;
   1755          struct st_fp_variant *fpv, **prevPtr = &stfp->variants;
   1756 
   1757          for (fpv = stfp->variants; fpv; ) {
   1758             struct st_fp_variant *next = fpv->next;
   1759             if (fpv->key.st == st) {
   1760                /* unlink from list */
   1761                *prevPtr = next;
   1762                /* destroy this variant */
   1763                delete_fp_variant(st, fpv);
   1764             }
   1765             else {
   1766                prevPtr = &fpv->next;
   1767             }
   1768             fpv = next;
   1769          }
   1770       }
   1771       break;
   1772    case GL_GEOMETRY_PROGRAM_NV:
   1773    case GL_TESS_CONTROL_PROGRAM_NV:
   1774    case GL_TESS_EVALUATION_PROGRAM_NV:
   1775    case GL_COMPUTE_PROGRAM_NV:
   1776       {
   1777          struct st_common_program *p = st_common_program(target);
   1778          struct st_compute_program *cp = (struct st_compute_program*)target;
   1779          struct st_basic_variant **variants =
   1780             target->Target == GL_COMPUTE_PROGRAM_NV ? &cp->variants :
   1781                                                       &p->variants;
   1782          struct st_basic_variant *v, **prevPtr = variants;
   1783 
   1784          for (v = *variants; v; ) {
   1785             struct st_basic_variant *next = v->next;
   1786             if (v->key.st == st) {
   1787                /* unlink from list */
   1788                *prevPtr = next;
   1789                /* destroy this variant */
   1790                delete_basic_variant(st, v, target->Target);
   1791             }
   1792             else {
   1793                prevPtr = &v->next;
   1794             }
   1795             v = next;
   1796          }
   1797       }
   1798       break;
   1799    default:
   1800       _mesa_problem(NULL, "Unexpected program target 0x%x in "
   1801                     "destroy_program_variants_cb()", target->Target);
   1802    }
   1803 }
   1804 
   1805 
   1806 /**
   1807  * Callback for _mesa_HashWalk.  Free all the shader's program variants
   1808  * which match the given context.
   1809  */
   1810 static void
   1811 destroy_shader_program_variants_cb(GLuint key, void *data, void *userData)
   1812 {
   1813    struct st_context *st = (struct st_context *) userData;
   1814    struct gl_shader *shader = (struct gl_shader *) data;
   1815 
   1816    switch (shader->Type) {
   1817    case GL_SHADER_PROGRAM_MESA:
   1818       {
   1819          struct gl_shader_program *shProg = (struct gl_shader_program *) data;
   1820          GLuint i;
   1821 
   1822 	 for (i = 0; i < ARRAY_SIZE(shProg->_LinkedShaders); i++) {
   1823 	    if (shProg->_LinkedShaders[i])
   1824                destroy_program_variants(st, shProg->_LinkedShaders[i]->Program);
   1825 	 }
   1826       }
   1827       break;
   1828    case GL_VERTEX_SHADER:
   1829    case GL_FRAGMENT_SHADER:
   1830    case GL_GEOMETRY_SHADER:
   1831    case GL_TESS_CONTROL_SHADER:
   1832    case GL_TESS_EVALUATION_SHADER:
   1833    case GL_COMPUTE_SHADER:
   1834       break;
   1835    default:
   1836       assert(0);
   1837    }
   1838 }
   1839 
   1840 
   1841 /**
   1842  * Callback for _mesa_HashWalk.  Free all the program variants which match
   1843  * the given context.
   1844  */
   1845 static void
   1846 destroy_program_variants_cb(GLuint key, void *data, void *userData)
   1847 {
   1848    struct st_context *st = (struct st_context *) userData;
   1849    struct gl_program *program = (struct gl_program *) data;
   1850    destroy_program_variants(st, program);
   1851 }
   1852 
   1853 
   1854 /**
   1855  * Walk over all shaders and programs to delete any variants which
   1856  * belong to the given context.
   1857  * This is called during context tear-down.
   1858  */
   1859 void
   1860 st_destroy_program_variants(struct st_context *st)
   1861 {
   1862    /* If shaders can be shared with other contexts, the last context will
   1863     * call DeleteProgram on all shaders, releasing everything.
   1864     */
   1865    if (st->has_shareable_shaders)
   1866       return;
   1867 
   1868    /* ARB vert/frag program */
   1869    _mesa_HashWalk(st->ctx->Shared->Programs,
   1870                   destroy_program_variants_cb, st);
   1871 
   1872    /* GLSL vert/frag/geom shaders */
   1873    _mesa_HashWalk(st->ctx->Shared->ShaderObjects,
   1874                   destroy_shader_program_variants_cb, st);
   1875 }
   1876 
   1877 
   1878 /**
   1879  * For debugging, print/dump the current vertex program.
   1880  */
   1881 void
   1882 st_print_current_vertex_program(void)
   1883 {
   1884    GET_CURRENT_CONTEXT(ctx);
   1885 
   1886    if (ctx->VertexProgram._Current) {
   1887       struct st_vertex_program *stvp =
   1888          (struct st_vertex_program *) ctx->VertexProgram._Current;
   1889       struct st_vp_variant *stv;
   1890 
   1891       debug_printf("Vertex program %u\n", stvp->Base.Id);
   1892 
   1893       for (stv = stvp->variants; stv; stv = stv->next) {
   1894          debug_printf("variant %p\n", stv);
   1895          tgsi_dump(stv->tgsi.tokens, 0);
   1896       }
   1897    }
   1898 }
   1899 
   1900 
   1901 /**
   1902  * Compile one shader variant.
   1903  */
   1904 void
   1905 st_precompile_shader_variant(struct st_context *st,
   1906                              struct gl_program *prog)
   1907 {
   1908    switch (prog->Target) {
   1909    case GL_VERTEX_PROGRAM_ARB: {
   1910       struct st_vertex_program *p = (struct st_vertex_program *)prog;
   1911       struct st_vp_variant_key key;
   1912 
   1913       memset(&key, 0, sizeof(key));
   1914       key.st = st->has_shareable_shaders ? NULL : st;
   1915       st_get_vp_variant(st, p, &key);
   1916       break;
   1917    }
   1918 
   1919    case GL_TESS_CONTROL_PROGRAM_NV: {
   1920       struct st_common_program *p = st_common_program(prog);
   1921       st_get_basic_variant(st, PIPE_SHADER_TESS_CTRL, p);
   1922       break;
   1923    }
   1924 
   1925    case GL_TESS_EVALUATION_PROGRAM_NV: {
   1926       struct st_common_program *p = st_common_program(prog);
   1927       st_get_basic_variant(st, PIPE_SHADER_TESS_EVAL, p);
   1928       break;
   1929    }
   1930 
   1931    case GL_GEOMETRY_PROGRAM_NV: {
   1932       struct st_common_program *p = st_common_program(prog);
   1933       st_get_basic_variant(st, PIPE_SHADER_GEOMETRY, p);
   1934       break;
   1935    }
   1936 
   1937    case GL_FRAGMENT_PROGRAM_ARB: {
   1938       struct st_fragment_program *p = (struct st_fragment_program *)prog;
   1939       struct st_fp_variant_key key;
   1940 
   1941       memset(&key, 0, sizeof(key));
   1942       key.st = st->has_shareable_shaders ? NULL : st;
   1943       st_get_fp_variant(st, p, &key);
   1944       break;
   1945    }
   1946 
   1947    case GL_COMPUTE_PROGRAM_NV: {
   1948       struct st_compute_program *p = (struct st_compute_program *)prog;
   1949       st_get_cp_variant(st, &p->tgsi, &p->variants);
   1950       break;
   1951    }
   1952 
   1953    default:
   1954       assert(0);
   1955    }
   1956 }
   1957