From: Boris Brezillon Date: Mon, 30 Nov 2020 09:23:32 +0000 (+0100) Subject: panfrost: Make sure we always add a reader -> write dependency when needed X-Git-Tag: upstream/21.0.0~1526 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=387221e4f2b9339633f84d8b91774ddd302ed60a;p=platform%2Fupstream%2Fmesa.git panfrost: Make sure we always add a reader -> write dependency when needed We shouldn't reset the ->writer field when a reader comes in because we want subsequent readers to have a dependency on the writer too. Let's add a new field encoding the last access type and use it to replace the writer != NULL test. Reported-by: Roman Elshin Fixes: c6ebff3ecdde ("panfrost: Remove panfrost_bo_access type") Signed-off-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig Part-of: --- diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index e226b4c..9f215f2 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -46,7 +46,7 @@ * better GPU utilization. * * Each accessed BO has a corresponding entry in the ->accessed_bos hash table. - * A BO is either being written or read at any time (see if writer != NULL). + * A BO is either being written or read at any time (see last_is_write). * When the last access is a write, the batch writing the BO might have read * dependencies (readers that have not been executed yet and want to read the * previous BO content), and when the last access is a read, all readers might @@ -60,6 +60,7 @@ struct panfrost_bo_access { struct util_dynarray readers; struct panfrost_batch_fence *writer; + bool last_is_write; }; static struct panfrost_batch_fence * @@ -399,7 +400,7 @@ panfrost_batch_update_bo_access(struct panfrost_batch *batch, entry = _mesa_hash_table_search(ctx->accessed_bos, bo); access = entry ? entry->data : NULL; if (access) { - old_writes = access->writer != NULL; + old_writes = access->last_is_write; } else { access = rzalloc(ctx, struct panfrost_bo_access); util_dynarray_init(&access->readers, access); @@ -479,7 +480,6 @@ panfrost_batch_update_bo_access(struct panfrost_batch *batch, util_dynarray_append(&access->readers, struct panfrost_batch_fence *, batch->out_sync); - access->writer = NULL; } } else { /* We already accessed this BO before, so we should already be @@ -504,6 +504,8 @@ panfrost_batch_update_bo_access(struct panfrost_batch *batch, if (access->writer) panfrost_batch_add_dep(batch, access->writer); } + + access->last_is_write = writes; } void