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@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10866>
This commit is contained in:
Alyssa Rosenzweig 2021-05-12 17:46:10 -04:00 committed by Marge Bot
parent ecd0cf0b27
commit 3fa1f93dac
13 changed files with 63 additions and 28 deletions

View File

@ -97,7 +97,8 @@ panfrost_shader_compile(struct panfrost_context *ctx,
/* Prepare the compiled binary for upload */ /* Prepare the compiled binary for upload */
if (binary.size) { 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); memcpy(state->bo->ptr.cpu, binary.data, binary.size);
} }

View File

@ -165,7 +165,7 @@ panfrost_get_blend_for_context(struct panfrost_context *ctx, unsigned rti, struc
PAN_BO_EXECUTE, PAN_BO_EXECUTE,
PAN_BO_ACCESS_PRIVATE | PAN_BO_ACCESS_PRIVATE |
PAN_BO_ACCESS_READ | 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); struct panfrost_shader_state *ss = panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);

View File

@ -1270,7 +1270,7 @@ panfrost_create_sampler_view_bo(struct panfrost_sampler_view *so,
(pan_is_bifrost(device) ? 0 : MALI_MIDGARD_TEXTURE_LENGTH) + (pan_is_bifrost(device) ? 0 : MALI_MIDGARD_TEXTURE_LENGTH) +
panfrost_estimate_texture_payload_size(device, &iview); 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; struct panfrost_ptr payload = so->bo->ptr;
void *tex = pan_is_bifrost(device) ? 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 */ /* Allocate a bo for the query results to be stored */
if (!query->bo) { 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. */ /* Default to 0 if nothing at all drawn. */

View File

@ -445,12 +445,13 @@ panfrost_batch_add_fbo_bos(struct panfrost_batch *batch)
struct panfrost_bo * struct panfrost_bo *
panfrost_batch_create_bo(struct panfrost_batch *batch, size_t size, 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; struct panfrost_bo *bo;
bo = panfrost_bo_create(pan_device(batch->ctx->base.screen), size, 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(batch, bo, access_flags);
/* panfrost_batch_add_bo() has retained a reference and /* 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_PRIVATE |
PAN_BO_ACCESS_RW | PAN_BO_ACCESS_RW |
PAN_BO_ACCESS_VERTEX_TILER | PAN_BO_ACCESS_VERTEX_TILER |
PAN_BO_ACCESS_FRAGMENT); PAN_BO_ACCESS_FRAGMENT, "Polygon list");
if (init_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_PRIVATE |
PAN_BO_ACCESS_RW | PAN_BO_ACCESS_RW |
PAN_BO_ACCESS_VERTEX_TILER | PAN_BO_ACCESS_VERTEX_TILER |
PAN_BO_ACCESS_FRAGMENT); PAN_BO_ACCESS_FRAGMENT,
"Thread local storage");
} }
return batch->scratchpad; return batch->scratchpad;
@ -545,7 +547,8 @@ panfrost_batch_get_shared_memory(struct panfrost_batch *batch,
PAN_BO_INVISIBLE, PAN_BO_INVISIBLE,
PAN_BO_ACCESS_PRIVATE | PAN_BO_ACCESS_PRIVATE |
PAN_BO_ACCESS_RW | PAN_BO_ACCESS_RW |
PAN_BO_ACCESS_VERTEX_TILER); PAN_BO_ACCESS_VERTEX_TILER,
"Workgroup shared memory");
} }
return batch->shared_memory; return batch->shared_memory;

View File

@ -137,7 +137,8 @@ panfrost_batch_add_fbo_bos(struct panfrost_batch *batch);
struct panfrost_bo * struct panfrost_bo *
panfrost_batch_create_bo(struct panfrost_batch *batch, size_t size, 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 void
panfrost_flush_all_batches(struct panfrost_context *ctx); panfrost_flush_all_batches(struct panfrost_context *ctx);

View File

@ -111,7 +111,7 @@ panfrost_resource_from_handle(struct pipe_screen *pscreen,
return NULL; return NULL;
} }
if (rsc->image.layout.crc_mode == PAN_IMAGE_CRC_OOB) 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; 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); 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 /* 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 */ * care to map e.g. FBOs which the CPU probably won't touch */
so->image.data.bo = 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)) if (drm_is_afbc(so->image.layout.modifier))
panfrost_resource_init_afbc_headers(so); panfrost_resource_init_afbc_headers(so);
@ -911,7 +928,7 @@ panfrost_ptr_map(struct pipe_context *pctx,
*/ */
if (!(bo->flags & PAN_BO_SHARED)) if (!(bo->flags & PAN_BO_SHARED))
newbo = panfrost_bo_create(dev, bo->size, newbo = panfrost_bo_create(dev, bo->size,
flags); flags, bo->label);
if (newbo) { if (newbo) {
if (copy_resource) if (copy_resource)
@ -1131,9 +1148,10 @@ panfrost_ptr_unmap(struct pipe_context *pctx,
panfrost_resource_setup(dev, prsrc, DRM_FORMAT_MOD_LINEAR, panfrost_resource_setup(dev, prsrc, DRM_FORMAT_MOD_LINEAR,
prsrc->image.layout.format); prsrc->image.layout.format);
if (prsrc->image.layout.data_size > bo->size) { if (prsrc->image.layout.data_size > bo->size) {
const char *label = bo->label;
panfrost_bo_unreference(bo); panfrost_bo_unreference(bo);
bo = prsrc->image.data.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); assert(bo);
} }

View File

@ -57,7 +57,7 @@
static struct panfrost_bo * static struct panfrost_bo *
panfrost_bo_alloc(struct panfrost_device *dev, size_t size, 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 drm_panfrost_create_bo create_bo = { .size = size };
struct panfrost_bo *bo; 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->gem_handle = create_bo.handle;
bo->flags = flags; bo->flags = flags;
bo->dev = dev; bo->dev = dev;
bo->label = label;
return bo; return bo;
} }
@ -189,7 +190,8 @@ pan_bucket(struct panfrost_device *dev, unsigned size)
static struct panfrost_bo * static struct panfrost_bo *
panfrost_bo_cache_fetch(struct panfrost_device *dev, 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); pthread_mutex_lock(&dev->bo_cache.lock);
struct list_head *bucket = pan_bucket(dev, size); struct list_head *bucket = pan_bucket(dev, size);
@ -224,6 +226,7 @@ panfrost_bo_cache_fetch(struct panfrost_device *dev,
} }
/* Let's go! */ /* Let's go! */
bo = entry; bo = entry;
bo->label = label;
break; break;
} }
pthread_mutex_unlock(&dev->bo_cache.lock); 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); panfrost_bo_cache_evict_stale_bos(dev);
pthread_mutex_unlock(&dev->bo_cache.lock); 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; return true;
} }
@ -361,7 +367,7 @@ panfrost_bo_munmap(struct panfrost_bo *bo)
struct panfrost_bo * struct panfrost_bo *
panfrost_bo_create(struct panfrost_device *dev, size_t size, panfrost_bo_create(struct panfrost_device *dev, size_t size,
uint32_t flags) uint32_t flags, const char *label)
{ {
struct panfrost_bo *bo; 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 * and if that fails too, we try one more time to allocate from the
* cache, but this time we accept to wait. * 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) if (!bo)
bo = panfrost_bo_alloc(dev, size, flags); bo = panfrost_bo_alloc(dev, size, flags, label);
if (!bo) if (!bo)
bo = panfrost_bo_cache_fetch(dev, size, flags, false); bo = panfrost_bo_cache_fetch(dev, size, flags, label, false);
if (!bo) if (!bo)
fprintf(stderr, "BO creation failed\n"); fprintf(stderr, "BO creation failed\n");

View File

@ -110,6 +110,9 @@ struct panfrost_bo {
* when the BO is idle. * when the BO is idle.
*/ */
uint32_t gpu_access; uint32_t gpu_access;
/* Human readable description of the BO for debugging. */
const char *label;
}; };
bool bool
@ -120,7 +123,7 @@ void
panfrost_bo_unreference(struct panfrost_bo *bo); panfrost_bo_unreference(struct panfrost_bo *bo);
struct panfrost_bo * struct panfrost_bo *
panfrost_bo_create(struct panfrost_device *dev, size_t size, panfrost_bo_create(struct panfrost_device *dev, size_t size,
uint32_t flags); uint32_t flags, const char *label);
void void
panfrost_bo_mmap(struct panfrost_bo *bo); panfrost_bo_mmap(struct panfrost_bo *bo);
struct panfrost_bo * struct panfrost_bo *

