From 7d4557bae86527f7ae727fafb4376bb9f105a6a9 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Mon, 3 Nov 2025 15:27:31 +0100 Subject: [PATCH] radv: do not report wave32 in gl_SubgroupSize for Doom Dark Ages The shaders in question use: (memory_load + (gl_SubgroupSize - 1)) & ~(gl_SubgroupSize - 1) My guess is that this is supposed to be the subgroup size of whatever produced the value, not the subgroup size in this shader. And because in the consumer the workgroup size is 32, we use wave32. Fixes: a2d3cbac2a1 ("radv: determine subgroup/wave size early") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/14187 Reviewed-by: Samuel Pitoiset (cherry picked from commit 83e9ae2d5c21382f1990fa656ac9347c51964385) Conflicts: src/amd/vulkan/radv_instance.c src/amd/vulkan/radv_instance.h src/util/driconf.h Part-of: --- .pick_status.json | 2 +- src/amd/vulkan/radv_instance.c | 3 +++ src/amd/vulkan/radv_instance.h | 1 + src/amd/vulkan/radv_physical_device.c | 1 + src/amd/vulkan/radv_physical_device.h | 3 ++- src/amd/vulkan/radv_shader.c | 4 ++++ src/util/00-radv-defaults.conf | 1 + src/util/driconf.h | 4 ++++ 8 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index e63a9ccfa09..4ecff6f1482 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -14,7 +14,7 @@ "description": "radv: do not report wave32 in gl_SubgroupSize for Doom Dark Ages", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "a2d3cbac2a1b9bae50c80a5b512e8633a65f0d57", "notes": null diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index 66595b3e92c..51e0c121ffe 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -200,6 +200,7 @@ static const driOptionDescription radv_dri_options[] = { DRI_CONF_RADV_EMULATE_RT(false) DRI_CONF_RADV_ENABLE_FLOAT16_GFX8(false) DRI_CONF_RADV_COOPERATIVE_MATRIX2_NV(false) + DRI_CONF_RADV_NO_IMPLICIT_VARYING_SUBGROUP_SIZE(false) DRI_CONF_SECTION_END }; // clang-format on @@ -236,6 +237,8 @@ radv_init_dri_debug_options(struct radv_instance *instance) drirc->debug.ssbo_non_uniform = driQueryOptionb(&drirc->options, "radv_ssbo_non_uniform"); drirc->debug.tex_non_uniform = driQueryOptionb(&drirc->options, "radv_tex_non_uniform"); drirc->debug.zero_vram = driQueryOptionb(&drirc->options, "radv_zero_vram"); + drirc->debug.no_implicit_varying_subgroup_size = + driQueryOptionb(&drirc->options, "radv_no_implicit_varying_subgroup_size"); drirc->debug.app_layer = driQueryOptionstr(&drirc->options, "radv_app_layer"); drirc->debug.override_uniform_offset_alignment = diff --git a/src/amd/vulkan/radv_instance.h b/src/amd/vulkan/radv_instance.h index 9d63eff61b0..0569c2aab0f 100644 --- a/src/amd/vulkan/radv_instance.h +++ b/src/amd/vulkan/radv_instance.h @@ -57,6 +57,7 @@ struct radv_drirc { bool ssbo_non_uniform; bool tex_non_uniform; bool zero_vram; + bool no_implicit_varying_subgroup_size; char *app_layer; int override_uniform_offset_alignment; } debug; diff --git a/src/amd/vulkan/radv_physical_device.c b/src/amd/vulkan/radv_physical_device.c index 389a859313d..7ac0ba41e78 100644 --- a/src/amd/vulkan/radv_physical_device.c +++ b/src/amd/vulkan/radv_physical_device.c @@ -252,6 +252,7 @@ radv_physical_device_init_cache_key(struct radv_physical_device *pdev) key->use_llvm = pdev->use_llvm; key->use_ngg = pdev->use_ngg; key->use_ngg_culling = pdev->use_ngg_culling; + key->no_implicit_varying_subgroup_size = instance->drirc.debug.no_implicit_varying_subgroup_size; } static int diff --git a/src/amd/vulkan/radv_physical_device.h b/src/amd/vulkan/radv_physical_device.h index 63ba80a8183..30fac919d2c 100644 --- a/src/amd/vulkan/radv_physical_device.h +++ b/src/amd/vulkan/radv_physical_device.h @@ -64,8 +64,9 @@ struct radv_physical_device_cache_key { uint32_t use_llvm : 1; uint32_t use_ngg : 1; uint32_t use_ngg_culling : 1; + uint32_t no_implicit_varying_subgroup_size : 1; - uint32_t reserved : 10; + uint32_t reserved : 9; }; enum radv_video_enc_hw_ver { diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 066552db384..ae981cf5880 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -367,6 +367,10 @@ radv_shader_choose_subgroup_size(struct radv_device *device, nir_shader *nir, .requiredSubgroupSize = stage_key->subgroup_required_size * 32, }; + /* Do not allow for the SPIR-V 1.6 varying subgroup size rules. */ + if (pdev->cache_key.no_implicit_varying_subgroup_size) + spirv_version = 0x10000; + vk_set_subgroup_size(&device->vk, nir, spirv_version, rss_info.requiredSubgroupSize ? &rss_info : NULL, stage_key->subgroup_allow_varying, stage_key->subgroup_require_full); diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf index 2d139985de4..e2a25e56a1a 100644 --- a/src/util/00-radv-defaults.conf +++ b/src/util/00-radv-defaults.conf @@ -132,6 +132,7 @@ Application bugs worked around in this file: diff --git a/src/util/driconf.h b/src/util/driconf.h index 2b33ef981c4..d6338e80305 100644 --- a/src/util/driconf.h +++ b/src/util/driconf.h @@ -759,6 +759,10 @@ DRI_CONF_OPT_B(radv_rt_wave64, def, \ "Force wave64 in RT shaders") +#define DRI_CONF_RADV_NO_IMPLICIT_VARYING_SUBGROUP_SIZE(def) \ + DRI_CONF_OPT_B(radv_no_implicit_varying_subgroup_size, def, \ + "Do not assume VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE for SPIR-V 1.6.") + /** * Overrides for forcing re-compilation of pipelines when RADV_BUILD_ID_OVERRIDE is enabled. * These need to be bumped every time a compiler bugfix is backported (up to 8 shader