From cb13e00f72b450f297cc3bb71c1777d872e36f22 Mon Sep 17 00:00:00 2001 From: Icecream95 Date: Fri, 10 Jun 2022 23:03:33 +1200 Subject: [PATCH] panfrost: Remove sync arguments from panfrost_batch_submit Whether a sync object is used cannot depend on where the batch is submitted from, remove the in_sync and out_sync fields from panfrost_batch_submit. Always use an output syncobj, this is required for glFinish to work correctly. This could be skipped for batches which another batch depends on, but because of the existence of empty batches which emit no job, doing so is not trivial. Never use an input syncobj. There appears to be no point to this, the kernel driver does implicit sync anyway. Fixes "seconds per frame" rendering with Neverball; previously, every batch was submitted with out_sync=0, so DRI's frame throttling could do nothing. New jobs would keep getting submitted until more than a thousand were queued in the kernel, which increased rendering latency for the compositor far beyond acceptable levels. Cc: mesa-stable Part-of: (cherry picked from commit d8803c724bcb83eb08e038984eb8cd6b5f3f64b8) --- .pick_status.json | 2 +- src/gallium/drivers/panfrost/pan_job.c | 25 +++++++++++-------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 4ba5df3b538..a221754e8f7 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1615,7 +1615,7 @@ "description": "panfrost: Remove sync arguments from panfrost_batch_submit", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index 25d634baf8b..268e74573af 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -150,8 +150,7 @@ panfrost_batch_cleanup(struct panfrost_context *ctx, struct panfrost_batch *batc static void panfrost_batch_submit(struct panfrost_context *ctx, - struct panfrost_batch *batch, - uint32_t in_sync, uint32_t out_sync); + struct panfrost_batch *batch); static struct panfrost_batch * panfrost_get_batch(struct panfrost_context *ctx, @@ -177,7 +176,7 @@ panfrost_get_batch(struct panfrost_context *ctx, /* The selected slot is used, we need to flush the batch */ if (batch->seqnum) - panfrost_batch_submit(ctx, batch, 0, 0); + panfrost_batch_submit(ctx, batch); panfrost_batch_init(ctx, key, batch); @@ -225,7 +224,7 @@ panfrost_get_fresh_batch_for_fbo(struct panfrost_context *ctx, const char *reaso if (batch->scoreboard.first_job) { perf_debug_ctx(ctx, "Flushing the current FBO due to: %s", reason); - panfrost_batch_submit(ctx, batch, 0, 0); + panfrost_batch_submit(ctx, batch); batch = panfrost_get_batch(ctx, &ctx->pipe_framebuffer); } @@ -265,7 +264,7 @@ panfrost_batch_update_access(struct panfrost_batch *batch, /* Submit if it's a user */ if (_mesa_set_search(batch->resources, rsrc)) - panfrost_batch_submit(ctx, batch, 0, 0); + panfrost_batch_submit(ctx, batch); } } @@ -724,8 +723,7 @@ panfrost_emit_tile_map(struct panfrost_batch *batch, struct pan_fb_info *fb) static void panfrost_batch_submit(struct panfrost_context *ctx, - struct panfrost_batch *batch, - uint32_t in_sync, uint32_t out_sync) + struct panfrost_batch *batch) { struct pipe_screen *pscreen = ctx->base.screen; struct panfrost_screen *screen = pan_screen(pscreen); @@ -752,7 +750,7 @@ panfrost_batch_submit(struct panfrost_context *ctx, if (batch->scoreboard.first_tiler || batch->clear) screen->vtbl.emit_fbd(batch, &fb); - ret = panfrost_batch_submit_jobs(batch, &fb, in_sync, out_sync); + ret = panfrost_batch_submit_jobs(batch, &fb, 0, ctx->syncobj); if (ret) fprintf(stderr, "panfrost_batch_submit failed: %d\n", ret); @@ -779,21 +777,20 @@ out: panfrost_batch_cleanup(ctx, batch); } -/* Submit all batches, applying the out_sync to the currently bound batch */ +/* Submit all batches */ void panfrost_flush_all_batches(struct panfrost_context *ctx, const char *reason) { struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx); - panfrost_batch_submit(ctx, batch, ctx->syncobj, ctx->syncobj); + panfrost_batch_submit(ctx, batch); for (unsigned i = 0; i < PAN_MAX_BATCHES; i++) { if (ctx->batches.slots[i].seqnum) { if (reason) perf_debug_ctx(ctx, "Flushing everything due to: %s", reason); - panfrost_batch_submit(ctx, &ctx->batches.slots[i], - ctx->syncobj, ctx->syncobj); + panfrost_batch_submit(ctx, &ctx->batches.slots[i]); } } } @@ -807,7 +804,7 @@ panfrost_flush_writer(struct panfrost_context *ctx, if (entry) { perf_debug_ctx(ctx, "Flushing writer due to: %s", reason); - panfrost_batch_submit(ctx, entry->data, ctx->syncobj, ctx->syncobj); + panfrost_batch_submit(ctx, entry->data); } } @@ -824,7 +821,7 @@ panfrost_flush_batches_accessing_rsrc(struct panfrost_context *ctx, continue; perf_debug_ctx(ctx, "Flushing user due to: %s", reason); - panfrost_batch_submit(ctx, batch, ctx->syncobj, ctx->syncobj); + panfrost_batch_submit(ctx, batch); } }