View File

@ -237,7 +237,8 @@ pan_indirect_dispatch_init(struct panfrost_device *dev)
assert(!shader_info.sysvals.sysval_count); assert(!shader_info.sysvals.sysval_count);
dev->indirect_dispatch.bin = 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); memcpy(dev->indirect_dispatch.bin->ptr.cpu, binary.data, binary.size);
util_dynarray_fini(&binary); util_dynarray_fini(&binary);
@ -247,7 +248,7 @@ pan_indirect_dispatch_init(struct panfrost_device *dev)
panfrost_bo_create(dev, panfrost_bo_create(dev,
MALI_RENDERER_STATE_LENGTH + MALI_RENDERER_STATE_LENGTH +
MALI_LOCAL_STORAGE_LENGTH, MALI_LOCAL_STORAGE_LENGTH,
0); 0, "Indirect dispatch descriptors");
mali_ptr address = dev->indirect_dispatch.bin->ptr.gpu; mali_ptr address = dev->indirect_dispatch.bin->ptr.gpu;
if (!pan_is_bifrost(dev)) if (!pan_is_bifrost(dev))

View File

@ -1188,7 +1188,7 @@ panfrost_indirect_draw_alloc_deps(struct panfrost_device *dev)
MALI_LOCAL_STORAGE_LENGTH; MALI_LOCAL_STORAGE_LENGTH;
dev->indirect_draw_shaders.states = 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. */ /* Prepare the thread storage descriptor now since it's invariant. */
void *tsd = dev->indirect_draw_shaders.states->ptr.cpu + 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 = dev->indirect_draw_shaders.varying_heap =
panfrost_bo_create(dev, 512 * 1024 * 1024, panfrost_bo_create(dev, 512 * 1024 * 1024,
PAN_BO_INVISIBLE | PAN_BO_GROWABLE); PAN_BO_INVISIBLE | PAN_BO_GROWABLE,
"Indirect draw varying heap");
out: out:
pthread_mutex_unlock(&dev->indirect_draw_shaders.lock); pthread_mutex_unlock(&dev->indirect_draw_shaders.lock);

