From 00cc5ec5cf775425dbb0a7c8c3e6ea8cb54e0a5f Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 27 Jun 2022 17:33:36 +0200 Subject: [PATCH] radv: do not emit SQTT user data packets on the SDMA queue They aren't supported and lead to GPU hangs. Reported-by: Pierre-Eric Pelloux-Prayer Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/vulkan/layers/radv_sqtt_layer.c | 36 +++++++++++---------------------- src/amd/vulkan/radv_private.h | 4 ++-- src/amd/vulkan/radv_sqtt.c | 10 +++++++-- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/amd/vulkan/layers/radv_sqtt_layer.c b/src/amd/vulkan/layers/radv_sqtt_layer.c index e56991c..917d27c 100644 --- a/src/amd/vulkan/layers/radv_sqtt_layer.c +++ b/src/amd/vulkan/layers/radv_sqtt_layer.c @@ -33,12 +33,11 @@ radv_write_begin_general_api_marker(struct radv_cmd_buffer *cmd_buffer, enum rgp_sqtt_marker_general_api_type api_type) { struct rgp_sqtt_marker_general_api marker = {0}; - struct radeon_cmdbuf *cs = cmd_buffer->cs; marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_GENERAL_API; marker.api_type = api_type; - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4); } static void @@ -46,13 +45,12 @@ radv_write_end_general_api_marker(struct radv_cmd_buffer *cmd_buffer, enum rgp_sqtt_marker_general_api_type api_type) { struct rgp_sqtt_marker_general_api marker = {0}; - struct radeon_cmdbuf *cs = cmd_buffer->cs; marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_GENERAL_API; marker.api_type = api_type; marker.is_end = 1; - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4); } static void @@ -61,7 +59,6 @@ radv_write_event_marker(struct radv_cmd_buffer *cmd_buffer, uint32_t instance_offset_user_data, uint32_t draw_index_user_data) { struct rgp_sqtt_marker_event marker = {0}; - struct radeon_cmdbuf *cs = cmd_buffer->cs; marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_EVENT; marker.api_type = api_type; @@ -80,7 +77,7 @@ radv_write_event_marker(struct radv_cmd_buffer *cmd_buffer, marker.instance_offset_reg_idx = instance_offset_user_data; marker.draw_index_reg_idx = draw_index_user_data; - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4); } static void @@ -89,7 +86,6 @@ radv_write_event_with_dims_marker(struct radv_cmd_buffer *cmd_buffer, uint32_t z) { struct rgp_sqtt_marker_event_with_dims marker = {0}; - struct radeon_cmdbuf *cs = cmd_buffer->cs; marker.event.identifier = RGP_SQTT_MARKER_IDENTIFIER_EVENT; marker.event.api_type = api_type; @@ -101,22 +97,20 @@ radv_write_event_with_dims_marker(struct radv_cmd_buffer *cmd_buffer, marker.thread_y = y; marker.thread_z = z; - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4); } static void radv_write_user_event_marker(struct radv_cmd_buffer *cmd_buffer, enum rgp_sqtt_marker_user_event_type type, const char *str) { - struct radeon_cmdbuf *cs = cmd_buffer->cs; - if (type == UserEventPop) { assert(str == NULL); struct rgp_sqtt_marker_user_event marker = {0}; marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_USER_EVENT; marker.data_type = type; - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4); } else { assert(str != NULL); unsigned len = strlen(str); @@ -130,7 +124,7 @@ radv_write_user_event_marker(struct radv_cmd_buffer *cmd_buffer, memcpy(buffer, &marker, sizeof(marker)); memcpy(buffer + sizeof(marker), str, len); - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, buffer, + radv_emit_thread_trace_userdata(cmd_buffer, buffer, sizeof(marker) / 4 + marker.length / 4); } } @@ -140,7 +134,6 @@ radv_describe_begin_cmd_buffer(struct radv_cmd_buffer *cmd_buffer) { uint64_t device_id = (uintptr_t)cmd_buffer->device; struct rgp_sqtt_marker_cb_start marker = {0}; - struct radeon_cmdbuf *cs = cmd_buffer->cs; if (likely(!cmd_buffer->device->thread_trace.bo)) return; @@ -155,7 +148,7 @@ radv_describe_begin_cmd_buffer(struct radv_cmd_buffer *cmd_buffer) if (cmd_buffer->qf == RADV_QUEUE_GENERAL) marker.queue_flags |= VK_QUEUE_GRAPHICS_BIT; - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4); } void @@ -163,7 +156,6 @@ radv_describe_end_cmd_buffer(struct radv_cmd_buffer *cmd_buffer) { uint64_t device_id = (uintptr_t)cmd_buffer->device; struct rgp_sqtt_marker_cb_end marker = {0}; - struct radeon_cmdbuf *cs = cmd_buffer->cs; if (likely(!cmd_buffer->device->thread_trace.bo)) return; @@ -173,7 +165,7 @@ radv_describe_end_cmd_buffer(struct radv_cmd_buffer *cmd_buffer) marker.device_id_low = device_id; marker.device_id_high = device_id >> 32; - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4); } void @@ -226,7 +218,6 @@ void radv_describe_barrier_end_delayed(struct radv_cmd_buffer *cmd_buffer) { struct rgp_sqtt_marker_barrier_end marker = {0}; - struct radeon_cmdbuf *cs = cmd_buffer->cs; if (likely(!cmd_buffer->device->thread_trace.bo) || !cmd_buffer->state.pending_sqtt_barrier_end) return; @@ -271,7 +262,7 @@ radv_describe_barrier_end_delayed(struct radv_cmd_buffer *cmd_buffer) if (cmd_buffer->state.sqtt_flush_bits & RGP_FLUSH_INVAL_L1) marker.inval_gl1 = true; - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4); cmd_buffer->state.num_layout_transitions = 0; } @@ -280,7 +271,6 @@ void radv_describe_barrier_start(struct radv_cmd_buffer *cmd_buffer, enum rgp_barrier_reason reason) { struct rgp_sqtt_marker_barrier_start marker = {0}; - struct radeon_cmdbuf *cs = cmd_buffer->cs; if (likely(!cmd_buffer->device->thread_trace.bo)) return; @@ -292,7 +282,7 @@ radv_describe_barrier_start(struct radv_cmd_buffer *cmd_buffer, enum rgp_barrier marker.cb_id = 0; marker.dword02 = reason; - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4); } void @@ -306,7 +296,6 @@ radv_describe_layout_transition(struct radv_cmd_buffer *cmd_buffer, const struct radv_barrier_data *barrier) { struct rgp_sqtt_marker_layout_transition marker = {0}; - struct radeon_cmdbuf *cs = cmd_buffer->cs; if (likely(!cmd_buffer->device->thread_trace.bo)) return; @@ -321,7 +310,7 @@ radv_describe_layout_transition(struct radv_cmd_buffer *cmd_buffer, marker.fmask_color_expand = barrier->layout_transitions.fmask_color_expand; marker.init_mask_ram = barrier->layout_transitions.init_mask_ram; - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4); cmd_buffer->state.num_layout_transitions++; } @@ -331,7 +320,6 @@ radv_describe_pipeline_bind(struct radv_cmd_buffer *cmd_buffer, VkPipelineBindPoint pipelineBindPoint, struct radv_pipeline *pipeline) { struct rgp_sqtt_marker_pipeline_bind marker = {0}; - struct radeon_cmdbuf *cs = cmd_buffer->cs; if (likely(!cmd_buffer->device->thread_trace.bo)) return; @@ -342,7 +330,7 @@ radv_describe_pipeline_bind(struct radv_cmd_buffer *cmd_buffer, marker.api_pso_hash[0] = pipeline->pipeline_hash; marker.api_pso_hash[1] = pipeline->pipeline_hash >> 32; - radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4); + radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4); } /* TODO: Improve the way to trigger capture (overlay, etc). */ diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 42ba7ba..88466f1 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -2841,8 +2841,8 @@ void radv_thread_trace_finish(struct radv_device *device); bool radv_begin_thread_trace(struct radv_queue *queue); bool radv_end_thread_trace(struct radv_queue *queue); bool radv_get_thread_trace(struct radv_queue *queue, struct ac_thread_trace *thread_trace); -void radv_emit_thread_trace_userdata(const struct radv_device *device, struct radeon_cmdbuf *cs, - const void *data, uint32_t num_dwords); +void radv_emit_thread_trace_userdata(struct radv_cmd_buffer *cmd_buffer, const void *data, + uint32_t num_dwords); bool radv_is_instruction_timing_enabled(void); bool radv_sdma_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *image, diff --git a/src/amd/vulkan/radv_sqtt.c b/src/amd/vulkan/radv_sqtt.c index 3e98a48..ecd5b36 100644 --- a/src/amd/vulkan/radv_sqtt.c +++ b/src/amd/vulkan/radv_sqtt.c @@ -335,11 +335,17 @@ radv_emit_thread_trace_stop(struct radv_device *device, struct radeon_cmdbuf *cs } void -radv_emit_thread_trace_userdata(const struct radv_device *device, struct radeon_cmdbuf *cs, - const void *data, uint32_t num_dwords) +radv_emit_thread_trace_userdata(struct radv_cmd_buffer *cmd_buffer, const void *data, + uint32_t num_dwords) { + struct radv_device *device = cmd_buffer->device; + struct radeon_cmdbuf *cs = cmd_buffer->cs; const uint32_t *dwords = (uint32_t *)data; + /* SQTT user data packets aren't supported on SDMA queues. */ + if (cmd_buffer->qf == RADV_QUEUE_TRANSFER) + return; + while (num_dwords > 0) { uint32_t count = MIN2(num_dwords, 2); -- 2.7.4