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 <pierre-eric.pelloux-prayer@amd.com> 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/17256>
This commit is contained in:
parent
3e247cd05f
commit
00cc5ec5cf
|
@ -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). */
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue