freedreno: clear last_fence after resource tracking
[mesa.git] / src / gallium / drivers / freedreno / freedreno_draw.c
index d3d68a1413163d48bfa56b263b583113575d9134..5378e598047cf5dc6e36c86acbd7b7d6a337ef6f 100644 (file)
@@ -93,8 +93,6 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
                return;
        }
 
-       fd_fence_ref(&ctx->last_fence, NULL);
-
        /* Upload a user index buffer. */
        struct pipe_resource *indexbuf = NULL;
        unsigned index_offset = 0;
@@ -285,6 +283,12 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
        /* and any buffers used, need to be resolved: */
        batch->resolve |= buffers;
 
+       /* Clearing last_fence must come after the batch dependency tracking
+        * (resource_read()/resource_written()), as that can trigger a flush,
+        * re-populating last_fence
+        */
+       fd_fence_ref(&ctx->last_fence, NULL);
+
        DBG("%p: %x %ux%u num_draws=%u (%s/%s)", batch, buffers,
                pfb->width, pfb->height, batch->num_draws,
                util_format_short_name(pipe_surface_format(pfb->cbufs[0])),
@@ -321,8 +325,6 @@ fd_clear(struct pipe_context *pctx, unsigned buffers, const struct pipe_scissor_
        if (!fd_render_condition_check(pctx))
                return;
 
-       fd_fence_ref(&ctx->last_fence, NULL);
-
        if (ctx->in_discard_blit) {
                fd_batch_reset(batch);
                fd_context_all_dirty(ctx);
@@ -369,6 +371,12 @@ fd_clear(struct pipe_context *pctx, unsigned buffers, const struct pipe_scissor_
 
        fd_screen_unlock(ctx->screen);
 
+       /* Clearing last_fence must come after the batch dependency tracking
+        * (resource_read()/resource_written()), as that can trigger a flush,
+        * re-populating last_fence
+        */
+       fd_fence_ref(&ctx->last_fence, NULL);
+
        DBG("%p: %x %ux%u depth=%f, stencil=%u (%s/%s)", batch, buffers,
                pfb->width, pfb->height, depth, stencil,
                util_format_short_name(pipe_surface_format(pfb->cbufs[0])),