From: Marek Olšák Date: Tue, 10 Nov 2020 13:20:21 +0000 (-0500) Subject: radeonsi: determine correctly if switching from normal launch to fast launch X-Git-Tag: upstream/21.0.0~2417 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e29e41a3cd84702a7ea6874f314fca897ca76983;p=platform%2Fupstream%2Fmesa.git radeonsi: determine correctly if switching from normal launch to fast launch Fixes: 3da91b3327f - radeonsi/ngg: add VGT_FLUSH when enabling fast launch Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index 9a1c275..80c6a33 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -2063,6 +2063,7 @@ static void si_draw_vbo(struct pipe_context *ctx, } /* Update NGG culling settings. */ + uint8_t old_ngg_culling = sctx->ngg_culling; struct si_shader_selector *hw_vs; if (sctx->ngg && !dispatch_prim_discard_cs && rast_prim == PIPE_PRIM_TRIANGLES && (hw_vs = si_get_vs(sctx)->cso) && @@ -2071,7 +2072,7 @@ static void si_draw_vbo(struct pipe_context *ctx, avg_direct_count > hw_vs->ngg_cull_nonindexed_fast_launch_vert_threshold && prim & ((1 << PIPE_PRIM_TRIANGLES) | (1 << PIPE_PRIM_TRIANGLE_STRIP))))) { - unsigned ngg_culling = 0; + uint8_t ngg_culling = 0; if (rs->rasterizer_discard) { ngg_culling |= SI_NGG_CULL_FRONT_FACE | SI_NGG_CULL_BACK_FACE; @@ -2100,17 +2101,12 @@ static void si_draw_vbo(struct pipe_context *ctx, ngg_culling |= SI_NGG_CULL_GS_FAST_LAUNCH_TRI_STRIP; } - if (ngg_culling != sctx->ngg_culling) { - /* Insert a VGT_FLUSH when enabling fast launch changes to prevent hangs. - * See issues #2418, #2426, #2434 - */ - if (ngg_culling & SI_NGG_CULL_GS_FAST_LAUNCH_ALL && - !(sctx->ngg_culling & SI_NGG_CULL_GS_FAST_LAUNCH_ALL)) - sctx->flags |= SI_CONTEXT_VGT_FLUSH; + if (ngg_culling != old_ngg_culling) { + /* If shader compilation is not ready, this setting will be rejected. */ sctx->ngg_culling = ngg_culling; sctx->do_update_shaders = true; } - } else if (sctx->ngg_culling) { + } else if (old_ngg_culling) { sctx->ngg_culling = false; sctx->do_update_shaders = true; } @@ -2123,8 +2119,23 @@ static void si_draw_vbo(struct pipe_context *ctx, sctx->inlinable_uniforms_dirty_mask = 0; } - if (unlikely(sctx->do_update_shaders && !si_update_shaders(sctx))) - goto return_cleanup; + if (unlikely(sctx->do_update_shaders)) { + if (unlikely(!si_update_shaders(sctx))) + goto return_cleanup; + + /* Insert a VGT_FLUSH when enabling fast launch changes to prevent hangs. + * See issues #2418, #2426, #2434 + * + * This is the setting that is used by the draw. + */ + uint8_t ngg_culling = si_get_vs(sctx)->current->key.opt.ngg_culling; + if (!(old_ngg_culling & SI_NGG_CULL_GS_FAST_LAUNCH_ALL) && + ngg_culling & SI_NGG_CULL_GS_FAST_LAUNCH_ALL) + sctx->flags |= SI_CONTEXT_VGT_FLUSH; + + /* Set this to the correct value determined by si_update_shaders. */ + sctx->ngg_culling = ngg_culling; + } si_need_gfx_cs_space(sctx, num_draws);