- memset(&key, 0, sizeof(key));
- key.st = st->has_shareable_shaders ? NULL : st;
-
- /* _NEW_FRAG_CLAMP */
- key.clamp_color = st->clamp_frag_color_in_shader &&
- st->ctx->Color._ClampFragmentColor;
-
- /* _NEW_MULTISAMPLE | _NEW_BUFFERS */
- key.persample_shading =
- st->force_persample_in_shader &&
- _mesa_is_multisample_enabled(st->ctx) &&
- st->ctx->Multisample.SampleShading &&
- st->ctx->Multisample.MinSampleShadingValue *
- _mesa_geometric_samples(st->ctx->DrawBuffer) > 1;
-
- if (stfp->ati_fs) {
- key.fog = st->ctx->Fog._PackedEnabledMode;
-
- for (unsigned u = 0; u < MAX_NUM_FRAGMENT_REGISTERS_ATI; u++) {
- key.texture_targets[u] = get_texture_target(st->ctx, u);
+ void *shader;
+
+ if (st->shader_has_one_variant[MESA_SHADER_FRAGMENT] &&
+ !stfp->ati_fs && /* ATI_fragment_shader always has multiple variants */
+ !stfp->Base.ExternalSamplersUsed && /* external samplers need variants */
+ stfp->variants) {
+ shader = stfp->variants->driver_shader;
+ } else {
+ memset(&key, 0, sizeof(key));
+ key.st = st->has_shareable_shaders ? NULL : st;
+
+ /* _NEW_FRAG_CLAMP */
+ key.clamp_color = st->clamp_frag_color_in_shader &&
+ st->ctx->Color._ClampFragmentColor;
+
+ /* _NEW_MULTISAMPLE | _NEW_BUFFERS */
+ key.persample_shading =
+ st->force_persample_in_shader &&
+ _mesa_is_multisample_enabled(st->ctx) &&
+ st->ctx->Multisample.SampleShading &&
+ st->ctx->Multisample.MinSampleShadingValue *
+ _mesa_geometric_samples(st->ctx->DrawBuffer) > 1;
+
+ if (stfp->ati_fs) {
+ key.fog = st->ctx->Fog._PackedEnabledMode;
+
+ for (unsigned u = 0; u < MAX_NUM_FRAGMENT_REGISTERS_ATI; u++) {
+ key.texture_targets[u] = get_texture_target(st->ctx, u);
+ }