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