summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Brezillon <[email protected]>2019-09-15 09:27:14 +0200
committerBoris Brezillon <[email protected]>2019-10-03 16:55:38 -0400
commita8bd265cefcf3fcf1613c6a79874f8733c6dd6c0 (patch)
treedb790731835368a41a6b912db05e99ce16c237dd
parentada752afe404a3afc96e401fc979d8040f30204b (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.c33
-rw-r--r--src/gallium/drivers/panfrost/pan_job.h2
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;