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