Mesa (main): panfrost: Label all BOs in userspace

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue May 18 19:50:40 UTC 2021


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

Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date:   Wed May 12 17:46:10 2021 -0400

panfrost: Label all BOs in userspace

Doesn't do any fancy cross-process labeling like @shadeslayer's patches
but helps with all your intra-process labeling needs.

Signed-off-by: Alyssa Rosenzweig <alyssa at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10866>

---

 src/gallium/drivers/panfrost/pan_assemble.c  |  3 ++-
 src/gallium/drivers/panfrost/pan_blend_cso.c |  2 +-
 src/gallium/drivers/panfrost/pan_context.c   |  5 +++--
 src/gallium/drivers/panfrost/pan_job.c       | 13 ++++++++-----
 src/gallium/drivers/panfrost/pan_job.h       |  3 ++-
 src/gallium/drivers/panfrost/pan_resource.c  | 26 ++++++++++++++++++++++----
 src/panfrost/lib/pan_bo.c                    | 18 ++++++++++++------
 src/panfrost/lib/pan_bo.h                    |  5 ++++-
 src/panfrost/lib/pan_indirect_dispatch.c     |  5 +++--
 src/panfrost/lib/pan_indirect_draw.c         |  5 +++--
 src/panfrost/lib/pan_pool.c                  |  2 +-
 src/panfrost/lib/pan_props.c                 |  2 +-
 src/panfrost/lib/pan_samples.c               |  2 +-
 13 files changed, 63 insertions(+), 28 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_assemble.c b/src/gallium/drivers/panfrost/pan_assemble.c
