diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index ad8055e3c55..4dc5c42123f 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -1955,6 +1955,35 @@ st_destroy_program_variants(struct st_context *st) destroy_shader_program_variants_cb, st); } +static bool +is_last_vertex_stage(struct gl_context *ctx, struct gl_program *prog) +{ + struct gl_program *last = NULL; + /* fixedfunc */ + if (prog->Id == 0) + return true; + + /* shader info accurately set */ + if (prog->info.next_stage == MESA_SHADER_FRAGMENT) + return true; + if (prog->info.next_stage != MESA_SHADER_VERTEX) + return false; + + /* check bound programs */ + if (ctx->GeometryProgram._Current) + last = ctx->GeometryProgram._Current; + else if (ctx->TessEvalProgram._Current) + last = ctx->TessEvalProgram._Current; + else + last = ctx->VertexProgram._Current; + if (last) + return prog == last; + + /* assume this will be the last vertex stage; + * at worst, another variant without psiz is created later + */ + return true; +} /** * Compile one shader variant. @@ -1983,6 +2012,12 @@ st_precompile_shader_variant(struct st_context *st, key.clamp_color = true; } + if (prog->Target == GL_VERTEX_PROGRAM_ARB || + prog->Target == GL_TESS_EVALUATION_PROGRAM_NV || + prog->Target == GL_GEOMETRY_PROGRAM_NV) { + if (st->ctx->API == API_OPENGLES2 || !st->ctx->VertexProgram.PointSizeEnabled) + key.export_point_size = st->lower_point_size && is_last_vertex_stage(st->ctx, prog); + } key.st = st->has_shareable_shaders ? NULL : st; st_get_common_variant(st, p, &key); break;