Mesa (master): panfrost: Make sure we always add a reader -> write dependency when needed

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Dec 9 16:28:30 UTC 2020


Module: Mesa
Branch: master
Commit: 387221e4f2b9339633f84d8b91774ddd302ed60a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=387221e4f2b9339633f84d8b91774ddd302ed60a

Author: Boris Brezillon <boris.brezillon at collabora.com>
Date:   Mon Nov 30 10:23:32 2020 +0100

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 <boris.brezillon at collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7831>

---

 src/gallium/drivers/panfrost/pan_job.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
index e226b4cc92a..9f215f2b743 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



More information about the mesa-commit mailing list