From 99bd1eaf3d20184abaff91e63d8aacded79d4d74 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Fri, 26 Aug 2022 14:57:38 +0200 Subject: [PATCH] zink: use spir-v 1.6 local-size when needed The WorkgroupSize built-in is deprecated in SPIR-V 1.6, so let's switch to using LocalSizeId instead, like the spec recommends. Part-of: --- .../drivers/zink/nir_to_spirv/nir_to_spirv.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c index 680c291cb48..4339443231d 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c +++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c @@ -4653,10 +4653,19 @@ nir_to_spirv(struct nir_shader *s, const struct zink_shader_info *sinfo, uint32_ spirv_builder_emit_specid(&ctx.builder, sizes[i], ids[i]); spirv_builder_emit_name(&ctx.builder, sizes[i], names[i]); } - SpvId var_type = get_uvec_type(&ctx, 32, 3); - ctx.local_group_size_var = spirv_builder_spec_const_composite(&ctx.builder, var_type, sizes, 3); - spirv_builder_emit_name(&ctx.builder, ctx.local_group_size_var, "gl_LocalGroupSize"); - spirv_builder_emit_builtin(&ctx.builder, ctx.local_group_size_var, SpvBuiltInWorkgroupSize); + + /* WorkgroupSize is deprecated in SPIR-V 1.6 */ + if (spirv_version >= SPIRV_VERSION(1, 6)) { + uint32_t sizes32[] = { sizes[0], sizes[1], sizes[2] }; + spirv_builder_emit_exec_mode_literal3(&ctx.builder, entry_point, + SpvExecutionModeLocalSizeId, + sizes32); + } else { + SpvId var_type = get_uvec_type(&ctx, 32, 3); + ctx.local_group_size_var = spirv_builder_spec_const_composite(&ctx.builder, var_type, sizes, 3); + spirv_builder_emit_name(&ctx.builder, ctx.local_group_size_var, "gl_LocalGroupSize"); + spirv_builder_emit_builtin(&ctx.builder, ctx.local_group_size_var, SpvBuiltInWorkgroupSize); + } } if (s->info.cs.derivative_group) { SpvCapability caps[] = { 0, SpvCapabilityComputeDerivativeGroupQuadsNV, SpvCapabilityComputeDerivativeGroupLinearNV };