panfrost: Make panfrost_bo_wait take a wait_readers bool
authorIcecream95 <ixn@keemail.me>
Fri, 17 Jul 2020 23:36:36 +0000 (11:36 +1200)
committerMarge Bot <eric+marge@anholt.net>
Sat, 18 Jul 2020 01:36:59 +0000 (01:36 +0000)
panfrost_bo_wait is often used after
panfrost_flush_batches_accessing_bo, so make them take similar
arguments for consistency.

Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5962>

src/gallium/drivers/panfrost/pan_context.c
src/gallium/drivers/panfrost/pan_resource.c
src/panfrost/encoder/pan_bo.c
src/panfrost/encoder/pan_bo.h

index 37c9fee621cdbca002f62daa33657cb4f17fa009..ca383a8a8bedb8026e82664adc94e4e2c3547ca5 100644 (file)
@@ -1391,7 +1391,7 @@ panfrost_get_query_result(struct pipe_context *pipe,
         case PIPE_QUERY_OCCLUSION_PREDICATE:
         case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
                 panfrost_flush_batches_accessing_bo(ctx, query->bo, PAN_BO_ACCESS_WRITE);
-                panfrost_bo_wait(query->bo, INT64_MAX, PAN_BO_ACCESS_WRITE);
+                panfrost_bo_wait(query->bo, INT64_MAX, false);
 
                 /* Read back the query results */
                 unsigned *result = (unsigned *) query->bo->cpu;
index 9440ef7956ae857067fe0b3325b82cc341aab75c..70a6d3d9b6690ebfb0096ba5771804d4a116bd1c 100644 (file)
@@ -579,7 +579,7 @@ panfrost_transfer_map(struct pipe_context *pctx,
                  */
 
                 panfrost_flush_batches_accessing_bo(ctx, bo, PAN_BO_ACCESS_WRITE);
-                panfrost_bo_wait(bo, INT64_MAX, PAN_BO_ACCESS_WRITE);
+                panfrost_bo_wait(bo, INT64_MAX, false);
 
                 create_new_bo = true;
                 copy_resource = true;
@@ -591,7 +591,7 @@ panfrost_transfer_map(struct pipe_context *pctx,
                  * batches), we try to allocate a new one to avoid waiting.
                  */
                 if (panfrost_pending_batches_access_bo(ctx, bo) ||
-                    !panfrost_bo_wait(bo, 0, PAN_BO_ACCESS_RW)) {
+                    !panfrost_bo_wait(bo, 0, true)) {
                         /* We want the BO to be MMAPed. */
                         uint32_t flags = bo->flags & ~PAN_BO_DELAY_MMAP;
                         struct panfrost_bo *newbo = NULL;
@@ -627,10 +627,10 @@ panfrost_transfer_map(struct pipe_context *pctx,
         } else if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) {
                 if (usage & PIPE_TRANSFER_WRITE) {
                         panfrost_flush_batches_accessing_bo(ctx, bo, true);
-                        panfrost_bo_wait(bo, INT64_MAX, PAN_BO_ACCESS_RW);
+                        panfrost_bo_wait(bo, INT64_MAX, true);
                 } else if (usage & PIPE_TRANSFER_READ) {
                         panfrost_flush_batches_accessing_bo(ctx, bo, false);
-                        panfrost_bo_wait(bo, INT64_MAX, PAN_BO_ACCESS_WRITE);
+                        panfrost_bo_wait(bo, INT64_MAX, false);
                 }
         }
 
index 12ca68f8e49828f93d72186d7b1d928d560e681f..71bc109060d77a747436dd2eada7f556b33a4bc3 100644 (file)
@@ -105,16 +105,11 @@ panfrost_bo_free(struct panfrost_bo *bo)
 
 /* Returns true if the BO is ready, false otherwise.
  * access_type is encoding the type of access one wants to ensure is done.
- * Say you want to make sure all writers are done writing, you should pass
- * PAN_BO_ACCESS_WRITE.
- * If you want to wait for all users, you should pass PAN_BO_ACCESS_RW.
- * PAN_BO_ACCESS_READ would work too as waiting for readers implies
- * waiting for writers as well, but we want to make things explicit and waiting
- * only for readers is impossible.
+ * Waiting is always done for writers, but if wait_readers is set then readers
+ * are also waited for.
  */
 bool
-panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns,
-                 uint32_t access_type)
+panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns, bool wait_readers)
 {
         struct drm_panfrost_wait_bo req = {
                 .handle = bo->gem_handle,
@@ -122,9 +117,6 @@ panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns,
         };
         int ret;
 
-        assert(access_type == PAN_BO_ACCESS_WRITE ||
-               access_type == PAN_BO_ACCESS_RW);
-
         /* If the BO has been exported or imported we can't rely on the cached
          * state, we need to call the WAIT_BO ioctl.
          */
@@ -136,8 +128,7 @@ panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns,
                 /* If the caller only wants to wait for writers and no
                  * writes are pending, we don't have to wait.
                  */
-                if (access_type == PAN_BO_ACCESS_WRITE &&
-                    !(bo->gpu_access & PAN_BO_ACCESS_WRITE))
+                if (!wait_readers && !(bo->gpu_access & PAN_BO_ACCESS_WRITE))
                         return true;
         }
 
index dfd182290a37ab690246c2baff78e5b5f0eade7d..84d2a0aee988c9f3531e646e4e9fb1eff742a2a0 100644 (file)
@@ -107,8 +107,7 @@ struct panfrost_bo {
 };
 
 bool
-panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns,
-                 uint32_t access_type);
+panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns, bool wait_readers);
 void
 panfrost_bo_reference(struct panfrost_bo *bo);
 void