Mesa (master): freedreno: debug GEM obj names

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Dec 13 20:53:39 UTC 2018


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

Author: Rob Clark <robdclark at gmail.com>
Date:   Fri Nov 30 08:29:51 2018 -0500

freedreno: debug GEM obj names

With a recent enough kernel, set debug names for GEM BOs, which will
show up in $debugfs/gem

Signed-off-by: Rob Clark <robdclark at gmail.com>

---

 src/freedreno/drm/freedreno_bo.c                   |  9 ++++-
 src/freedreno/drm/freedreno_drmif.h                | 40 +++++++++++++++++++++-
 src/freedreno/drm/freedreno_priv.h                 |  1 +
 src/freedreno/drm/msm_bo.c                         | 22 +++++++++++-
 src/freedreno/ir3/ir3_shader.c                     |  4 ++-
 src/gallium/drivers/freedreno/a3xx/fd3_context.c   |  6 ++--
 src/gallium/drivers/freedreno/a3xx/fd3_gmem.c      |  2 +-
 src/gallium/drivers/freedreno/a4xx/fd4_context.c   |  6 ++--
 src/gallium/drivers/freedreno/a4xx/fd4_gmem.c      |  2 +-
 src/gallium/drivers/freedreno/a5xx/fd5_context.c   |  4 +--
 src/gallium/drivers/freedreno/a5xx/fd5_gmem.c      |  2 +-
 src/gallium/drivers/freedreno/a6xx/fd6_context.c   |  6 ++--
 src/gallium/drivers/freedreno/freedreno_resource.c |  8 +++--
 13 files changed, 91 insertions(+), 21 deletions(-)

diff --git a/src/freedreno/drm/freedreno_bo.c b/src/freedreno/drm/freedreno_bo.c
index ec46e16e9e..7449160f13 100644
--- a/src/freedreno/drm/freedreno_bo.c
+++ b/src/freedreno/drm/freedreno_bo.c
@@ -105,7 +105,7 @@ bo_new(struct fd_device *dev, uint32_t size, uint32_t flags,
 }
 
 struct fd_bo *
-fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags)
+_fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags)
 {
 	struct fd_bo *bo = bo_new(dev, size, flags, &dev->bo_cache);
 	if (bo)
@@ -113,6 +113,12 @@ fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags)
 	return bo;
 }
 
+void
+_fd_bo_set_name(struct fd_bo *bo, const char *fmt, va_list ap)
+{
+	bo->funcs->set_name(bo, fmt, ap);
+}
+
 /* internal function to allocate bo's that use the ringbuffer cache
  * instead of the normal bo_cache.  The purpose is, because cmdstream
  * bo's get vmap'd on the kernel side, and that is expensive, we want
@@ -124,6 +130,7 @@ fd_bo_new_ring(struct fd_device *dev, uint32_t size, uint32_t flags)
 	struct fd_bo *bo = bo_new(dev, size, flags, &dev->ring_cache);
 	if (bo)
 		bo->bo_reuse = RING_CACHE;
+	fd_bo_set_name(bo, "cmdstream");
 	return bo;
 }
 
diff --git a/src/freedreno/drm/freedreno_drmif.h b/src/freedreno/drm/freedreno_drmif.h
index 27ca0a96f2..a53c340695 100644
--- a/src/freedreno/drm/freedreno_drmif.h
+++ b/src/freedreno/drm/freedreno_drmif.h
@@ -29,6 +29,8 @@
 
 #include <stdint.h>
 
+#include "util/u_debug.h"
+
 struct fd_bo;
 struct fd_pipe;
 struct fd_device;
@@ -107,8 +109,44 @@ int fd_pipe_wait_timeout(struct fd_pipe *pipe, uint32_t timestamp,
 /* buffer-object functions:
  */
 
