diff options
author | Boris Brezillon <[email protected]> | 2019-09-15 09:27:14 +0200 |
---|---|---|
committer | Boris Brezillon <[email protected]> | 2019-10-03 16:55:38 -0400 |
commit | a8bd265cefcf3fcf1613c6a79874f8733c6dd6c0 (patch) | |
tree | db790731835368a41a6b912db05e99ce16c237dd | |
parent | ada752afe404a3afc96e401fc979d8040f30204b (diff) |
panfrost: Make panfrost_batch->bos a hash table
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 <[email protected]>
Reviewed-by: Alyssa Rosenzweig <[email protected]>
-rw-r--r-- | src/gallium/drivers/panfrost/pan_job.c | 33 | ||||
-rw-r--r-- | 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 8e2703ae168..785317dbd0b 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 0b37a3131e8..3f2cf1a999f 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; |