diff --git a/.pick_status.json b/.pick_status.json index 54118b3c651..804a7ad19d6 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1574,7 +1574,7 @@ "description": "radeonsi/gfx10.3: add a GPU hang workaround for legacy tess+GS", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "a23802bcb9a42a02d34a5a36d6e66d6532813a0d", "notes": null diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h index 096f94cee39..c2e9e9d7d79 100644 --- a/src/gallium/drivers/radeonsi/si_state.h +++ b/src/gallium/drivers/radeonsi/si_state.h @@ -342,7 +342,7 @@ enum si_tracked_reg /* The slots below can be reused by other generations. */ SI_TRACKED_VGT_ESGS_RING_ITEMSIZE, /* GFX6-8 (GFX9+ can reuse this slot) */ - SI_TRACKED_VGT_REUSE_OFF, /* GFX6-8 (GFX9+ can reuse this slot) */ + SI_TRACKED_VGT_REUSE_OFF, /* GFX6-8,10.3 */ SI_TRACKED_IA_MULTI_VGT_PARAM, /* GFX6-8 (GFX9+ can reuse this slot) */ SI_TRACKED_VGT_GS_MAX_PRIMS_PER_SUBGROUP, /* GFX9 - the slots above can be reused */ diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp index 9f4607956f9..11f483aef58 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp +++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp @@ -4345,6 +4345,15 @@ static void si_emit_vgt_pipeline_state(struct si_context *sctx, unsigned index) radeon_begin(cs); radeon_opt_set_context_reg(sctx, R_028B54_VGT_SHADER_STAGES_EN, SI_TRACKED_VGT_SHADER_STAGES_EN, sctx->vgt_shader_stages_en); + if (sctx->gfx_level == GFX10_3) { + /* Legacy Tess+GS should disable reuse to prevent hangs on GFX10.3. */ + bool has_legacy_tess_gs = G_028B54_HS_EN(sctx->vgt_shader_stages_en) && + G_028B54_GS_EN(sctx->vgt_shader_stages_en) && + !G_028B54_PRIMGEN_EN(sctx->vgt_shader_stages_en); /* !NGG */ + + radeon_opt_set_context_reg(sctx, R_028AB4_VGT_REUSE_OFF, SI_TRACKED_VGT_REUSE_OFF, + S_028AB4_REUSE_OFF(has_legacy_tess_gs)); + } radeon_end_update_context_roll(sctx); if (sctx->gfx_level >= GFX10) {