-struct fd_bo * fd_bo_new(struct fd_device *dev,
+struct fd_bo * _fd_bo_new(struct fd_device *dev,
 		uint32_t size, uint32_t flags);
+void _fd_bo_set_name(struct fd_bo *bo, const char *fmt, va_list ap);
+
+static inline void
+fd_bo_set_name(struct fd_bo *bo, const char *fmt, ...) _util_printf_format(2, 3);
+
+static inline void
+fd_bo_set_name(struct fd_bo *bo, const char *fmt, ...)
+{
+#ifndef NDEBUG
+	va_list ap;
+	va_start(ap, fmt);
+	_fd_bo_set_name(bo, fmt, ap);
+	va_end(ap);
+#endif
+}
+
+static inline struct fd_bo *
+fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags,
+		const char *fmt, ...) _util_printf_format(4, 5);
+
+static inline struct fd_bo *
+fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags,
+		const char *fmt, ...)
+{
+	struct fd_bo *bo = _fd_bo_new(dev, size, flags);
+#ifndef NDEBUG
+	if (fmt) {
+		va_list ap;
+		va_start(ap, fmt);
+		_fd_bo_set_name(bo, fmt, ap);
+		va_end(ap);
+	}
+#endif
+	return bo;
+}
+
 struct fd_bo *fd_bo_from_handle(struct fd_device *dev,
 		uint32_t handle, uint32_t size);
 struct fd_bo * fd_bo_from_name(struct fd_device *dev, uint32_t name);
diff --git a/src/freedreno/drm/freedreno_priv.h b/src/freedreno/drm/freedreno_priv.h
index 45a5d6ccba..349a229647 100644
--- a/src/freedreno/drm/freedreno_priv.h
+++ b/src/freedreno/drm/freedreno_priv.h
@@ -154,6 +154,7 @@ struct fd_bo_funcs {
 	void (*cpu_fini)(struct fd_bo *bo);
 	int (*madvise)(struct fd_bo *bo, int willneed);
 	uint64_t (*iova)(struct fd_bo *bo);
+	void (*set_name)(struct fd_bo *bo, const char *fmt, va_list ap);
 	void (*destroy)(struct fd_bo *bo);
 };
 
diff --git a/src/freedreno/drm/msm_bo.c b/src/freedreno/drm/msm_bo.c
index 95f888b6cf..fd9955ea80 100644
--- a/src/freedreno/drm/msm_bo.c
+++ b/src/freedreno/drm/msm_bo.c
@@ -117,11 +117,30 @@ static uint64_t msm_bo_iova(struct fd_bo *bo)
 	return req.value;
 }
 
