[Mesa-dev] [PATCH v2 26/37] panfrost: Use the per-batch fences to wait on the last submitted batch
Boris Brezillon
boris.brezillon at collabora.com
Mon Sep 16 09:37:04 UTC 2019
We just replace the per-context out_sync object by a pointer to the
the fence of the last last submitted batch. Pipelining of batches will
come later.
Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
---
src/gallium/drivers/panfrost/pan_context.c | 6 ------
src/gallium/drivers/panfrost/pan_context.h | 3 ++-
src/gallium/drivers/panfrost/pan_job.c | 23 ++++++++++++++++------
src/gallium/drivers/panfrost/pan_screen.c | 6 ++++--
4 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index a76caecef0e3..0197f78b5506 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -2712,12 +2712,6 @@ panfrost_create_context(struct pipe_screen *screen, void *priv, unsigned flags)
panfrost_blend_context_init(gallium);
panfrost_compute_context_init(gallium);
- ASSERTED int ret;
-
- ret = drmSyncobjCreate(pscreen->fd, DRM_SYNCOBJ_CREATE_SIGNALED,
- &ctx->out_sync);
- assert(!ret);
-
/* XXX: leaks */
gallium->stream_uploader = u_upload_create_default(gallium);
gallium->const_uploader = gallium->stream_uploader;
diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
index c145d589757e..ce3e0c899a4f 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -191,7 +191,8 @@ struct panfrost_context {
/* True for t6XX, false for t8xx. */
bool is_t6xx;
- uint32_t out_sync;
+ /* The out sync fence of the last submitted batch. */
+ struct panfrost_batch_fence *last_out_sync;
};
/* Corresponds to the CSO */
diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
index 8712e2ce598a..78f2b766adb1 100644
--- a/src/gallium/drivers/panfrost/pan_job.c
+++ b/src/gallium/drivers/panfrost/pan_job.c
@@ -427,11 +427,13 @@ panfrost_batch_submit_ioctl(struct panfrost_batch *batch,
uint32_t *bo_handles;
int ret;
- submit.in_syncs = (u64) (uintptr_t) &ctx->out_sync;
- submit.in_sync_count = 1;
- submit.out_sync = ctx->out_sync;
+ if (ctx->last_out_sync) {
+ submit.in_sync_count = 1;
+ submit.in_syncs = (uintptr_t)&ctx->last_out_sync->syncobj;
+ }
+ submit.out_sync = batch->out_sync->syncobj;
submit.jc = first_job_desc;
submit.requirements = reqs;
@@ -454,6 +456,14 @@ panfrost_batch_submit_ioctl(struct panfrost_batch *batch,
submit.bo_handles = (u64) (uintptr_t) bo_handles;
ret = drmIoctl(screen->fd, DRM_IOCTL_PANFROST_SUBMIT, &submit);
free(bo_handles);
+
+ /* Release the last batch fence if any, and retain the new one */
+ if (ctx->last_out_sync)
+ panfrost_batch_fence_unreference(ctx->last_out_sync);
+
+ panfrost_batch_fence_reference(batch->out_sync);
+ ctx->last_out_sync = batch->out_sync;
+
if (ret) {
fprintf(stderr, "Error submitting: %m\n");
return errno;
@@ -462,7 +472,8 @@ panfrost_batch_submit_ioctl(struct panfrost_batch *batch,
/* Trace the job if we're doing that */
if (pan_debug & PAN_DBG_TRACE) {
/* Wait so we can get errors reported back */
- drmSyncobjWait(screen->fd, &ctx->out_sync, 1, INT64_MAX, 0, NULL);
+ drmSyncobjWait(screen->fd, &batch->out_sync->syncobj, 1,
+ INT64_MAX, 0, NULL);
pandecode_jc(submit.jc, FALSE);
}
@@ -531,8 +542,8 @@ out:
* rendering is quite broken right now (to be fixed by the panfrost_job
* refactor, just take the perf hit for correctness)
*/
- drmSyncobjWait(pan_screen(ctx->base.screen)->fd, &ctx->out_sync, 1,
- INT64_MAX, 0, NULL);
+ drmSyncobjWait(pan_screen(ctx->base.screen)->fd,
+ &batch->out_sync->syncobj, 1, INT64_MAX, 0, NULL);
panfrost_free_batch(batch);
}
diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c
index dae8b941f1ea..22f7feb890e2 100644
--- a/src/gallium/drivers/panfrost/pan_screen.c
+++ b/src/gallium/drivers/panfrost/pan_screen.c
@@ -590,8 +590,8 @@ panfrost_fence_finish(struct pipe_screen *pscreen,
struct panfrost_screen *screen = pan_screen(pscreen);
struct panfrost_fence *f = (struct panfrost_fence *)fence;
int ret;
-
unsigned syncobj;
+
ret = drmSyncobjCreate(screen->fd, 0, &syncobj);
if (ret) {
fprintf(stderr, "Failed to create syncobj to wait on: %m\n");
@@ -623,12 +623,14 @@ panfrost_fence_create(struct panfrost_context *ctx)
if (!f)
return NULL;
+ assert(ctx->last_out_sync);
+
/* Snapshot the last Panfrost's rendering's out fence. We'd rather have
* another syncobj instead of a sync file, but this is all we get.
* (HandleToFD/FDToHandle just gives you another syncobj ID for the
* same syncobj).
*/
- drmSyncobjExportSyncFile(screen->fd, ctx->out_sync, &f->fd);
+ drmSyncobjExportSyncFile(screen->fd, ctx->last_out_sync->syncobj, &f->fd);
if (f->fd == -1) {
fprintf(stderr, "export failed: %m\n");
free(f);
--
2.21.0
More information about the mesa-dev
mailing list