radv: Trace indirect dispatch sizes

For figuring out hanging indirect dispatches.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28838>
This commit is contained in:
Konstantin Seurer 2024-04-20 12:13:00 +02:00 committed by Marge Bot
parent 2b2f67aa2b
commit 46598758e7
3 changed files with 33 additions and 0 deletions

View File

@ -10407,6 +10407,30 @@ radv_CmdExecuteGeneratedCommandsNV(VkCommandBuffer commandBuffer, VkBool32 isPre
}
}
static void
radv_save_dispatch_size(struct radv_cmd_buffer *cmd_buffer, uint64_t indirect_va)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
radeon_check_space(device->ws, cs, 18);
uint64_t va = radv_buffer_get_va(device->trace_bo) + offsetof(struct radv_trace_data, indirect_dispatch);
for (uint32_t i = 0; i < 3; i++) {
radeon_emit(cs, PKT3(PKT3_COPY_DATA, 4, 0));
radeon_emit(cs,
COPY_DATA_SRC_SEL(COPY_DATA_SRC_MEM) | COPY_DATA_DST_SEL(COPY_DATA_DST_MEM) | COPY_DATA_WR_CONFIRM);
radeon_emit(cs, indirect_va);
radeon_emit(cs, indirect_va >> 32);
radeon_emit(cs, va);
radeon_emit(cs, va >> 32);
indirect_va += 4;
va += 4;
}
}
static void
radv_emit_dispatch_packets(struct radv_cmd_buffer *cmd_buffer, const struct radv_shader *compute_shader,
const struct radv_dispatch_info *info)
@ -10432,6 +10456,9 @@ radv_emit_dispatch_packets(struct radv_cmd_buffer *cmd_buffer, const struct radv
dispatch_initiator &= ~S_00B800_ORDER_MODE(1);
if (info->va) {
if (radv_device_fault_detection_enabled(device))
radv_save_dispatch_size(cmd_buffer, info->va);
if (info->indirect)
radv_cs_add_buffer(ws, cs, info->indirect);

View File

@ -536,6 +536,11 @@ radv_dump_queue_state(struct radv_queue *queue, const char *dump_dir, const char
fprintf(f, "\n\n");
}
VkDispatchIndirectCommand dispatch_indirect = device->trace_data->indirect_dispatch;
if (dispatch_indirect.x || dispatch_indirect.y || dispatch_indirect.z)
fprintf(f, "VkDispatchIndirectCommand: x=%u y=%u z=%u\n\n\n", dispatch_indirect.x, dispatch_indirect.y,
dispatch_indirect.z);
if (pipeline->type == RADV_PIPELINE_GRAPHICS) {
struct radv_graphics_pipeline *graphics_pipeline = radv_pipeline_to_graphics(pipeline);
radv_dump_vertex_descriptors(device, graphics_pipeline, f);

View File

@ -115,6 +115,7 @@ struct radv_trace_data {
uint64_t vertex_descriptors;
uint64_t vertex_prolog;
uint64_t descriptor_sets[MAX_SETS];
VkDispatchIndirectCommand indirect_dispatch;
};
#endif /* RADV_DEBUG_H */