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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18274>
This commit is contained in:
Erik Faye-Lund
2022-08-26 14:57:38 +02:00
committed by Marge Bot
parent da895596da
commit 99bd1eaf3d

View File

@@ -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_specid(&ctx.builder, sizes[i], ids[i]);
spirv_builder_emit_name(&ctx.builder, sizes[i], names[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); /* WorkgroupSize is deprecated in SPIR-V 1.6 */
spirv_builder_emit_name(&ctx.builder, ctx.local_group_size_var, "gl_LocalGroupSize"); if (spirv_version >= SPIRV_VERSION(1, 6)) {
spirv_builder_emit_builtin(&ctx.builder, ctx.local_group_size_var, SpvBuiltInWorkgroupSize); 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) { if (s->info.cs.derivative_group) {
SpvCapability caps[] = { 0, SpvCapabilityComputeDerivativeGroupQuadsNV, SpvCapabilityComputeDerivativeGroupLinearNV }; SpvCapability caps[] = { 0, SpvCapabilityComputeDerivativeGroupQuadsNV, SpvCapabilityComputeDerivativeGroupLinearNV };