From c6b24b4cc27d0c4877f974ab9a404a1afca2b9a0 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Tue, 25 Feb 2025 15:19:18 +0800 Subject: [PATCH] glsl: disable mesh shader output remove when separate shader MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Ian Romanick Acked-by: Marek Olšák Part-of: --- src/compiler/glsl/gl_nir_linker.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/compiler/glsl/gl_nir_linker.c b/src/compiler/glsl/gl_nir_linker.c index 94624605644..106d04e9534 100644 --- a/src/compiler/glsl/gl_nir_linker.c +++ b/src/compiler/glsl/gl_nir_linker.c @@ -555,11 +555,18 @@ set_always_active_io(nir_shader *shader, nir_variable_mode io_mode) static void disable_varying_optimizations_for_sso(struct gl_shader_program *prog) { - unsigned first, last; assert(prog->SeparateShader); - first = MESA_SHADER_MESH_STAGES; - last = 0; + if (prog->_LinkedShaders[MESA_SHADER_MESH]) { + if (!prog->_LinkedShaders[MESA_SHADER_FRAGMENT]) { + set_always_active_io(prog->_LinkedShaders[MESA_SHADER_MESH]->Program->nir, + nir_var_shader_out); + } + return; + } + + unsigned first = MESA_SHADER_MESH_STAGES; + unsigned last = 0; /* Determine first and last stage. Excluding the compute stage */ for (unsigned i = 0; i < MESA_SHADER_COMPUTE; i++) { @@ -573,7 +580,7 @@ disable_varying_optimizations_for_sso(struct gl_shader_program *prog) if (first == MESA_SHADER_MESH_STAGES) return; - for (unsigned stage = 0; stage < MESA_SHADER_MESH_STAGES; stage++) { + for (unsigned stage = 0; stage < MESA_SHADER_STAGES; stage++) { if (!prog->_LinkedShaders[stage]) continue;