Mesa (master): radeonsi: determine correctly if switching from normal launch to fast launch

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Nov 18 06:41:16 UTC 2020


Module: Mesa
Branch: master
Commit: e29e41a3cd84702a7ea6874f314fca897ca76983
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e29e41a3cd84702a7ea6874f314fca897ca76983

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Tue Nov 10 08:20:21 2020 -0500

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 <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7542>

---

 src/gallium/drivers/radeonsi/si_state_draw.c | 33 ++++++++++++++++++----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
index 9a1c275c894..80c6a33aef9 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);
 



More information about the mesa-commit mailing list