diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c index 016104a613b..74bfe993537 100644 --- a/src/amd/vulkan/radv_debug.c +++ b/src/amd/vulkan/radv_debug.c @@ -667,6 +667,10 @@ radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_cmdbuf *cs) fclose(f); } + fprintf(stderr, "BOs:\n"); + device->ws->dump_bo_ranges(device->ws, stderr); + fprintf(stderr, "\n"); + /* Dump VM fault info. */ if (vm_fault_occurred) { snprintf(dump_path, sizeof(dump_path), "%s/%s", dump_dir, "vm_fault.log"); diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h index da410e5ef63..8cf1b38f242 100644 --- a/src/amd/vulkan/radv_radeon_winsys.h +++ b/src/amd/vulkan/radv_radeon_winsys.h @@ -299,6 +299,8 @@ struct radeon_winsys { void (*cs_dump)(struct radeon_cmdbuf *cs, FILE* file, const int *trace_ids, int trace_id_count); + void (*dump_bo_ranges)(struct radeon_winsys *ws, FILE *file); + int (*surface_init)(struct radeon_winsys *ws, const struct ac_surf_info *surf_info, struct radeon_surf *surf); diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c index ee274552355..d775f5bcaa5 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c @@ -855,6 +855,42 @@ radv_amdgpu_winsys_bo_get_metadata(struct radeon_winsys_bo *_bo, memcpy(md->metadata, info.metadata.umd_metadata, sizeof(md->metadata)); } +static int radv_amdgpu_bo_va_compare(const void *a, const void *b) +{ + const struct radv_amdgpu_winsys_bo *bo_a = *(const struct radv_amdgpu_winsys_bo * const*)a; + const struct radv_amdgpu_winsys_bo *bo_b = *(const struct radv_amdgpu_winsys_bo * const*)b; + return bo_a->base.va < bo_b->base.va ? -1 : bo_a->base.va > bo_b->base.va ? 1 : 0; +} + +static void radv_amdgpu_dump_bo_ranges(struct radeon_winsys *_ws, FILE *file) +{ + struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws); + if (ws->debug_all_bos) { + struct radv_amdgpu_winsys_bo *bo; + struct radv_amdgpu_winsys_bo **bos = NULL; + int i = 0; + + u_rwlock_rdlock(&ws->global_bo_list_lock); + bos = malloc(sizeof(*bos) * ws->num_buffers); + if (!bos) { + u_rwlock_rdunlock(&ws->global_bo_list_lock); + fprintf(file, " Failed to allocate memory to sort VA ranges for dumping\n"); + return; + } + LIST_FOR_EACH_ENTRY(bo, &ws->global_bo_list, global_list_item) { + bos[i++] = bo; + } + qsort(bos, ws->num_buffers, sizeof(bos[0]), radv_amdgpu_bo_va_compare); + for (i = 0; i < ws->num_buffers; ++i) { + fprintf(file, " VA=%.16llx-%.16llx, handle=%d%s\n", + (long long)bos[i]->base.va, (long long)(bos[i]->base.va + bos[i]->size), + bos[i]->bo_handle, bos[i]->is_virtual ? " sparse" : ""); + } + free(bos); + u_rwlock_rdunlock(&ws->global_bo_list_lock); + } else + fprintf(file, " To get BO VA ranges, please specify RADV_DEBUG=allbos\n"); +} void radv_amdgpu_bo_init_functions(struct radv_amdgpu_winsys *ws) { ws->base.buffer_create = radv_amdgpu_winsys_bo_create; @@ -868,4 +904,5 @@ void radv_amdgpu_bo_init_functions(struct radv_amdgpu_winsys *ws) ws->base.buffer_get_metadata = radv_amdgpu_winsys_bo_get_metadata; ws->base.buffer_virtual_bind = radv_amdgpu_winsys_bo_virtual_bind; ws->base.buffer_get_flags_from_fd = radv_amdgpu_bo_get_flags_from_fd; + ws->base.dump_bo_ranges = radv_amdgpu_dump_bo_ranges; }