From 9a8eef282b95916093b7a4d27d9c063b99bdb093 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Wed, 25 Dec 2024 11:07:06 +0800 Subject: [PATCH] radeonsi: fix OpenCL shader compile fail MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sel->stage is assigned with MESA_SHADER_COMPUTE statically, change to use nir->info.stage need to handle with MESA_SHADER_KERNEL. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12372 Fixes: 9b7ea720c93 ("radeonsi: use nir->info instead of sel->info.base") Reviewed-by: Marek Olšák Part-of: --- src/gallium/drivers/radeonsi/si_shader.c | 6 ++++-- src/gallium/drivers/radeonsi/si_shader_llvm.c | 2 ++ src/gallium/drivers/radeonsi/si_shader_nir.c | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 8a94f7d9ec0..8eacc0d93b6 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -680,6 +680,7 @@ static void si_init_shader_args(struct si_shader *shader, struct si_shader_args break; case MESA_SHADER_COMPUTE: + case MESA_SHADER_KERNEL: declare_global_desc_pointers(args); declare_per_stage_desc_pointers(args, shader, info, true); if (shader->selector->info.uses_grid_size) @@ -2246,7 +2247,8 @@ static void si_nir_emit_polygon_stipple(nir_shader *nir, struct si_shader_args * bool si_should_clear_lds(struct si_screen *sscreen, const struct nir_shader *shader) { - return shader->info.stage == MESA_SHADER_COMPUTE && shader->info.shared_size > 0 && sscreen->options.clear_lds; + return gl_shader_stage_is_compute(shader->info.stage) && + shader->info.shared_size > 0 && sscreen->options.clear_lds; } static bool clamp_shadow_comparison_value(nir_builder *b, nir_instr *instr, void *state) @@ -3102,7 +3104,7 @@ bool si_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *compi } /* Validate SGPR and VGPR usage for compute to detect compiler bugs. */ - if (nir->info.stage == MESA_SHADER_COMPUTE) { + if (gl_shader_stage_is_compute(nir->info.stage)) { unsigned max_vgprs = sscreen->info.num_physical_wave64_vgprs_per_simd * (shader->wave_size == 32 ? 2 : 1); unsigned max_sgprs = sscreen->info.num_physical_sgprs_per_simd; diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index bd0309744de..7629b51fc8d 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -157,6 +157,7 @@ void si_llvm_create_func(struct si_shader_context *ctx, const char *name, LLVMTy call_conv = AC_LLVM_AMDGPU_PS; break; case MESA_SHADER_COMPUTE: + case MESA_SHADER_KERNEL: call_conv = AC_LLVM_AMDGPU_CS; break; default: @@ -596,6 +597,7 @@ static bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shade } case MESA_SHADER_COMPUTE: + case MESA_SHADER_KERNEL: if (ctx->shader->selector->info.base.shared_size) si_llvm_declare_compute_memory(ctx); break; diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 7a05cc54948..73429000f04 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -331,7 +331,7 @@ static void si_lower_nir(struct si_screen *sscreen, struct nir_shader *nir) NIR_PASS_V(nir, nir_lower_gs_intrinsics, flags); } - if (nir->info.stage == MESA_SHADER_COMPUTE) { + if (gl_shader_stage_is_compute(nir->info.stage)) { nir_lower_compute_system_values_options options = {0}; /* gl_LocalInvocationIndex must be derived from gl_LocalInvocationID.xyz to make it correct