Mesa (master): freedreno: clear last_fence after resource tracking
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue May 26 19:28:41 UTC 2020
Module: Mesa
Branch: master
Commit: 8728c42031379be979e56a457a178ce6a5b87b08
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8728c42031379be979e56a457a178ce6a5b87b08
Author: Rob Clark <robdclark at chromium.org>
Date: Sat May 23 10:52:52 2020 -0700
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 <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5188>
---
src/gallium/drivers/freedreno/a6xx/fd6_blitter.c | 8 ++++++--
src/gallium/drivers/freedreno/freedreno_draw.c | 16 ++++++++++++----
2 files changed, 18 insertions(+), 6 deletions(-)
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])),
More information about the mesa-commit
mailing list