panfrost: Add a panfrost_flush_batches_accessing_bo() helper

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@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
This commit is contained in:
Boris Brezillon 2019-09-15 20:17:14 +02:00
parent a45984b244
commit 82399b58d3
2 changed files with 35 additions and 0 deletions

View file

@ -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)
{

View file

@ -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);