From 858cc13eb28e4b034e1ce6fb5b2d0a49f0d97534 Mon Sep 17 00:00:00 2001 From: Icecream95 Date: Sat, 18 Jul 2020 11:36:36 +1200 Subject: [PATCH] panfrost: Make panfrost_bo_wait take a wait_readers bool panfrost_bo_wait is often used after panfrost_flush_batches_accessing_bo, so make them take similar arguments for consistency. Reviewed-by: Alyssa Rosenzweig Part-of: --- src/gallium/drivers/panfrost/pan_context.c | 2 +- src/gallium/drivers/panfrost/pan_resource.c | 8 ++++---- src/panfrost/encoder/pan_bo.c | 17 ++++------------- src/panfrost/encoder/pan_bo.h | 3 +-- 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 37c9fee621c..ca383a8a8be 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -1391,7 +1391,7 @@ panfrost_get_query_result(struct pipe_context *pipe, case PIPE_QUERY_OCCLUSION_PREDICATE: case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE: panfrost_flush_batches_accessing_bo(ctx, query->bo, PAN_BO_ACCESS_WRITE); - panfrost_bo_wait(query->bo, INT64_MAX, PAN_BO_ACCESS_WRITE); + panfrost_bo_wait(query->bo, INT64_MAX, false); /* Read back the query results */ unsigned *result = (unsigned *) query->bo->cpu; diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index 9440ef7956a..70a6d3d9b66 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -579,7 +579,7 @@ panfrost_transfer_map(struct pipe_context *pctx, */ panfrost_flush_batches_accessing_bo(ctx, bo, PAN_BO_ACCESS_WRITE); - panfrost_bo_wait(bo, INT64_MAX, PAN_BO_ACCESS_WRITE); + panfrost_bo_wait(bo, INT64_MAX, false); create_new_bo = true; copy_resource = true; @@ -591,7 +591,7 @@ panfrost_transfer_map(struct pipe_context *pctx, * batches), we try to allocate a new one to avoid waiting. */ if (panfrost_pending_batches_access_bo(ctx, bo) || - !panfrost_bo_wait(bo, 0, PAN_BO_ACCESS_RW)) { + !panfrost_bo_wait(bo, 0, true)) { /* We want the BO to be MMAPed. */ uint32_t flags = bo->flags & ~PAN_BO_DELAY_MMAP; struct panfrost_bo *newbo = NULL; @@ -627,10 +627,10 @@ panfrost_transfer_map(struct pipe_context *pctx, } else if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) { if (usage & PIPE_TRANSFER_WRITE) { panfrost_flush_batches_accessing_bo(ctx, bo, true); - panfrost_bo_wait(bo, INT64_MAX, PAN_BO_ACCESS_RW); + panfrost_bo_wait(bo, INT64_MAX, true); } else if (usage & PIPE_TRANSFER_READ) { panfrost_flush_batches_accessing_bo(ctx, bo, false); - panfrost_bo_wait(bo, INT64_MAX, PAN_BO_ACCESS_WRITE); + panfrost_bo_wait(bo, INT64_MAX, false); } } diff --git a/src/panfrost/encoder/pan_bo.c b/src/panfrost/encoder/pan_bo.c index 12ca68f8e49..71bc109060d 100644 --- a/src/panfrost/encoder/pan_bo.c +++ b/src/panfrost/encoder/pan_bo.c @@ -105,16 +105,11 @@ panfrost_bo_free(struct panfrost_bo *bo) /* Returns true if the BO is ready, false otherwise. * access_type is encoding the type of access one wants to ensure is done. - * Say you want to make sure all writers are done writing, you should pass - * PAN_BO_ACCESS_WRITE. - * If you want to wait for all users, you should pass PAN_BO_ACCESS_RW. - * PAN_BO_ACCESS_READ would work too as waiting for readers implies - * waiting for writers as well, but we want to make things explicit and waiting - * only for readers is impossible. + * Waiting is always done for writers, but if wait_readers is set then readers + * are also waited for. */ bool -panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns, - uint32_t access_type) +panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns, bool wait_readers) { struct drm_panfrost_wait_bo req = { .handle = bo->gem_handle, @@ -122,9 +117,6 @@ panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns, }; int ret; - assert(access_type == PAN_BO_ACCESS_WRITE || - access_type == PAN_BO_ACCESS_RW); - /* If the BO has been exported or imported we can't rely on the cached * state, we need to call the WAIT_BO ioctl. */ @@ -136,8 +128,7 @@ panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns, /* If the caller only wants to wait for writers and no * writes are pending, we don't have to wait. */ - if (access_type == PAN_BO_ACCESS_WRITE && - !(bo->gpu_access & PAN_BO_ACCESS_WRITE)) + if (!wait_readers && !(bo->gpu_access & PAN_BO_ACCESS_WRITE)) return true; } diff --git a/src/panfrost/encoder/pan_bo.h b/src/panfrost/encoder/pan_bo.h index dfd182290a3..84d2a0aee98 100644 --- a/src/panfrost/encoder/pan_bo.h +++ b/src/panfrost/encoder/pan_bo.h @@ -107,8 +107,7 @@ struct panfrost_bo { }; bool -panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns, - uint32_t access_type); +panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns, bool wait_readers); void panfrost_bo_reference(struct panfrost_bo *bo); void -- 2.30.2