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