index 7e58bce4cff..22198d8c68a 100644
--- a/src/gallium/drivers/panfrost/pan_assemble.c
+++ b/src/gallium/drivers/panfrost/pan_assemble.c
@@ -97,7 +97,8 @@ panfrost_shader_compile(struct panfrost_context *ctx,
 
         /* Prepare the compiled binary for upload */
         if (binary.size) {
-                state->bo = panfrost_bo_create(dev, binary.size, PAN_BO_EXECUTE);
+                state->bo = panfrost_bo_create(dev, binary.size,
+                                PAN_BO_EXECUTE, "Shader binary");
                 memcpy(state->bo->ptr.cpu, binary.data, binary.size);
         }
 
diff --git a/src/gallium/drivers/panfrost/pan_blend_cso.c b/src/gallium/drivers/panfrost/pan_blend_cso.c
index b674daa9fbe..f23860e311b 100644
--- a/src/gallium/drivers/panfrost/pan_blend_cso.c
+++ b/src/gallium/drivers/panfrost/pan_blend_cso.c
@@ -165,7 +165,7 @@ panfrost_get_blend_for_context(struct panfrost_context *ctx, unsigned rti, struc
                    PAN_BO_EXECUTE,
                    PAN_BO_ACCESS_PRIVATE |
                    PAN_BO_ACCESS_READ |
-                   PAN_BO_ACCESS_FRAGMENT);
+                   PAN_BO_ACCESS_FRAGMENT, "Blend shader");
         }
 
         struct panfrost_shader_state *ss = panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index 832675b1bc5..2e27cf3a0d6 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -1270,7 +1270,7 @@ panfrost_create_sampler_view_bo(struct panfrost_sampler_view *so,
                 (pan_is_bifrost(device) ? 0 : MALI_MIDGARD_TEXTURE_LENGTH) +
                 panfrost_estimate_texture_payload_size(device, &iview);
 
-        so->bo = panfrost_bo_create(device, size, 0);
+        so->bo = panfrost_bo_create(device, size, 0, "Texture view");
 
         struct panfrost_ptr payload = so->bo->ptr;
         void *tex = pan_is_bifrost(device) ?
@@ -1594,7 +1594,8 @@ panfrost_begin_query(struct pipe_context *pipe, struct pipe_query *q)
 
                 /* Allocate a bo for the query results to be stored */
                 if (!query->bo) {
-                        query->bo = panfrost_bo_create(dev, size, 0);
+                        query->bo = panfrost_bo_create(dev, size, 0,
+                                        "Occlusion query result");
                 }
 
                 /* Default to 0 if nothing at all drawn. */
diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
index 13fbaad9c51..b33aa5b6296 100644
--- a/src/gallium/drivers/panfrost/pan_job.c
+++ b/src/gallium/drivers/panfrost/pan_job.c
@@ -445,12 +445,13 @@ panfrost_batch_add_fbo_bos(struct panfrost_batch *batch)
 
 struct panfrost_bo *
 panfrost_batch_create_bo(struct panfrost_batch *batch, size_t size,
-                         uint32_t create_flags, uint32_t access_flags)
+                         uint32_t create_flags, uint32_t access_flags,
+                         const char *label)
 {
         struct panfrost_bo *bo;
 
         bo = panfrost_bo_create(pan_device(batch->ctx->base.screen), size,
-                                create_flags);
+                                create_flags, label);
         panfrost_batch_add_bo(batch, bo, access_flags);
 
         /* panfrost_batch_add_bo() has retained a reference and
@@ -492,7 +493,7 @@ panfrost_batch_get_polygon_list(struct panfrost_batch *batch)
                                                  PAN_BO_ACCESS_PRIVATE |
                                                  PAN_BO_ACCESS_RW |
                                                  PAN_BO_ACCESS_VERTEX_TILER |
-                                                 PAN_BO_ACCESS_FRAGMENT);
+                                                 PAN_BO_ACCESS_FRAGMENT, "Polygon list");
 
 
                 if (init_polygon_list) {
@@ -527,7 +528,8 @@ panfrost_batch_get_scratchpad(struct panfrost_batch *batch,
                                              PAN_BO_ACCESS_PRIVATE |
                                              PAN_BO_ACCESS_RW |
                                              PAN_BO_ACCESS_VERTEX_TILER |
-                                             PAN_BO_ACCESS_FRAGMENT);
+                                             PAN_BO_ACCESS_FRAGMENT,
+                                             "Thread local storage");
         }
 
         return batch->scratchpad;
@@ -545,7 +547,8 @@ panfrost_batch_get_shared_memory(struct panfrost_batch *batch,
                                              PAN_BO_INVISIBLE,
                                              PAN_BO_ACCESS_PRIVATE |
                                              PAN_BO_ACCESS_RW |
-                                             PAN_BO_ACCESS_VERTEX_TILER);
+                                             PAN_BO_ACCESS_VERTEX_TILER,
+                                             "Workgroup shared memory");
         }
 
         return batch->shared_memory;
diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h
index 8ede7da7642..9a5194a0dd9 100644
--- a/src/gallium/drivers/panfrost/pan_job.h
+++ b/src/gallium/drivers/panfrost/pan_job.h
@@ -137,7 +137,8 @@ panfrost_batch_add_fbo_bos(struct panfrost_batch *batch);
 
 struct panfrost_bo *
 panfrost_batch_create_bo(struct panfrost_batch *batch, size_t size,
-                         uint32_t create_flags, uint32_t access_flags);
+                         uint32_t create_flags, uint32_t access_flags,
+                         const char *label);
 
 void
 panfrost_flush_all_batches(struct panfrost_context *ctx);
diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c
index f43b5f864d3..f2a6511d892 100644
--- a/src/gallium/drivers/panfrost/pan_resource.c
+++ b/src/gallium/drivers/panfrost/pan_resource.c
@@ -111,7 +111,7 @@ panfrost_resource_from_handle(struct pipe_screen *pscreen,
                 return NULL;
         }
         if (rsc->image.layout.crc_mode == PAN_IMAGE_CRC_OOB)
-                rsc->image.crc.bo = panfrost_bo_create(dev, rsc->image.layout.crc_size, 0);
+                rsc->image.crc.bo = panfrost_bo_create(dev, rsc->image.layout.crc_size, 0, "CRC data");
 
         rsc->modifier_constant = true;
 
@@ -646,10 +646,27 @@ panfrost_resource_create_with_modifier(struct pipe_screen *screen,
 
         panfrost_resource_setup(dev, so, modifier, template->format);
 
+        /* Guess a label based on the bind */
+        unsigned bind = template->bind;
+        const char *label =
+                (bind & PIPE_BIND_INDEX_BUFFER) ? "Index buffer" :
+                (bind & PIPE_BIND_SCANOUT) ? "Scanout" :
+                (bind & PIPE_BIND_DISPLAY_TARGET) ? "Display target" :
+                (bind & PIPE_BIND_SHARED) ? "Shared resource" :
+                (bind & PIPE_BIND_RENDER_TARGET) ? "Render target" :
+                (bind & PIPE_BIND_DEPTH_STENCIL) ? "Depth/stencil buffer" :
+                (bind & PIPE_BIND_SAMPLER_VIEW) ? "Texture" :
+                (bind & PIPE_BIND_VERTEX_BUFFER) ? "Vertex buffer" :
+                (bind & PIPE_BIND_CONSTANT_BUFFER) ? "Constant buffer" :
+                (bind & PIPE_BIND_GLOBAL) ? "Global memory" :
+                (bind & PIPE_BIND_SHADER_BUFFER) ? "Shader buffer" :
+                (bind & PIPE_BIND_SHADER_IMAGE) ? "Shader image" :
+                "Other resource";
+
         /* We create a BO immediately but don't bother mapping, since we don't
          * care to map e.g. FBOs which the CPU probably won't touch */
         so->image.data.bo =
