[Mesa-dev] [PATCH] radeonsi: also apply the GS hang workaround to draws without tessellation

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Mon Jan 14 23:47:52 UTC 2019


Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

On Tue, Jan 15, 2019 at 12:33 AM Marek Olšák <maraeo at gmail.com> wrote:
>
> From: Marek Olšák <marek.olsak at amd.com>
>
> ported from AMDVLK.
>
> Cc: 18.3 <mesa-stable at lists.freedesktop.org>
> ---
>  src/gallium/drivers/radeonsi/si_state_draw.c | 25 +++++++++++---------
>  1 file changed, 14 insertions(+), 11 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
> index d0b2e18b4ea..dd670f3f670 100644
> --- a/src/gallium/drivers/radeonsi/si_state_draw.c
> +++ b/src/gallium/drivers/radeonsi/si_state_draw.c
> @@ -343,34 +343,25 @@ si_get_init_multi_vgt_param(struct si_screen *sscreen,
>                 if (key->u.tess_uses_prim_id)
>                         ia_switch_on_eoi = true;
>
>                 /* Bug with tessellation and GS on Bonaire and older 2 SE chips. */
>                 if ((sscreen->info.family == CHIP_TAHITI ||
>                      sscreen->info.family == CHIP_PITCAIRN ||
>                      sscreen->info.family == CHIP_BONAIRE) &&
>                     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;
>                         }
>                 }
>         }
>
>         /* This is a hardware requirement. */
>         if (key->u.line_stipple_enabled ||
>             (sscreen->debug_flags & DBG(SWITCH_ON_EOP))) {
>                 ia_switch_on_eop = true;
> @@ -412,20 +403,32 @@ si_get_init_multi_vgt_param(struct si_screen *sscreen,
>                  */
>                 if (sscreen->info.chip_class <= VI &&
>                     sscreen->info.max_se == 4 &&
>                     key->u.multi_instances_smaller_than_primgroup)
>                         wd_switch_on_eop = true;
>
>                 /* Required on CIK and later. */
>                 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 ||
>                      (sscreen->info.chip_class == VI &&
>                       (key->u.uses_gs || max_primgroup_in_wave != 2))))
>                         partial_vs_wave = true;
>
>                 /* Instancing bug on Bonaire. */
>                 if (sscreen->info.family == CHIP_BONAIRE && ia_switch_on_eoi &&
>                     key->u.uses_instancing)
> --
> 2.17.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list