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));