-                panfrost_bo_create(dev, so->image.layout.data_size, PAN_BO_DELAY_MMAP);
+                panfrost_bo_create(dev, so->image.layout.data_size, PAN_BO_DELAY_MMAP, label);
 
         if (drm_is_afbc(so->image.layout.modifier))
                 panfrost_resource_init_afbc_headers(so);
@@ -911,7 +928,7 @@ panfrost_ptr_map(struct pipe_context *pctx,
                          */
                         if (!(bo->flags & PAN_BO_SHARED))
                                 newbo = panfrost_bo_create(dev, bo->size,
-                                                           flags);
+                                                           flags, bo->label);
 
                         if (newbo) {
                                 if (copy_resource)
@@ -1131,9 +1148,10 @@ panfrost_ptr_unmap(struct pipe_context *pctx,
                                         panfrost_resource_setup(dev, prsrc, DRM_FORMAT_MOD_LINEAR,
                                                                 prsrc->image.layout.format);
                                         if (prsrc->image.layout.data_size > bo->size) {
+                                                const char *label = bo->label;
                                                 panfrost_bo_unreference(bo);
                                                 bo = prsrc->image.data.bo =
-                                                        panfrost_bo_create(dev, prsrc->image.layout.data_size, 0);
+                                                        panfrost_bo_create(dev, prsrc->image.layout.data_size, 0, label);
                                                 assert(bo);
                                         }
 
diff --git a/src/panfrost/lib/pan_bo.c b/src/panfrost/lib/pan_bo.c
index ef24c35a6c5..7e07c41cc32 100644
--- a/src/panfrost/lib/pan_bo.c
+++ b/src/panfrost/lib/pan_bo.c
@@ -57,7 +57,7 @@
 
 static struct panfrost_bo *
 panfrost_bo_alloc(struct panfrost_device *dev, size_t size,
-                  uint32_t flags)
+                  uint32_t flags, const char *label)
 {
         struct drm_panfrost_create_bo create_bo = { .size = size };
         struct panfrost_bo *bo;
@@ -85,6 +85,7 @@ panfrost_bo_alloc(struct panfrost_device *dev, size_t size,
         bo->gem_handle = create_bo.handle;
         bo->flags = flags;
         bo->dev = dev;
+        bo->label = label;
         return bo;
 }
 
@@ -189,7 +190,8 @@ pan_bucket(struct panfrost_device *dev, unsigned size)
 
 static struct panfrost_bo *
 panfrost_bo_cache_fetch(struct panfrost_device *dev,
-                        size_t size, uint32_t flags, bool dontwait)
+                        size_t size, uint32_t flags, const char *label,
+                        bool dontwait)
 {
         pthread_mutex_lock(&dev->bo_cache.lock);
         struct list_head *bucket = pan_bucket(dev, size);
@@ -224,6 +226,7 @@ panfrost_bo_cache_fetch(struct panfrost_device *dev,
                 }
                 /* Let's go! */
                 bo = entry;
+                bo->label = label;
                 break;
         }
         pthread_mutex_unlock(&dev->bo_cache.lock);
@@ -292,6 +295,9 @@ panfrost_bo_cache_put(struct panfrost_bo *bo)
         panfrost_bo_cache_evict_stale_bos(dev);
         pthread_mutex_unlock(&dev->bo_cache.lock);
 
+        /* Update the label to help debug BO cache memory usage issues */
+        bo->label = "Unused (BO cache)";
+
         return true;
 }
 