+static void msm_bo_set_name(struct fd_bo *bo, const char *fmt, va_list ap)
+{
+	struct drm_msm_gem_info req = {
+			.handle = bo->handle,
+			.info = MSM_INFO_SET_NAME,
+	};
+	char buf[32];
+	int sz;
+
+	if (bo->dev->version < FD_VERSION_SOFTPIN)
+		return;
+
+	sz = vsnprintf(buf, sizeof(buf), fmt, ap);
+
+	req.value = VOID2U64(buf);
+	req.len = MIN2(sz, sizeof(buf));
+
+	drmCommandWrite(bo->dev->fd, DRM_MSM_GEM_INFO, &req, sizeof(req));
+}
+
 static void msm_bo_destroy(struct fd_bo *bo)
 {
 	struct msm_bo *msm_bo = to_msm_bo(bo);
 	free(msm_bo);
-
 }
 
 static const struct fd_bo_funcs funcs = {
@@ -130,6 +149,7 @@ static const struct fd_bo_funcs funcs = {
 		.cpu_fini = msm_bo_cpu_fini,
 		.madvise = msm_bo_madvise,
 		.iova = msm_bo_iova,
+		.set_name = msm_bo_set_name,
 		.destroy = msm_bo_destroy,
 };
 
diff --git a/src/freedreno/ir3/ir3_shader.c b/src/freedreno/ir3/ir3_shader.c
index 74d92e1396..51c7b75ea3 100644
--- a/src/freedreno/ir3/ir3_shader.c
+++ b/src/freedreno/ir3/ir3_shader.c
@@ -126,6 +126,7 @@ static void
 assemble_variant(struct ir3_shader_variant *v)
 {
 	struct ir3_compiler *compiler = v->shader->compiler;
+	struct shader_info *info = &v->shader->nir->info;
 	uint32_t gpu_id = compiler->gpu_id;
 	uint32_t sz, *bin;
 
@@ -134,7 +135,8 @@ assemble_variant(struct ir3_shader_variant *v)
 
 	v->bo = fd_bo_new(compiler->dev, sz,
 			DRM_FREEDRENO_GEM_CACHE_WCOMBINE |
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM,
+			"%s:%s", ir3_shader_stage(v->shader), info->name);
 
 	memcpy(fd_bo_map(v->bo), bin, sz);
 
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_context.c b/src/gallium/drivers/freedreno/a3xx/fd3_context.c
index 9927191ea4..59dcaa4bf6 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_context.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_context.c
@@ -101,13 +101,13 @@ fd3_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
 	fd_hw_query_init(pctx);
 
 	fd3_ctx->vs_pvt_mem = fd_bo_new(screen->dev, 0x2000,
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM, "vs_pvt");
 
 	fd3_ctx->fs_pvt_mem = fd_bo_new(screen->dev, 0x2000,
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM, "fs_pvt");
 
 	fd3_ctx->vsc_size_mem = fd_bo_new(screen->dev, 0x1000,
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_size");
 
 	fd_context_setup_common_vbos(&fd3_ctx->base);
 
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
index d01b656b0a..7de0a92cdc 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
@@ -785,7 +785,7 @@ update_vsc_pipe(struct fd_batch *batch)
 
 		if (!pipe->bo) {
 			pipe->bo = fd_bo_new(ctx->dev, 0x40000,
-					DRM_FREEDRENO_GEM_TYPE_KMEM);
+					DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_pipe[%u]", i);
 		}
 
 		OUT_PKT0(ring, REG_A3XX_VSC_PIPE(i), 3);
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_context.c b/src/gallium/drivers/freedreno/a4xx/fd4_context.c
index fc9aad610c..e9730e9c20 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_context.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_context.c
@@ -101,13 +101,13 @@ fd4_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
 	fd_hw_query_init(pctx);
 
 	fd4_ctx->vs_pvt_mem = fd_bo_new(screen->dev, 0x2000,
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM, "vs_pvt");
 
 	fd4_ctx->fs_pvt_mem = fd_bo_new(screen->dev, 0x2000,
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM, "fs_pvt");
 
 	fd4_ctx->vsc_size_mem = fd_bo_new(screen->dev, 0x1000,
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_size");
 
 	fd_context_setup_common_vbos(&fd4_ctx->base);
 
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c b/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c
index aa6cb81e2f..d061c8ac70 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c
@@ -582,7 +582,7 @@ update_vsc_pipe(struct fd_batch *batch)
 		struct fd_vsc_pipe *pipe = &ctx->vsc_pipe[i];
 		if (!pipe->bo) {
 			pipe->bo = fd_bo_new(ctx->dev, 0x40000,
-					DRM_FREEDRENO_GEM_TYPE_KMEM);
+					DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_pipe[%u]", i);
 		}
 		OUT_RELOCW(ring, pipe->bo, 0, 0, 0);       /* VSC_PIPE_DATA_ADDRESS[i] */
 	}
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_context.c b/src/gallium/drivers/freedreno/a5xx/fd5_context.c
index 985face47a..37e02c61b1 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_context.c
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_context.c
@@ -104,10 +104,10 @@ fd5_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
 	util_blitter_set_texture_multisample(fd5_ctx->base.blitter, true);
 
 	fd5_ctx->vsc_size_mem = fd_bo_new(screen->dev, 0x1000,
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_size");
 
 	fd5_ctx->blit_mem = fd_bo_new(screen->dev, 0x1000,
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM, "blit");
 
 	fd_context_setup_common_vbos(&fd5_ctx->base);
 
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c b/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c
index 9d7ebced31..d72d36dde3 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c
@@ -290,7 +290,7 @@ update_vsc_pipe(struct fd_batch *batch)
 		struct fd_vsc_pipe *pipe = &ctx->vsc_pipe[i];
 		if (!pipe->bo) {
 			pipe->bo = fd_bo_new(ctx->dev, 0x20000,
-					DRM_FREEDRENO_GEM_TYPE_KMEM);
+					DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_pipe[%u]", i);
 		}
 		OUT_RELOCW(ring, pipe->bo, 0, 0, 0);     /* VSC_PIPE_DATA_ADDRESS[i].LO/HI */
 	}
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_context.c b/src/gallium/drivers/freedreno/a6xx/fd6_context.c
index 0831808262..b8939b1449 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_context.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_context.c
@@ -111,14 +111,14 @@ fd6_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
 
 	fd6_ctx->vsc_data = fd_bo_new(screen->dev,
 			(A6XX_VSC_DATA_PITCH * 32) + 0x100,
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_data");
 
 	fd6_ctx->vsc_data2 = fd_bo_new(screen->dev,
 			A6XX_VSC_DATA2_PITCH * 32,
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_data2");
 
 	fd6_ctx->blit_mem = fd_bo_new(screen->dev, 0x1000,
-			DRM_FREEDRENO_GEM_TYPE_KMEM);
+			DRM_FREEDRENO_GEM_TYPE_KMEM, "blit");
 
 	fd_context_setup_common_vbos(&fd6_ctx->base);
 
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index 85bbbe271f..e59dc96ce3 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -97,10 +97,11 @@ rebind_resource(struct fd_context *ctx, struct pipe_resource *prsc)
 static void
 realloc_bo(struct fd_resource *rsc, uint32_t size)
 {
+	struct pipe_resource *prsc = &rsc->base;
 	struct fd_screen *screen = fd_screen(rsc->base.screen);
 	uint32_t flags = DRM_FREEDRENO_GEM_CACHE_WCOMBINE |
 			DRM_FREEDRENO_GEM_TYPE_KMEM |
-			COND(rsc->base.bind & PIPE_BIND_SCANOUT, DRM_FREEDRENO_GEM_SCANOUT);
+			COND(prsc->bind & PIPE_BIND_SCANOUT, DRM_FREEDRENO_GEM_SCANOUT);
 			/* TODO other flags? */
 
 	/* if we start using things other than write-combine,
@@ -110,7 +111,8 @@ realloc_bo(struct fd_resource *rsc, uint32_t size)
 	if (rsc->bo)
 		fd_bo_del(rsc->bo);
 
-	rsc->bo = fd_bo_new(screen->dev, size, flags);
+	rsc->bo = fd_bo_new(screen->dev, size, flags, "%ux%ux%u@%u:%x",
+			prsc->width0, prsc->height0, prsc->depth0, rsc->cpp, prsc->bind);
 	rsc->seqno = p_atomic_inc_return(&screen->rsc_seqno);
 	util_range_set_empty(&rsc->valid_buffer_range);
 	fd_bc_invalidate_resource(rsc, true);
@@ -869,7 +871,7 @@ fd_resource_create(struct pipe_screen *pscreen,
 		rsc->lrz_height = lrz_height;
 		rsc->lrz_width = lrz_pitch;
 		rsc->lrz_pitch = lrz_pitch;
-		rsc->lrz = fd_bo_new(screen->dev, size, flags);
+		rsc->lrz = fd_bo_new(screen->dev, size, flags, "lrz");
 	}
 
 	size = screen->setup_slices(rsc);




More information about the mesa-commit mailing list