From d11cd6b220c79f17d09ad857fd149cca6e9f7291 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Mon, 30 Nov 2020 10:23:32 +0100 Subject: [PATCH] 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: (cherry picked from commit 387221e4f2b9339633f84d8b91774ddd302ed60a) --- .pick_status.json | 2 +- src/gallium/drivers/panfrost/pan_job.c | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 690ffd76ee1..42e3a29b6fd 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -301,7 +301,7 @@ "description": "panfrost: Make sure we always add a reader -> write dependency when needed", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "c6ebff3ecdde46ef7925326522395b4a50dd65a3" }, diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index 8bda1651ea1..ef4fd644cde 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -44,7 +44,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 @@ -58,6 +58,7 @@ struct panfrost_bo_access { struct util_dynarray readers; struct panfrost_batch_fence *writer; + bool last_is_write; }; static struct panfrost_batch_fence * @@ -397,7 +398,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); @@ -477,7 +478,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 @@ -502,6 +502,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