@@ -361,7 +367,7 @@ panfrost_bo_munmap(struct panfrost_bo *bo)
 
 struct panfrost_bo *
 panfrost_bo_create(struct panfrost_device *dev, size_t size,
-                   uint32_t flags)
+                   uint32_t flags, const char *label)
 {
         struct panfrost_bo *bo;
 
@@ -382,11 +388,11 @@ panfrost_bo_create(struct panfrost_device *dev, size_t size,
          * and if that fails too, we try one more time to allocate from the
          * cache, but this time we accept to wait.
          */
-        bo = panfrost_bo_cache_fetch(dev, size, flags, true);
+        bo = panfrost_bo_cache_fetch(dev, size, flags, label, true);
         if (!bo)
-                bo = panfrost_bo_alloc(dev, size, flags);
+                bo = panfrost_bo_alloc(dev, size, flags, label);
         if (!bo)
-                bo = panfrost_bo_cache_fetch(dev, size, flags, false);
+                bo = panfrost_bo_cache_fetch(dev, size, flags, label, false);
 
         if (!bo)
                 fprintf(stderr, "BO creation failed\n");
diff --git a/src/panfrost/lib/pan_bo.h b/src/panfrost/lib/pan_bo.h
index dcb131c03a2..e267cb4d919 100644
--- a/src/panfrost/lib/pan_bo.h
+++ b/src/panfrost/lib/pan_bo.h
@@ -110,6 +110,9 @@ struct panfrost_bo {
          * when the BO is idle.
          */
         uint32_t gpu_access;
+
+        /* Human readable description of the BO for debugging. */
+        const char *label;
 };
 
 bool
@@ -120,7 +123,7 @@ void
 panfrost_bo_unreference(struct panfrost_bo *bo);
 struct panfrost_bo *
 panfrost_bo_create(struct panfrost_device *dev, size_t size,
-                   uint32_t flags);
+                   uint32_t flags, const char *label);
 void
 panfrost_bo_mmap(struct panfrost_bo *bo);
 struct panfrost_bo *
diff --git a/src/panfrost/lib/pan_indirect_dispatch.c b/src/panfrost/lib/pan_indirect_dispatch.c
index 8314e8757b6..db6d638a102 100644
--- a/src/panfrost/lib/pan_indirect_dispatch.c
+++ b/src/panfrost/lib/pan_indirect_dispatch.c
@@ -237,7 +237,8 @@ pan_indirect_dispatch_init(struct panfrost_device *dev)
         assert(!shader_info.sysvals.sysval_count);
 
         dev->indirect_dispatch.bin =
-                panfrost_bo_create(dev, binary.size, PAN_BO_EXECUTE);
+                panfrost_bo_create(dev, binary.size, PAN_BO_EXECUTE,
+                                "Indirect dispatch shader");
 
         memcpy(dev->indirect_dispatch.bin->ptr.cpu, binary.data, binary.size);
         util_dynarray_fini(&binary);
@@ -247,7 +248,7 @@ pan_indirect_dispatch_init(struct panfrost_device *dev)
                 panfrost_bo_create(dev,
                                    MALI_RENDERER_STATE_LENGTH +
                                    MALI_LOCAL_STORAGE_LENGTH,
-                                   0);
+                                   0, "Indirect dispatch descriptors");
 
         mali_ptr address = dev->indirect_dispatch.bin->ptr.gpu;
         if (!pan_is_bifrost(dev))
