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

Author: Rob Clark <[email protected]>
Date:   Fri Feb  4 11:36:40 2022 -0800

freedreno/drm: Add FD_BO_NOMAP hint

Add a hint for buffers that we won't need to mmap.  With the virtio
backend, virglrenderer needs to create a dmabuf fd for mapping into
the host, which we want to avoid when possible.

Low hanging fruit is to use this hint for anything tiled/ubwc.  There
are probably more bo's that can be flagged as such.

TODO add fd_bo_upload() for memcpy to bo.. this would be useful for
uploads, for example, shaders which we just write once and never touch
again.. for virtio this could be implemented with a TRANSFER_TO_HOST
ioctl.

Signed-off-by: Rob Clark <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14900>

---

 src/freedreno/drm/freedreno_bo.c                   | 3 +++
 src/freedreno/drm/freedreno_drmif.h                | 4 +++-
 src/gallium/drivers/freedreno/a5xx/fd5_resource.c  | 2 +-
 src/gallium/drivers/freedreno/a6xx/fd6_gmem.c      | 4 ++--
 src/gallium/drivers/freedreno/a6xx/fd6_resource.c  | 2 +-
 src/gallium/drivers/freedreno/freedreno_resource.c | 1 +
 6 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/freedreno/drm/freedreno_bo.c b/src/freedreno/drm/freedreno_bo.c
index c668cdf8152..5ae55319096 100644
--- a/src/freedreno/drm/freedreno_bo.c
+++ b/src/freedreno/drm/freedreno_bo.c
@@ -461,6 +461,9 @@ fd_bo_map(struct fd_bo *bo)
       uint64_t offset;
       int ret;
 
+      if (bo->alloc_flags & FD_BO_NOMAP)
+         return NULL;
+
       ret = bo->funcs->offset(bo, &offset);
       if (ret) {
          return NULL;
diff --git a/src/freedreno/drm/freedreno_drmif.h 
b/src/freedreno/drm/freedreno_drmif.h
index 85c1a77182d..73c7b5ed84d 100644
--- a/src/freedreno/drm/freedreno_drmif.h
+++ b/src/freedreno/drm/freedreno_drmif.h
@@ -100,8 +100,10 @@ struct fd_fence {
 /* bo flags: */
 #define FD_BO_GPUREADONLY         BITSET_BIT(1)
 #define FD_BO_SCANOUT             BITSET_BIT(2)
+/* Default caching is WRITECOMBINE: */
 #define FD_BO_CACHED_COHERENT     BITSET_BIT(3)
-/* Default caching is WRITECOMBINE */
+/* Hint that the bo will not be mmap'd: */
+#define FD_BO_NOMAP               BITSET_BIT(4)
 
 /* bo access flags: (keep aligned to MSM_PREP_x) */
 #define FD_BO_PREP_READ   BITSET_BIT(0)
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_resource.c 
b/src/gallium/drivers/freedreno/a5xx/fd5_resource.c
index 0aaa3e02135..40cced4a8f1 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_resource.c
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_resource.c
@@ -49,7 +49,7 @@ setup_lrz(struct fd_resource *rsc)
    rsc->lrz_height = lrz_height;
    rsc->lrz_width = lrz_pitch;
    rsc->lrz_pitch = lrz_pitch;
-   rsc->lrz = fd_bo_new(screen->dev, size, 0, "lrz");
+   rsc->lrz = fd_bo_new(screen->dev, size, FD_BO_NOMAP, "lrz");
 }
 
 uint32_t
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c 
b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c
index ced8d123c88..d3fabefffe7 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c
@@ -429,13 +429,13 @@ update_vsc_pipe(struct fd_batch *batch)
    if (!fd6_ctx->vsc_draw_strm) {
       fd6_ctx->vsc_draw_strm = fd_bo_new(
          ctx->screen->dev, VSC_DRAW_STRM_SIZE(fd6_ctx->vsc_draw_strm_pitch),
-         0, "vsc_draw_strm");
+         FD_BO_NOMAP, "vsc_draw_strm");
    }
 
    if (!fd6_ctx->vsc_prim_strm) {
       fd6_ctx->vsc_prim_strm = fd_bo_new(
          ctx->screen->dev, VSC_PRIM_STRM_SIZE(fd6_ctx->vsc_prim_strm_pitch),
-         0, "vsc_prim_strm");
+         FD_BO_NOMAP, "vsc_prim_strm");
    }
 
    OUT_REG(
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_resource.c 
b/src/gallium/drivers/freedreno/a6xx/fd6_resource.c
index 5a9cf1ae6f8..190d3322e72 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_resource.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_resource.c
@@ -220,7 +220,7 @@ setup_lrz(struct fd_resource *rsc)
    rsc->lrz_height = lrz_height;
    rsc->lrz_width = lrz_pitch;
    rsc->lrz_pitch = lrz_pitch;
-   rsc->lrz = fd_bo_new(screen->dev, size, 0, "lrz");
+   rsc->lrz = fd_bo_new(screen->dev, size, FD_BO_NOMAP, "lrz");
 }
 
 static uint32_t
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c 
b/src/gallium/drivers/freedreno/freedreno_resource.c
index 92e691b6db7..094e0643cc3 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -196,6 +196,7 @@ realloc_bo(struct fd_resource *rsc, uint32_t size)
    struct pipe_resource *prsc = &rsc->b.b;
    struct fd_screen *screen = fd_screen(rsc->b.b.screen);
    uint32_t flags =
+      COND(rsc->layout.tile_mode, FD_BO_NOMAP) |
       COND(prsc->usage & PIPE_USAGE_STAGING, FD_BO_CACHED_COHERENT) |
       COND(prsc->bind & PIPE_BIND_SCANOUT, FD_BO_SCANOUT);
    /* TODO other flags? */

Reply via email to