From a8fd58eae59607ac42eaa7187b0d9e6c51b83af9 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Fri, 12 May 2017 16:05:44 -0700 Subject: [PATCH] vc4: Add labels to BOs for debug builds or with VC4_DEBUG=surf set. This has proven to be incredibly useful for debugging CMA allocation failures and driving memory management improvements. However, we don't want to burden entry and exit from the BO cache with the labeling ioctl's overhead on release builds. --- src/gallium/drivers/vc4/vc4_bufmgr.c | 30 ++++++++++++++++++++++++++ src/gallium/drivers/vc4/vc4_bufmgr.h | 3 +++ src/gallium/drivers/vc4/vc4_resource.c | 5 +++++ src/gallium/drivers/vc4/vc4_state.c | 3 +++ 4 files changed, 41 insertions(+) diff --git a/src/gallium/drivers/vc4/vc4_bufmgr.c b/src/gallium/drivers/vc4/vc4_bufmgr.c index 0653f882323..9c4cc4cba88 100644 --- a/src/gallium/drivers/vc4/vc4_bufmgr.c +++ b/src/gallium/drivers/vc4/vc4_bufmgr.c @@ -48,6 +48,32 @@ static bool dump_stats = false; static void vc4_bo_cache_free_all(struct vc4_bo_cache *cache); +void +vc4_bo_label(struct vc4_screen *screen, struct vc4_bo *bo, const char *fmt, ...) +{ + /* Perform BO labeling by default on debug builds (so that you get + * whole-system allocation information), or if VC4_DEBUG=surf is set + * (for debugging a single app's allocation). + */ +#ifndef DEBUG + if (!(VC4_DEBUG & VC4_DEBUG_SURFACE)) + return; +#endif + va_list va; + va_start(va, fmt); + char *name = ralloc_vasprintf(NULL, fmt, va); + va_end(va); + + struct drm_vc4_label_bo label = { + .handle = bo->handle, + .len = strlen(name), + .name = (uintptr_t)name, + }; + drmIoctl(screen->fd, DRM_IOCTL_VC4_LABEL_BO, &label); + + ralloc_free(name); +} + static void vc4_bo_dump_stats(struct vc4_screen *screen) { @@ -114,6 +140,7 @@ vc4_bo_from_cache(struct vc4_screen *screen, uint32_t size, const char *name) pipe_reference_init(&bo->reference, 1); vc4_bo_remove_from_cache(cache, bo); + vc4_bo_label(screen, bo, "%s", name); bo->name = name; } mtx_unlock(&cache->lock); @@ -176,6 +203,8 @@ vc4_bo_alloc(struct vc4_screen *screen, uint32_t size, const char *name) vc4_bo_dump_stats(screen); } + vc4_bo_label(screen, bo, "%s", name); + return bo; } @@ -307,6 +336,7 @@ vc4_bo_last_unreference_locked_timed(struct vc4_bo *bo, time_t time) vc4_bo_dump_stats(screen); } bo->name = NULL; + vc4_bo_label(screen, bo, "mesa cache"); free_stale_bos(screen, time); } diff --git a/src/gallium/drivers/vc4/vc4_bufmgr.h b/src/gallium/drivers/vc4/vc4_bufmgr.h index 838314f43df..4e7b23e0862 100644 --- a/src/gallium/drivers/vc4/vc4_bufmgr.h +++ b/src/gallium/drivers/vc4/vc4_bufmgr.h @@ -131,6 +131,9 @@ bool vc4_wait_seqno(struct vc4_screen *screen, uint64_t seqno, uint64_t timeout_ns, const char *reason); +void +vc4_bo_label(struct vc4_screen *screen, struct vc4_bo *bo, const char *fmt, ...); + void vc4_bufmgr_destroy(struct pipe_screen *pscreen); diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c index 853f7bbfa17..cdcbcc917e0 100644 --- a/src/gallium/drivers/vc4/vc4_resource.c +++ b/src/gallium/drivers/vc4/vc4_resource.c @@ -675,6 +675,11 @@ vc4_resource_create_with_modifiers(struct pipe_screen *pscreen, goto fail; } + vc4_bo_label(screen, rsc->bo, "%sresource %dx%d@%d/%d", + (tmpl->bind & PIPE_BIND_SCANOUT) ? "scanout " : "", + tmpl->width0, tmpl->height0, + rsc->cpp * 8, prsc->last_level); + return prsc; fail: vc4_resource_destroy(pscreen, prsc); diff --git a/src/gallium/drivers/vc4/vc4_state.c b/src/gallium/drivers/vc4/vc4_state.c index d6d44793e38..17aa7eb3971 100644 --- a/src/gallium/drivers/vc4/vc4_state.c +++ b/src/gallium/drivers/vc4/vc4_state.c @@ -587,6 +587,9 @@ vc4_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc, return NULL; } rsc = vc4_resource(prsc); + vc4_bo_label(vc4_screen(pctx->screen), rsc->bo, + "tiling shadow %dx%d", + tmpl.width0, tmpl.height0); /* Flag it as needing update of the contents from the parent. */ rsc->writes = shadow_parent->writes - 1; -- 2.30.2