mesa: allow NULL for vertex shader when mesh pipeline

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36976>
This commit is contained in:
Qiang Yu 2025-05-14 14:57:10 +08:00
parent 3bc4004ca9
commit 51d6e4404a
3 changed files with 19 additions and 12 deletions

View file

@ -302,7 +302,7 @@ update_program(struct gl_context *ctx)
* _mesa_get_fixed_func_vertex_program() needs to know active
* fragprog inputs.
*/
if (vsProg) {
if (vsProg || msProg) {
/* Use GLSL vertex shader */
assert(VP_MODE_SHADER == ctx->VertexProgram._VPMode);
_mesa_reference_program(ctx, &ctx->VertexProgram._Current, vsProg);
@ -770,12 +770,13 @@ set_vertex_processing_mode(struct gl_context *ctx, gl_vertex_processing_mode m)
void
_mesa_update_vertex_processing_mode(struct gl_context *ctx)
{
if (ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX])
set_vertex_processing_mode(ctx, VP_MODE_SHADER);
else if (_mesa_arb_vertex_program_enabled(ctx))
set_vertex_processing_mode(ctx, VP_MODE_SHADER);
else
set_vertex_processing_mode(ctx, VP_MODE_FF);
gl_vertex_processing_mode mode =
ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX] ||
ctx->_Shader->CurrentProgram[MESA_SHADER_MESH] ||
_mesa_arb_vertex_program_enabled(ctx) ?
VP_MODE_SHADER : VP_MODE_FF;
set_vertex_processing_mode(ctx, mode);
}

View file

@ -200,14 +200,16 @@ st_update_fp( struct st_context *st )
void
st_update_vp( struct st_context *st )
{
struct gl_program *vp;
/* find active shader and params -- Should be covered by
* ST_NEW_VERTEX_PROGRAM
*/
assert(st->ctx->VertexProgram._Current);
vp = st->ctx->VertexProgram._Current;
assert(vp->info.stage == MESA_SHADER_VERTEX);
struct gl_program *vp = st->ctx->VertexProgram._Current;
if (!vp) {
_mesa_reference_program(st->ctx, &st->vp, NULL);
cso_set_vertex_shader_handle(st->cso_context, NULL);
return;
}
if (st->shader_has_one_variant[MESA_SHADER_VERTEX] &&
!st->ctx->Array._PerVertexEdgeFlagsEnabled) {

View file

@ -87,6 +87,10 @@ st_invalidate_buffers(struct st_context *st)
static inline bool
st_vp_uses_current_values(const struct gl_context *ctx)
{
/* mesh shader pipeline */
if (!ctx->VertexProgram._Current)
return false;
const uint64_t inputs = ctx->VertexProgram._Current->info.inputs_read;
return ~_mesa_get_enabled_vertex_arrays(ctx) & inputs;