[Mesa-dev] [PATCH v3 09/17] panfrost: Add a panfrost_flush_batches_accessing_bo() helper
Alyssa Rosenzweig
alyssa at rosenzweig.io
Fri Sep 20 21:03:46 UTC 2019
"
On Wed, Sep 18, 2019 at 03:24:31PM +0200, Boris Brezillon wrote:
> This will allow us to only flush batches touching a specific resource,
> which is particularly useful when the CPU needs to access a BO.
>
> Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
> ---
> Changes in v3:
> * Collect R-b
> ---
> src/gallium/drivers/panfrost/pan_job.c | 31 ++++++++++++++++++++++++++
> src/gallium/drivers/panfrost/pan_job.h | 4 ++++
> 2 files changed, 35 insertions(+)
>
> diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
> index 3ccf4bb6b3e9..e7eae399830f 100644
> --- a/src/gallium/drivers/panfrost/pan_job.c
> +++ b/src/gallium/drivers/panfrost/pan_job.c
> @@ -952,6 +952,37 @@ panfrost_flush_all_batches(struct panfrost_context *ctx, bool wait)
> util_dynarray_fini(&syncobjs);
> }
>
> +void
> +panfrost_flush_batches_accessing_bo(struct panfrost_context *ctx,
> + struct panfrost_bo *bo,
> + uint32_t access_type)
> +{
> + struct panfrost_bo_access *access;
> + struct hash_entry *hentry;
> +
> + /* It doesn't make any to flush only the readers. */
> + assert(access_type == PAN_BO_ACCESS_WRITE ||
> + access_type == PAN_BO_ACCESS_RW);
> +
> + hentry = _mesa_hash_table_search(ctx->accessed_bos, bo);
> + access = hentry ? hentry->data : NULL;
> + if (!access)
> + return;
> +
> + if (access_type & PAN_BO_ACCESS_WRITE && access->writer &&
> + access->writer->batch)
> + panfrost_batch_submit(access->writer->batch);
> +
> + if (!(access_type & PAN_BO_ACCESS_READ))
> + return;
> +
> + util_dynarray_foreach(&access->readers, struct panfrost_batch_fence *,
> + reader) {
> + if (*reader && (*reader)->batch)
> + panfrost_batch_submit((*reader)->batch);
> + }
> +}
> +
> void
> panfrost_batch_set_requirements(struct panfrost_batch *batch)
> {
> diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h
> index e95e156a40f8..25905b516739 100644
> --- a/src/gallium/drivers/panfrost/pan_job.h
> +++ b/src/gallium/drivers/panfrost/pan_job.h
> @@ -185,6 +185,10 @@ panfrost_batch_create_bo(struct panfrost_batch *batch, size_t size,
> void
> panfrost_flush_all_batches(struct panfrost_context *ctx, bool wait);
>
> +void
> +panfrost_flush_batches_accessing_bo(struct panfrost_context *ctx,
> + struct panfrost_bo *bo, uint32_t flags);
> +
> void
> panfrost_batch_set_requirements(struct panfrost_batch *batch);
>
> --
> 2.21.0
More information about the mesa-dev
mailing list