[Mesa-dev] [PATCH 2/3] radeonsi: fix a hang with instancing on Hawaii

Alex Deucher alexdeucher at gmail.com
Sun Jul 27 19:56:26 PDT 2014


On Fri, Jul 25, 2014 at 9:30 PM, Marek Olšák <maraeo at gmail.com> wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> This fixes "piglit/bin/arb_transform_feedback2-draw-auto instanced".
>
> Cc: mesa-stable at lists.freedesktop.org

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  src/gallium/drivers/radeonsi/si_state_draw.c | 16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
> index f829d03..1816540 100644
> --- a/src/gallium/drivers/radeonsi/si_state_draw.c
> +++ b/src/gallium/drivers/radeonsi/si_state_draw.c
> @@ -33,6 +33,7 @@
>  #include "util/u_format.h"
>  #include "util/u_index_modify.h"
>  #include "util/u_memory.h"
> +#include "util/u_prim.h"
>  #include "util/u_upload_mgr.h"
>
>  /*
> @@ -408,6 +409,19 @@ static bool si_update_draw_info_state(struct si_context *sctx,
>                                         (rs ? rs->line_stipple_enable : false);
>                 /* If the WD switch is false, the IA switch must be false too. */
>                 bool ia_switch_on_eop = wd_switch_on_eop;
> +               unsigned primgroup_size = 64;
> +
> +               /* Hawaii hangs if instancing is enabled and each instance
> +                * is smaller than a prim group and WD_SWITCH_ON_EOP is 0.
> +                * We don't know that for indirect drawing, so treat it as
> +                * always problematic. */
> +               if (sctx->b.family == CHIP_HAWAII &&
> +                   (info->indirect ||
> +                    (info->instance_count > 1 &&
> +                     u_prims_for_vertices(info->mode, info->count) < primgroup_size))) {
> +                       wd_switch_on_eop = true;
> +                       ia_switch_on_eop = true;
> +               }
>
>                 si_pm4_set_reg(pm4, R_028B74_VGT_DISPATCH_DRAW_INDEX,
>                                ib->index_size == 4 ? 0xFC000000 : 0xFC00);
> @@ -417,7 +431,7 @@ static bool si_update_draw_info_state(struct si_context *sctx,
>                 si_pm4_cmd_add(pm4, /* IA_MULTI_VGT_PARAM */
>                                S_028AA8_SWITCH_ON_EOP(ia_switch_on_eop) |
>                                S_028AA8_PARTIAL_VS_WAVE_ON(1) |
> -                              S_028AA8_PRIMGROUP_SIZE(63) |
> +                              S_028AA8_PRIMGROUP_SIZE(primgroup_size - 1) |
>                                S_028AA8_WD_SWITCH_ON_EOP(wd_switch_on_eop));
>                 si_pm4_cmd_add(pm4, 0); /* VGT_LS_HS_CONFIG */
>                 si_pm4_cmd_end(pm4, false);
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list