From 51d6e4404aeb3a8e3c7eeb39584d590099a17402 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Wed, 14 May 2025 14:57:10 +0800 Subject: [PATCH] mesa: allow NULL for vertex shader when mesh pipeline Reviewed-by: Mike Blumenkrantz Part-of: --- src/mesa/main/state.c | 15 ++++++++------- src/mesa/state_tracker/st_atom_shader.c | 12 +++++++----- src/mesa/state_tracker/st_context.c | 4 ++++ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 11f3c760d23..d66da0d6d45 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -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); } diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c index 39bfbe27588..6df450cd6d0 100644 --- a/src/mesa/state_tracker/st_atom_shader.c +++ b/src/mesa/state_tracker/st_atom_shader.c @@ -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) { diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index ed996e0b29c..d02ed904558 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -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;