From 918838cd24ed9d48e8f318c8520b6caf04a71a1b Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 9 Feb 2021 11:51:38 +0100 Subject: [PATCH] radv: make the trace BO a resident buffer It's always used if RADV_DEBUG=hang is set. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/vulkan/radv_debug.c | 16 ++++++++++++++++ src/amd/vulkan/radv_debug.h | 1 + src/amd/vulkan/radv_device.c | 13 ++++--------- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c index c1b1f52..47aa78b 100644 --- a/src/amd/vulkan/radv_debug.c +++ b/src/amd/vulkan/radv_debug.c @@ -65,6 +65,7 @@ bool radv_init_trace(struct radv_device *device) { struct radeon_winsys *ws = device->ws; + VkResult result; device->trace_bo = ws->buffer_create(ws, TRACE_BO_SIZE, 8, RADEON_DOMAIN_VRAM, @@ -75,6 +76,10 @@ radv_init_trace(struct radv_device *device) if (!device->trace_bo) return false; + result = ws->buffer_make_resident(ws, device->trace_bo, true); + if (result != VK_SUCCESS) + return false; + device->trace_id_ptr = ws->buffer_map(device->trace_bo); if (!device->trace_id_ptr) return false; @@ -85,6 +90,17 @@ radv_init_trace(struct radv_device *device) return true; } +void +radv_finish_trace(struct radv_device *device) +{ + struct radeon_winsys *ws = device->ws; + + if (unlikely(device->trace_bo)) { + ws->buffer_make_resident(ws, device->trace_bo, false); + ws->buffer_destroy(ws, device->trace_bo); + } +} + static void radv_dump_trace(struct radv_device *device, struct radeon_cmdbuf *cs, FILE *f) { diff --git a/src/amd/vulkan/radv_debug.h b/src/amd/vulkan/radv_debug.h index 870da72..8d828aa 100644 --- a/src/amd/vulkan/radv_debug.h +++ b/src/amd/vulkan/radv_debug.h @@ -76,6 +76,7 @@ enum { bool radv_init_trace(struct radv_device *device); +void radv_finish_trace(struct radv_device *device); void radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_cmdbuf *cs); diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 072659e..85dfd61 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -2685,6 +2685,8 @@ check_physical_device_features(VkPhysicalDevice physicalDevice, static VkResult radv_device_init_border_color(struct radv_device *device) { + VkResult result; + device->border_color_data.bo = device->ws->buffer_create(device->ws, RADV_BORDER_COLOR_BUFFER_SIZE, @@ -3088,9 +3090,7 @@ fail: free(device->thread_trace.trigger_file); radv_trap_handler_finish(device); - - if (device->trace_bo) - device->ws->buffer_destroy(device->ws, device->trace_bo); + radv_finish_trace(device); if (device->gfx_init) device->ws->buffer_destroy(device->ws, device->gfx_init); @@ -3123,9 +3123,6 @@ void radv_DestroyDevice( if (!device) return; - if (device->trace_bo) - device->ws->buffer_destroy(device->ws, device->trace_bo); - if (device->gfx_init) device->ws->buffer_destroy(device->ws, device->gfx_init); @@ -3151,6 +3148,7 @@ void radv_DestroyDevice( radv_DestroyPipelineCache(radv_device_to_handle(device), pc, NULL); radv_trap_handler_finish(device); + radv_finish_trace(device); radv_destroy_shader_slabs(device); @@ -3987,9 +3985,6 @@ radv_get_preamble_cs(struct radv_queue *queue, if (gds_oa_bo) radv_cs_add_buffer(queue->device->ws, cs, gds_oa_bo); - if (queue->device->trace_bo) - radv_cs_add_buffer(queue->device->ws, cs, queue->device->trace_bo); - if (i == 0) { si_cs_emit_cache_flush(cs, queue->device->physical_device->rad_info.chip_class, -- 2.7.4