diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c index 1df71550efa..ce8a6ba0477 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.c +++ b/src/gallium/drivers/freedreno/freedreno_context.c @@ -60,6 +60,8 @@ fd_context_flush(struct pipe_context *pctx, struct pipe_fence_handle **fencep, if (ctx->screen->reorder) fd_bc_flush(ctx, flags & PIPE_FLUSH_DEFERRED); fd_bc_dump(ctx, "%p: NULL batch, remaining:\n", ctx); + if (!(flags & PIPE_FLUSH_DEFERRED)) + tc_driver_internal_flush_notify(ctx->tc); return; } @@ -138,6 +140,12 @@ fd_context_flush(struct pipe_context *pctx, struct pipe_fence_handle **fencep, fd_bc_dump(ctx, "%p: remaining:\n", ctx); out: + /* If we just flushed all rendering out of the batch cache, then inform TC + * that it can use the resource_busy callback to check if they're still busy. + */ + if (!(flags & PIPE_FLUSH_DEFERRED)) + tc_driver_internal_flush_notify(ctx->tc); + if (fencep) fd_fence_ref(fencep, fence); @@ -703,7 +711,7 @@ fd_context_init_tc(struct pipe_context *pctx, unsigned flags) fd_replace_buffer_storage, fd_fence_create_unflushed, fd_resource_busy, - false, + true, &ctx->tc); uint64_t total_ram; diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index 89d27504286..d696f02ac0f 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -312,15 +312,20 @@ translate_usage(unsigned usage) return op; } +/* This is called by TC to check if a buffer is idle on the GPU so it can do + * unsynchronized mappings from the frontend. + * + * Note that TC tracks what buffers are outstanding in its queue in between + * pctx->flush() calls (which we inform it of through + * tc_driver_internal_flush_notify()) so we don't need to go digging in our + * batch cache to check for usages. + */ bool fd_resource_busy(struct pipe_screen *pscreen, struct pipe_resource *prsc, unsigned usage) { struct fd_resource *rsc = fd_resource(prsc); - if (pending(rsc, !!(usage & PIPE_MAP_WRITE))) - return true; - if (resource_busy(rsc, translate_usage(usage))) return true;