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 <boris.brezillon@collabora.com> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
This commit is contained in:
@@ -44,9 +44,8 @@ panfrost_create_batch(struct panfrost_context *ctx,
|
|||||||
|
|
||||||
batch->ctx = ctx;
|
batch->ctx = ctx;
|
||||||
|
|
||||||
batch->bos = _mesa_set_create(batch,
|
batch->bos = _mesa_hash_table_create(batch, _mesa_hash_pointer,
|
||||||
_mesa_hash_pointer,
|
_mesa_key_pointer_equal);
|
||||||
_mesa_key_pointer_equal);
|
|
||||||
|
|
||||||
batch->minx = batch->miny = ~0;
|
batch->minx = batch->miny = ~0;
|
||||||
batch->maxx = batch->maxy = 0;
|
batch->maxx = batch->maxy = 0;
|
||||||
@@ -67,10 +66,8 @@ panfrost_free_batch(struct panfrost_batch *batch)
|
|||||||
|
|
||||||
struct panfrost_context *ctx = batch->ctx;
|
struct panfrost_context *ctx = batch->ctx;
|
||||||
|
|
||||||
set_foreach(batch->bos, entry) {
|
hash_table_foreach(batch->bos, entry)
|
||||||
struct panfrost_bo *bo = (struct panfrost_bo *)entry->key;
|
panfrost_bo_unreference((struct panfrost_bo *)entry->key);
|
||||||
panfrost_bo_unreference(bo);
|
|
||||||
}
|
|
||||||
|
|
||||||
_mesa_hash_table_remove_key(ctx->batches, &batch->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)
|
if (!bo)
|
||||||
return;
|
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;
|
return;
|
||||||
|
|
||||||
panfrost_bo_reference(bo);
|
flags |= old_flags;
|
||||||
_mesa_set_add(batch->bos, bo);
|
entry->data = (void *)(uintptr_t)flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
void panfrost_batch_add_fbo_bos(struct panfrost_batch *batch)
|
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));
|
bo_handles = calloc(batch->bos->entries, sizeof(*bo_handles));
|
||||||
assert(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;
|
struct panfrost_bo *bo = (struct panfrost_bo *)entry->key;
|
||||||
assert(bo->gem_handle > 0);
|
assert(bo->gem_handle > 0);
|
||||||
bo_handles[submit.bo_handle_count++] = bo->gem_handle;
|
bo_handles[submit.bo_handle_count++] = bo->gem_handle;
|
||||||
|
@@ -98,7 +98,7 @@ struct panfrost_batch {
|
|||||||
unsigned job_index;
|
unsigned job_index;
|
||||||
|
|
||||||
/* BOs referenced -- will be used for flushing logic */
|
/* BOs referenced -- will be used for flushing logic */
|
||||||
struct set *bos;
|
struct hash_table *bos;
|
||||||
|
|
||||||
/* Current transient BO */
|
/* Current transient BO */
|
||||||
struct panfrost_bo *transient_bo;
|
struct panfrost_bo *transient_bo;
|
||||||
|
Reference in New Issue
Block a user