View File

@ -51,7 +51,7 @@ panfrost_pool_alloc_backing(struct pan_pool *pool, size_t bo_sz)
* fragment/vertex+tiler pools separate. * fragment/vertex+tiler pools separate.
*/ */
struct panfrost_bo *bo = panfrost_bo_create(pool->dev, bo_sz, struct panfrost_bo *bo = panfrost_bo_create(pool->dev, bo_sz,
pool->create_flags); pool->create_flags, "Pool memory");
if (pool->owned) if (pool->owned)
util_dynarray_append(&pool->bos, struct panfrost_bo *, bo); util_dynarray_append(&pool->bos, struct panfrost_bo *, bo);

View File

@ -259,7 +259,7 @@ panfrost_open_device(void *memctx, int fd, struct panfrost_device *dev)
* shared across batches/contextes */ * shared across batches/contextes */
dev->tiler_heap = panfrost_bo_create(dev, 4096 * 4096, 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); pthread_mutex_init(&dev->submit_lock, NULL);

View File

@ -139,7 +139,7 @@ void
panfrost_upload_sample_positions(struct panfrost_device *dev) panfrost_upload_sample_positions(struct panfrost_device *dev)
{ {
STATIC_ASSERT(sizeof(sample_position_lut) < 4096); 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, memcpy(dev->sample_positions->ptr.cpu, sample_position_lut,
sizeof(sample_position_lut)); sizeof(sample_position_lut));