From cacce76db9b4e4da516d692208280e74fb2437ab Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Thu, 3 Dec 2020 17:38:51 +0000 Subject: [PATCH] radv: workaround games which assume full subgroups if cswave32 is enabled This assumption becomes incorrect with RADV_PERFTEST=cswave32. Games include Detroit: Become Human and Doom Eternal. Signed-off-by: Rhys Perry Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_pipeline.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 0f376781e2f..92bace2480e 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -2776,6 +2776,18 @@ radv_fill_shader_keys(struct radv_device *device, if (!subgroup_size) subgroup_size = device->physical_device->cs_wave_size; + unsigned local_size = nir[MESA_SHADER_COMPUTE]->info.cs.local_size[0] * + nir[MESA_SHADER_COMPUTE]->info.cs.local_size[1] * + nir[MESA_SHADER_COMPUTE]->info.cs.local_size[2]; + + /* Games don't always request full subgroups when they should, + * which can cause bugs if cswave32 is enabled. + */ + if (device->physical_device->cs_wave_size == 32 && + nir[MESA_SHADER_COMPUTE]->info.cs.uses_wide_subgroup_intrinsics && + !req_subgroup_size && local_size % RADV_SUBGROUP_SIZE == 0) + require_full_subgroups = true; + if (require_full_subgroups && !req_subgroup_size) { /* don't use wave32 pretending to be wave64 */ subgroup_size = RADV_SUBGROUP_SIZE;