Mesa (master): freedreno: don't realloc idle bo's

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Apr 29 00:27:29 UTC 2020


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

Author: Rob Clark <robdclark at chromium.org>
Date:   Fri Apr 24 13:56:09 2020 -0700

freedreno: don't realloc idle bo's

The `DISCARD_WHOLE_RESOURCE` is just a hint.  And `rebind_resource()` is
a bunch of faffing about (and going to get worse in a later patch), so
let's not bother when the bo is already idle.

Signed-off-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4744>

---

 src/gallium/drivers/freedreno/freedreno_resource.c | 12 +++++++-----
 src/gallium/drivers/freedreno/freedreno_resource.h |  6 ++++++
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index 04e0553f670..247fbe53072 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -594,9 +594,13 @@ fd_resource_transfer_map(struct pipe_context *pctx,
 	if (usage & PIPE_TRANSFER_WRITE)
 		op |= DRM_FREEDRENO_PREP_WRITE;
 
+	bool needs_flush = pending(rsc, !!(usage & PIPE_TRANSFER_WRITE));
+
 	if (usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) {
-		realloc_bo(rsc, fd_bo_size(rsc->bo));
-		rebind_resource(ctx, prsc);
+		if (needs_flush || fd_resource_busy(rsc, op)) {
+			realloc_bo(rsc, fd_bo_size(rsc->bo));
+			rebind_resource(ctx, prsc);
+		}
 	} else if ((usage & PIPE_TRANSFER_WRITE) &&
 			   prsc->target == PIPE_BUFFER &&
 			   !util_ranges_intersect(&rsc->valid_buffer_range,
@@ -621,9 +625,7 @@ fd_resource_transfer_map(struct pipe_context *pctx,
 		/* If the GPU is writing to the resource, or if it is reading from the
 		 * resource and we're trying to write to it, flush the renders.
 		 */
-		bool needs_flush = pending(rsc, !!(usage & PIPE_TRANSFER_WRITE));
-		bool busy = needs_flush || (0 != fd_bo_cpu_prep(rsc->bo,
-				ctx->pipe, op | DRM_FREEDRENO_PREP_NOSYNC));
+		bool busy = needs_flush || fd_resource_busy(rsc, op);
 
 		/* if we need to flush/stall, see if we can make a shadow buffer
 		 * to avoid this:
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.h b/src/gallium/drivers/freedreno/freedreno_resource.h
index 478417e6ba3..9cb1270c74a 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.h
+++ b/src/gallium/drivers/freedreno/freedreno_resource.h
@@ -113,6 +113,12 @@ pending(struct fd_resource *rsc, bool write)
 	return false;
 }
 
+static inline bool
+fd_resource_busy(struct fd_resource *rsc, unsigned op)
+{
+	return fd_bo_cpu_prep(rsc->bo, NULL, op | DRM_FREEDRENO_PREP_NOSYNC) != 0;
+}
+
 static inline bool
 has_depth(enum pipe_format format)
 {



More information about the mesa-commit mailing list