radeonsi/gfx10: implement a bug workaround for NGG -> legacy transitions
authorMarek Olšák <marek.olsak@amd.com>
Tue, 30 Jul 2019 22:40:22 +0000 (18:40 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 6 Aug 2019 21:08:57 +0000 (17:08 -0400)
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
src/gallium/drivers/radeonsi/si_state_draw.c
src/gallium/drivers/radeonsi/si_state_shaders.c

index 62b00b5a3c4269e72e512c29719aaf5bd8259231..8254d7ba2a331c1db735991c94eaa91a0e7468d2 100644 (file)
@@ -1106,10 +1106,14 @@ void gfx10_emit_cache_flush(struct si_context *ctx)
        }
 
        /* We don't need these. */
-       assert(!(flags & (SI_CONTEXT_VGT_FLUSH |
-                         SI_CONTEXT_VGT_STREAMOUT_SYNC |
+       assert(!(flags & (SI_CONTEXT_VGT_STREAMOUT_SYNC |
                          SI_CONTEXT_FLUSH_AND_INV_DB_META)));
 
+       if (flags & SI_CONTEXT_VGT_FLUSH) {
+               radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 0, 0));
+               radeon_emit(cs, EVENT_TYPE(V_028A90_VGT_FLUSH) | EVENT_INDEX(0));
+       }
+
        if (flags & SI_CONTEXT_FLUSH_AND_INV_CB)
                ctx->num_cb_cache_flushes++;
        if (flags & SI_CONTEXT_FLUSH_AND_INV_DB)
index eb73834e4126be2ceb59fe1e334f45ae7501d377..a0bb0a458d677023f487318b77043faf6a0e1b56 100644 (file)
@@ -3022,6 +3022,16 @@ static bool si_update_ngg(struct si_context *sctx)
                new_ngg = false;
 
        if (new_ngg != sctx->ngg) {
+               /* Transitioning from NGG to legacy GS requires VGT_FLUSH on Navi10-14.
+                * VGT_FLUSH is also emitted at the beginning of IBs when legacy GS ring
+                * pointers are set.
+                */
+               if ((sctx->family == CHIP_NAVI10 ||
+                    sctx->family == CHIP_NAVI12 ||
+                    sctx->family == CHIP_NAVI14) &&
+                   !new_ngg)
+                       sctx->flags |= SI_CONTEXT_VGT_FLUSH;
+
                sctx->ngg = new_ngg;
                sctx->last_rast_prim = -1; /* reset this so that it gets updated */
                return true;