From: Rob Clark Date: Sat, 23 May 2020 17:52:52 +0000 (-0700) Subject: freedreno: clear last_fence after resource tracking X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8728c42031379be979e56a457a178ce6a5b87b08;p=mesa.git freedreno: clear last_fence after resource tracking The resource tracking in the clear/draw_vbo/blit paths could itself trigger a flush. Which would update last_fence. So we need to clear last_fence *after* all the dependency tracking. Fixes: ddb7fadaf8b ("freedreno: avoid no-op flushes by re-using last-fence") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2992 Signed-off-by: Rob Clark Part-of: --- diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c index 7bf9679e93d..54f1592ecba 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c @@ -634,8 +634,6 @@ handle_rgba_blit(struct fd_context *ctx, const struct pipe_blit_info *info) if (!can_do_blit(info)) return false; - fd_fence_ref(&ctx->last_fence, NULL); - batch = fd_bc_alloc_batch(&ctx->screen->batch_cache, ctx, true); fd6_emit_restore(batch, batch->draw); @@ -648,6 +646,12 @@ handle_rgba_blit(struct fd_context *ctx, const struct pipe_blit_info *info) fd_screen_unlock(ctx->screen); + /* Clearing last_fence must come after the batch dependency tracking + * (resource_read()/resource_write()), as that can trigger a flush, + * re-populating last_fence + */ + fd_fence_ref(&ctx->last_fence, NULL); + fd_batch_set_stage(batch, FD_STAGE_BLIT); fd_log_stream(batch, stream, util_dump_blit_info(stream, info)); diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index d3d68a14131..5378e598047 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -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])),