radeonsi: also apply the GS hang workaround to draws without tessellation
authorMarek Olšák <marek.olsak@amd.com>
Mon, 14 Jan 2019 23:24:08 +0000 (18:24 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 14 Jan 2019 23:55:58 +0000 (18:55 -0500)
ported from AMDVLK.

Cc: 18.3 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/gallium/drivers/radeonsi/si_state_draw.c

index d0b2e18..dd670f3 100644 (file)
@@ -350,20 +350,11 @@ si_get_init_multi_vgt_param(struct si_screen *sscreen,
                    key->u.uses_gs)
                        partial_vs_wave = true;
 
-               /* Needed for 028B6C_DISTRIBUTION_MODE != 0 */
+               /* Needed for 028B6C_DISTRIBUTION_MODE != 0. (implies >= VI) */
                if (sscreen->has_distributed_tess) {
                        if (key->u.uses_gs) {
-                               if (sscreen->info.chip_class <= VI)
+                               if (sscreen->info.chip_class == VI)
                                        partial_es_wave = true;
-
-                               /* GPU hang workaround. */
-                               if (sscreen->info.family == CHIP_TONGA ||
-                                   sscreen->info.family == CHIP_FIJI ||
-                                   sscreen->info.family == CHIP_POLARIS10 ||
-                                   sscreen->info.family == CHIP_POLARIS11 ||
-                                   sscreen->info.family == CHIP_POLARIS12 ||
-                                   sscreen->info.family == CHIP_VEGAM)
-                                       partial_vs_wave = true;
                        } else {
                                partial_vs_wave = true;
                        }
@@ -419,6 +410,18 @@ si_get_init_multi_vgt_param(struct si_screen *sscreen,
                if (sscreen->info.max_se == 4 && !wd_switch_on_eop)
                        ia_switch_on_eoi = true;
 
+               /* HW engineers suggested that PARTIAL_VS_WAVE_ON should be set
+                * to work around a GS hang.
+                */
+               if (key->u.uses_gs &&
+                   (sscreen->info.family == CHIP_TONGA ||
+                    sscreen->info.family == CHIP_FIJI ||
+                    sscreen->info.family == CHIP_POLARIS10 ||
+                    sscreen->info.family == CHIP_POLARIS11 ||
+                    sscreen->info.family == CHIP_POLARIS12 ||
+                    sscreen->info.family == CHIP_VEGAM))
+                       partial_vs_wave = true;
+
                /* Required by Hawaii and, for some special cases, by VI. */
                if (ia_switch_on_eoi &&
                    (sscreen->info.family == CHIP_HAWAII ||