radv: make the trace BO a resident buffer

It's always used if RADV_DEBUG=hang is set.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9076>
This commit is contained in:
Samuel Pitoiset 2021-02-09 11:51:38 +01:00 committed by Marge Bot
parent d96c0a2263
commit 918838cd24
3 changed files with 21 additions and 9 deletions

View File

@ -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)
{

View File

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

View File

@ -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,