radv: workaround games which assume full subgroups if cswave32 is enabled
authorRhys Perry <pendingchaos02@gmail.com>
Thu, 3 Dec 2020 17:38:51 +0000 (17:38 +0000)
committerMarge Bot <eric+marge@anholt.net>
Thu, 7 Jan 2021 15:01:02 +0000 (15:01 +0000)
This assumption becomes incorrect with RADV_PERFTEST=cswave32.

Games include Detroit: Become Human and Doom Eternal.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7918>

src/amd/vulkan/radv_pipeline.c

index 0f37678..92bace2 100644 (file)
@@ -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;