diff --git a/src/panfrost/lib/pan_indirect_draw.c b/src/panfrost/lib/pan_indirect_draw.c
index 2da1925c778..bae6f106f4f 100644
--- a/src/panfrost/lib/pan_indirect_draw.c
+++ b/src/panfrost/lib/pan_indirect_draw.c
@@ -1188,7 +1188,7 @@ panfrost_indirect_draw_alloc_deps(struct panfrost_device *dev)
                                  MALI_LOCAL_STORAGE_LENGTH;
 
         dev->indirect_draw_shaders.states =
-                panfrost_bo_create(dev, state_bo_size, 0);
+                panfrost_bo_create(dev, state_bo_size, 0, "Indirect draw states");
 
         /* Prepare the thread storage descriptor now since it's invariant. */
         void *tsd = dev->indirect_draw_shaders.states->ptr.cpu +
@@ -1206,7 +1206,8 @@ panfrost_indirect_draw_alloc_deps(struct panfrost_device *dev)
          */
         dev->indirect_draw_shaders.varying_heap =
                 panfrost_bo_create(dev, 512 * 1024 * 1024,
-                                   PAN_BO_INVISIBLE | PAN_BO_GROWABLE);
+                                   PAN_BO_INVISIBLE | PAN_BO_GROWABLE,
+                                   "Indirect draw varying heap");
 
 out:
         pthread_mutex_unlock(&dev->indirect_draw_shaders.lock);
diff --git a/src/panfrost/lib/pan_pool.c b/src/panfrost/lib/pan_pool.c
index a4124e0ccea..c5eb2b31977 100644
--- a/src/panfrost/lib/pan_pool.c
+++ b/src/panfrost/lib/pan_pool.c
@@ -51,7 +51,7 @@ panfrost_pool_alloc_backing(struct pan_pool *pool, size_t bo_sz)
          * fragment/vertex+tiler pools separate.
          */
         struct panfrost_bo *bo = panfrost_bo_create(pool->dev, bo_sz,
-                        pool->create_flags);
+                        pool->create_flags, "Pool memory");
 
         if (pool->owned)
                 util_dynarray_append(&pool->bos, struct panfrost_bo *, bo);
diff --git a/src/panfrost/lib/pan_props.c b/src/panfrost/lib/pan_props.c
index d1ea9c4fe64..1c610f08dc6 100644
--- a/src/panfrost/lib/pan_props.c
+++ b/src/panfrost/lib/pan_props.c
@@ -259,7 +259,7 @@ panfrost_open_device(void *memctx, int fd, struct panfrost_device *dev)
          * shared across batches/contextes */
 
         dev->tiler_heap = panfrost_bo_create(dev, 4096 * 4096,
-                        PAN_BO_INVISIBLE | PAN_BO_GROWABLE);
+                        PAN_BO_INVISIBLE | PAN_BO_GROWABLE, "Tiler heap");
 
         pthread_mutex_init(&dev->submit_lock, NULL);
 
diff --git a/src/panfrost/lib/pan_samples.c b/src/panfrost/lib/pan_samples.c
index fc8f3bb292f..6ccede5ec8c 100644
--- a/src/panfrost/lib/pan_samples.c
+++ b/src/panfrost/lib/pan_samples.c
@@ -139,7 +139,7 @@ void
 panfrost_upload_sample_positions(struct panfrost_device *dev)
 {
         STATIC_ASSERT(sizeof(sample_position_lut) < 4096);
-        dev->sample_positions = panfrost_bo_create(dev, 4096, 0);
+        dev->sample_positions = panfrost_bo_create(dev, 4096, 0, "Sample positions");
 
         memcpy(dev->sample_positions->ptr.cpu, sample_position_lut,
                         sizeof(sample_position_lut));



More information about the mesa-commit mailing list