From f2d57d28ed6f3740b3b7de0cc874178dcff936f5 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 15 Jan 2021 18:09:59 +0100 Subject: [PATCH] radeonsi/sqtt: use more event identifier MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Using event identifiers allows to add a bit more context to the RGP trace. Without this all draw calls are identified as vkCmdDraw. Reviewed-by: Marek Olšák Part-of: --- src/gallium/drivers/radeonsi/si_blit.c | 6 ++++++ src/gallium/drivers/radeonsi/si_clear.c | 7 +++++++ src/gallium/drivers/radeonsi/si_compute.c | 6 ++++++ src/gallium/drivers/radeonsi/si_pipe.h | 5 +++++ src/gallium/drivers/radeonsi/si_sqtt.c | 29 ++++++++++++++++++++++++-- src/gallium/drivers/radeonsi/si_state_draw.cpp | 2 +- 6 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 3d2c81e..eba077d 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -1148,6 +1148,9 @@ static void si_blit(struct pipe_context *ctx, const struct pipe_blit_info *info) return; } + if (unlikely(sctx->thread_trace_enabled)) + sctx->sqtt_next_event = EventCmdCopyImage; + /* Using compute for copying to a linear texture in GTT is much faster than * going through RBs (render backends). This improves DRI PRIME performance. */ @@ -1169,6 +1172,9 @@ static void si_blit(struct pipe_context *ctx, const struct pipe_blit_info *info) si_decompress_subresource(ctx, info->src.resource, PIPE_MASK_RGBAZS, info->src.level, info->src.box.z, info->src.box.z + info->src.box.depth - 1); + if (unlikely(sctx->thread_trace_enabled)) + sctx->sqtt_next_event = EventCmdBlitImage; + si_blitter_begin(sctx, SI_BLIT | (info->render_condition_enable ? 0 : SI_DISABLE_RENDER_COND)); util_blitter_blit(sctx->blitter, info); si_blitter_end(sctx); diff --git a/src/gallium/drivers/radeonsi/si_clear.c b/src/gallium/drivers/radeonsi/si_clear.c index fe2cac5..e267976 100644 --- a/src/gallium/drivers/radeonsi/si_clear.c +++ b/src/gallium/drivers/radeonsi/si_clear.c @@ -661,6 +661,13 @@ static void si_clear(struct pipe_context *ctx, unsigned buffers, sctx->flags |= SI_CONTEXT_FLUSH_AND_INV_DB; } + if (unlikely(sctx->thread_trace_enabled)) { + if (buffers & PIPE_CLEAR_COLOR) + sctx->sqtt_next_event = EventCmdClearColorImage; + else if (buffers & PIPE_CLEAR_DEPTHSTENCIL) + sctx->sqtt_next_event = EventCmdClearDepthStencilImage; + } + si_blitter_begin(sctx, SI_CLEAR); util_blitter_clear(sctx->blitter, fb->width, fb->height, util_framebuffer_get_num_layers(fb), buffers, color, depth, stencil, sctx->framebuffer.nr_samples > 1); diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 40933fe..0f1ece6 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -749,6 +749,12 @@ static void si_emit_dispatch_packets(struct si_context *sctx, const struct pipe_ if (sctx->chip_class >= GFX10 && waves_per_threadgroup == 1) threadgroups_per_cu = 2; + if (unlikely(sctx->thread_trace_enabled)) { + si_write_event_with_dims_marker(sctx, &sctx->gfx_cs, + info->indirect ? EventCmdDispatchIndirect : EventCmdDispatch, + info->grid[0], info->grid[1], info->grid[2]); + } + radeon_begin(cs); radeon_set_sh_reg( cs, R_00B854_COMPUTE_RESOURCE_LIMITS, diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 6813037..4aed81d 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -1292,6 +1292,7 @@ struct si_context { /* SQTT */ struct ac_thread_trace_data *thread_trace; struct pipe_fence_handle *last_sqtt_fence; + enum rgp_sqtt_marker_event_type sqtt_next_event; bool thread_trace_enabled; }; @@ -1564,6 +1565,10 @@ void si_sqtt_write_event_marker(struct si_context* sctx, struct radeon_cmdbuf *r uint32_t vertex_offset_user_data, uint32_t instance_offset_user_data, uint32_t draw_index_user_data); +void +si_write_event_with_dims_marker(struct si_context* sctx, struct radeon_cmdbuf *rcs, + enum rgp_sqtt_marker_event_type api_type, + uint32_t x, uint32_t y, uint32_t z); bool si_init_thread_trace(struct si_context *sctx); void si_destroy_thread_trace(struct si_context *sctx); void si_handle_thread_trace(struct si_context *sctx, struct radeon_cmdbuf *rcs); diff --git a/src/gallium/drivers/radeonsi/si_sqtt.c b/src/gallium/drivers/radeonsi/si_sqtt.c index f5263d5..28c08a3 100644 --- a/src/gallium/drivers/radeonsi/si_sqtt.c +++ b/src/gallium/drivers/radeonsi/si_sqtt.c @@ -571,6 +571,8 @@ si_init_thread_trace(struct si_context *sctx) si_thread_trace_init_cs(sctx); + sctx->sqtt_next_event = EventInvalid; + return true; } @@ -691,6 +693,7 @@ si_emit_spi_config_cntl(struct si_context* sctx, radeon_end(); } +static uint32_t num_events = 0; void si_sqtt_write_event_marker(struct si_context* sctx, struct radeon_cmdbuf *rcs, enum rgp_sqtt_marker_event_type api_type, @@ -698,11 +701,10 @@ si_sqtt_write_event_marker(struct si_context* sctx, struct radeon_cmdbuf *rcs, uint32_t instance_offset_user_data, uint32_t draw_index_user_data) { - static uint32_t num_events = 0; struct rgp_sqtt_marker_event marker = {0}; marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_EVENT; - marker.api_type = api_type; + marker.api_type = api_type == EventInvalid ? EventCmdDraw : api_type; marker.cmd_id = num_events++; marker.cb_id = 0; @@ -720,4 +722,27 @@ si_sqtt_write_event_marker(struct si_context* sctx, struct radeon_cmdbuf *rcs, marker.draw_index_reg_idx = draw_index_user_data; si_emit_thread_trace_userdata(sctx, rcs, &marker, sizeof(marker) / 4); + + sctx->sqtt_next_event = EventInvalid; +} + +void +si_write_event_with_dims_marker(struct si_context* sctx, struct radeon_cmdbuf *rcs, + enum rgp_sqtt_marker_event_type api_type, + uint32_t x, uint32_t y, uint32_t z) +{ + struct rgp_sqtt_marker_event_with_dims marker = {0}; + + marker.event.identifier = RGP_SQTT_MARKER_IDENTIFIER_EVENT; + marker.event.api_type = api_type; + marker.event.cmd_id = num_events++; + marker.event.cb_id = 0; + marker.event.has_thread_dims = 1; + + marker.thread_x = x; + marker.thread_y = y; + marker.thread_z = z; + + si_emit_thread_trace_userdata(sctx, rcs, &marker, sizeof(marker) / 4); + sctx->sqtt_next_event = EventInvalid; } diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp index f7360e6..3d0043e 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.cpp +++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp @@ -991,7 +991,7 @@ static void si_emit_draw_packets(struct si_context *sctx, const struct pipe_draw struct radeon_cmdbuf *cs = &sctx->gfx_cs; if (unlikely(sctx->thread_trace_enabled)) { - si_sqtt_write_event_marker(sctx, &sctx->gfx_cs, EventCmdDraw, + si_sqtt_write_event_marker(sctx, &sctx->gfx_cs, sctx->sqtt_next_event, UINT_MAX, UINT_MAX, UINT_MAX); } -- 2.7.4