Mesa (main): freedreno: Cooperate with tc to stop checking the BC for resource_busy().

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 22 17:10:05 UTC 2021


Module: Mesa
Branch: main
Commit: 5cb043cf82af4af88dbfe83ce1eff4cc41e2a766
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5cb043cf82af4af88dbfe83ce1eff4cc41e2a766

Author: Emma Anholt <emma at anholt.net>
Date:   Mon Jun 21 12:31:14 2021 -0700

freedreno: Cooperate with tc to stop checking the BC for resource_busy().

The resource_busy() hook was having to check the batch cache for usage of
the resource, since TC didn't know how long our driver would.  By
committing to calling the tc_driver_internal_flush_notify() hook on
non-deferred flushes, TC keeps track of which buffers have been used but
not flushed and considers them busy, saving us needing to look in the BC
(which we won't be able to do once we move it to being per-context).

drawoverhead test results (all numbers are throughput, n=5):

   1, DrawElements ( 1 VBO| 0 UBO|  0    ) w/ no state change:      -4.94214% +/- 2.45047%
   7, DrawElements ( 1 VBO| 8 UBO|  8 Tex) w/ vertex attrib change: 48.3992% +/- 5.02827%
   8, DrawElements ( 1 VBO| 8 UBO|  8 Tex) w/ 1 texture change:     26.0974% +/- 1.14932%
   9, DrawElements ( 1 VBO| 8 UBO|  8 Tex) w/ 8 textures change:    12.6963% +/- 3.01077%
  17, DrawElements ( 1 VBO| 8 UBO|  8 Tex) w/ 8 UBOs change:        54.3846% +/- 35.0049%

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11513>

---

 src/gallium/drivers/freedreno/freedreno_context.c  | 10 +++++++++-
 src/gallium/drivers/freedreno/freedreno_resource.c | 11 ++++++++---
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c
index 1df71550efa..ce8a6ba0477 100644
--- a/src/gallium/drivers/freedreno/freedreno_context.c
+++ b/src/gallium/drivers/freedreno/freedreno_context.c
@@ -60,6 +60,8 @@ fd_context_flush(struct pipe_context *pctx, struct pipe_fence_handle **fencep,
       if (ctx->screen->reorder)
          fd_bc_flush(ctx, flags & PIPE_FLUSH_DEFERRED);
       fd_bc_dump(ctx, "%p: NULL batch, remaining:\n", ctx);
+      if (!(flags & PIPE_FLUSH_DEFERRED))
+         tc_driver_internal_flush_notify(ctx->tc);
       return;
    }
 
@@ -138,6 +140,12 @@ fd_context_flush(struct pipe_context *pctx, struct pipe_fence_handle **fencep,
    fd_bc_dump(ctx, "%p: remaining:\n", ctx);
 
 out:
+   /* If we just flushed all rendering out of the batch cache, then inform TC
+    * that it can use the resource_busy callback to check if they're still busy.
+    */
+   if (!(flags & PIPE_FLUSH_DEFERRED))
+      tc_driver_internal_flush_notify(ctx->tc);
+
    if (fencep)
       fd_fence_ref(fencep, fence);
 
@@ -703,7 +711,7 @@ fd_context_init_tc(struct pipe_context *pctx, unsigned flags)
       fd_replace_buffer_storage,
       fd_fence_create_unflushed,
       fd_resource_busy,
-      false,
+      true,
       &ctx->tc);
 
    uint64_t total_ram;
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index 89d27504286..d696f02ac0f 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -312,15 +312,20 @@ translate_usage(unsigned usage)
    return op;
 }
 
+/* This is called by TC to check if a buffer is idle on the GPU so it can do
+ * unsynchronized mappings from the frontend.
+ *
+ * Note that TC tracks what buffers are outstanding in its queue in between
+ * pctx->flush() calls (which we inform it of through
+ * tc_driver_internal_flush_notify()) so we don't need to go digging in our
+ * batch cache to check for usages.
+ */
 bool
 fd_resource_busy(struct pipe_screen *pscreen, struct pipe_resource *prsc,
                  unsigned usage)
 {
    struct fd_resource *rsc = fd_resource(prsc);
 
-   if (pending(rsc, !!(usage & PIPE_MAP_WRITE)))
-      return true;
-
    if (resource_busy(rsc, translate_usage(usage)))
       return true;
 



More information about the mesa-commit mailing list