diff options
author | Marek Olšák <[email protected]> | 2014-07-26 02:56:00 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2014-07-28 23:57:08 +0200 |
commit | 3d9e87406cfaf4a2bfef5b4bae50af94d1cc424f (patch) | |
tree | 28b3e45a743aafe2ad3dada13725271d53804594 /src/gallium | |
parent | c7407b94a8eb329a45cdd0acb5255670d4c0e041 (diff) |
radeonsi: fix a hang with instancing on Hawaii
This fixes "piglit/bin/arb_transform_feedback2-draw-auto instanced".
Cc: [email protected]
Reviewed-by: Alex Deucher <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_draw.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index f829d0363a4..1816540fa00 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); |