[Mesa-dev] [PATCH v3 02/17] panfrost: Make panfrost_batch->bos a hash table
Alyssa Rosenzweig
alyssa at rosenzweig.io
Fri Sep 20 20:54:09 UTC 2019
R-b
On Wed, Sep 18, 2019 at 03:24:24PM +0200, Boris Brezillon wrote:
> So we can store the flags as data and keep the BO as a key. This way
> we keep track of the type of access done on BOs.
>
> Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
> ---
> Changes in v3:
> * None
> ---
> src/gallium/drivers/panfrost/pan_job.c | 33 +++++++++++++++++---------
> src/gallium/drivers/panfrost/pan_job.h | 2 +-
> 2 files changed, 23 insertions(+), 12 deletions(-)
>
> diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
> index 8e2703ae168c..785317dbd0b0 100644
> --- a/src/gallium/drivers/panfrost/pan_job.c
> +++ b/src/gallium/drivers/panfrost/pan_job.c
> @@ -44,9 +44,8 @@ panfrost_create_batch(struct panfrost_context *ctx,
>
> batch->ctx = ctx;
>
> - batch->bos = _mesa_set_create(batch,
> - _mesa_hash_pointer,
> - _mesa_key_pointer_equal);
> + batch->bos = _mesa_hash_table_create(batch, _mesa_hash_pointer,
> + _mesa_key_pointer_equal);
>
> batch->minx = batch->miny = ~0;
> batch->maxx = batch->maxy = 0;
> @@ -67,10 +66,8 @@ panfrost_free_batch(struct panfrost_batch *batch)
>
> struct panfrost_context *ctx = batch->ctx;
>
> - set_foreach(batch->bos, entry) {
> - struct panfrost_bo *bo = (struct panfrost_bo *)entry->key;
> - panfrost_bo_unreference(bo);
> - }
> + hash_table_foreach(batch->bos, entry)
> + panfrost_bo_unreference((struct panfrost_bo *)entry->key);
>
> _mesa_hash_table_remove_key(ctx->batches, &batch->key);
>
> @@ -138,11 +135,25 @@ panfrost_batch_add_bo(struct panfrost_batch *batch, struct panfrost_bo *bo,
> if (!bo)
> return;
>
> - if (_mesa_set_search(batch->bos, bo))
> + struct hash_entry *entry;
> + uint32_t old_flags = 0;
> +
> + entry = _mesa_hash_table_search(batch->bos, bo);
> + if (!entry) {
> + entry = _mesa_hash_table_insert(batch->bos, bo,
> + (void *)(uintptr_t)flags);
> + panfrost_bo_reference(bo);
> + } else {
> + old_flags = (uintptr_t)entry->data;
> + }
> +
> + assert(entry);
> +
> + if (old_flags == flags)
> return;
>
> - panfrost_bo_reference(bo);
> - _mesa_set_add(batch->bos, bo);
> + flags |= old_flags;
> + entry->data = (void *)(uintptr_t)flags;
> }
>
> void panfrost_batch_add_fbo_bos(struct panfrost_batch *batch)
> @@ -376,7 +387,7 @@ panfrost_batch_submit_ioctl(struct panfrost_batch *batch,
> bo_handles = calloc(batch->bos->entries, sizeof(*bo_handles));
> assert(bo_handles);
>
> - set_foreach(batch->bos, entry) {
> + hash_table_foreach(batch->bos, entry) {
> struct panfrost_bo *bo = (struct panfrost_bo *)entry->key;
> assert(bo->gem_handle > 0);
> bo_handles[submit.bo_handle_count++] = bo->gem_handle;
> diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h
> index 0b37a3131e86..3f2cf1a999f3 100644
> --- a/src/gallium/drivers/panfrost/pan_job.h
> +++ b/src/gallium/drivers/panfrost/pan_job.h
> @@ -98,7 +98,7 @@ struct panfrost_batch {
> unsigned job_index;
>
> /* BOs referenced -- will be used for flushing logic */
> - struct set *bos;
> + struct hash_table *bos;
>
> /* Current transient BO */
> struct panfrost_bo *transient_bo;
> --
> 2.21.0
More information about the mesa-dev
mailing list