From 4092d5f0d80b8d206098b9b162f655e3cf741a3e Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Fri, 16 Jul 2021 16:30:22 +0300 Subject: [PATCH] u_trace: pass command stream through tracing functions Allows writing timestamps into different command streams. Signed-off-by: Danylo Piliaiev Reviewed-by: Rob Clark Part-of: --- src/freedreno/vulkan/tu_clear_blit.c | 8 ++--- src/freedreno/vulkan/tu_cmd_buffer.c | 22 +++++++------- src/freedreno/vulkan/tu_device.c | 13 ++++---- src/gallium/auxiliary/util/u_trace_gallium.c | 8 ++--- src/gallium/auxiliary/util/u_trace_gallium.h | 2 +- .../drivers/freedreno/a6xx/fd6_blitter.c | 4 +-- .../drivers/freedreno/a6xx/fd6_compute.c | 6 ++-- src/gallium/drivers/freedreno/a6xx/fd6_emit.c | 4 +-- src/gallium/drivers/freedreno/a6xx/fd6_gmem.c | 28 ++++++++--------- .../drivers/freedreno/freedreno_context.c | 4 +-- .../drivers/freedreno/freedreno_gmem.c | 30 +++++++++---------- src/util/perf/u_trace.c | 4 +-- src/util/perf/u_trace.h | 7 +++-- src/util/perf/u_trace.py | 10 +++---- src/util/perf/u_trace_priv.h | 2 +- 15 files changed, 76 insertions(+), 76 deletions(-) diff --git a/src/freedreno/vulkan/tu_clear_blit.c b/src/freedreno/vulkan/tu_clear_blit.c index 89c58584e9e..311077ed2e1 100644 --- a/src/freedreno/vulkan/tu_clear_blit.c +++ b/src/freedreno/vulkan/tu_clear_blit.c @@ -1372,7 +1372,7 @@ tu6_blit_image(struct tu_cmd_buffer *cmd, unreachable("unexpected D32_S8 aspect mask in blit_image"); } - trace_start_blit(&cmd->trace); + trace_start_blit(&cmd->trace, cs); ops->setup(cmd, cs, format, info->dstSubresource.aspectMask, blit_param, false, dst_image->layout[0].ubwc, @@ -1423,7 +1423,7 @@ tu6_blit_image(struct tu_cmd_buffer *cmd, ops->teardown(cmd, cs); - trace_end_blit(&cmd->trace, + trace_end_blit(&cmd->trace, cs, ops == &r3d_ops, src_image->vk_format, dst_image->vk_format, @@ -2042,7 +2042,7 @@ resolve_sysmem(struct tu_cmd_buffer *cmd, { const struct blit_ops *ops = &r2d_ops; - trace_start_resolve(&cmd->trace); + trace_start_resolve(&cmd->trace, cs); ops->setup(cmd, cs, format, VK_IMAGE_ASPECT_COLOR_BIT, 0, false, dst->ubwc_enabled, VK_SAMPLE_COUNT_1_BIT); @@ -2061,7 +2061,7 @@ resolve_sysmem(struct tu_cmd_buffer *cmd, ops->teardown(cmd, cs); - trace_end_resolve(&cmd->trace); + trace_end_resolve(&cmd->trace, cs); } void diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index 259e7f454e8..ba212f94c68 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -989,12 +989,12 @@ tu6_emit_binning_pass(struct tu_cmd_buffer *cmd, struct tu_cs *cs) tu_cs_emit_regs(cs, A6XX_SP_TP_WINDOW_OFFSET(.x = 0, .y = 0)); - trace_start_binning_ib(&cmd->trace); + trace_start_binning_ib(&cmd->trace, cs); /* emit IB to binning drawcmds: */ tu_cs_emit_call(cs, &cmd->draw_cs); - trace_end_binning_ib(&cmd->trace); + trace_end_binning_ib(&cmd->trace, cs); /* switching from binning pass to GMEM pass will cause a switch from * PROGRAM_BINNING to PROGRAM, which invalidates const state (XS_CONST states) @@ -1343,9 +1343,9 @@ tu_cmd_render_tiles(struct tu_cmd_buffer *cmd) for (uint32_t tx = tx1; tx < tx2; tx++, slot++) { tu6_emit_tile_select(cmd, &cmd->cs, tx, ty, pipe, slot); - trace_start_draw_ib_gmem(&cmd->trace); + trace_start_draw_ib_gmem(&cmd->trace, &cmd->cs); tu6_render_tile(cmd, &cmd->cs); - trace_end_draw_ib_gmem(&cmd->trace); + trace_end_draw_ib_gmem(&cmd->trace, &cmd->cs); } } } @@ -1353,7 +1353,7 @@ tu_cmd_render_tiles(struct tu_cmd_buffer *cmd) tu6_tile_render_end(cmd, &cmd->cs); - trace_end_render_pass(&cmd->trace, fb); + trace_end_render_pass(&cmd->trace, &cmd->cs, fb); } static void @@ -1361,15 +1361,15 @@ tu_cmd_render_sysmem(struct tu_cmd_buffer *cmd) { tu6_sysmem_render_begin(cmd, &cmd->cs); - trace_start_draw_ib_sysmem(&cmd->trace); + trace_start_draw_ib_sysmem(&cmd->trace, &cmd->cs); tu_cs_emit_call(&cmd->cs, &cmd->draw_cs); - trace_end_draw_ib_sysmem(&cmd->trace); + trace_end_draw_ib_sysmem(&cmd->trace, &cmd->cs); tu6_sysmem_render_end(cmd, &cmd->cs); - trace_end_render_pass(&cmd->trace, cmd->state.framebuffer); + trace_end_render_pass(&cmd->trace, &cmd->cs, cmd->state.framebuffer); } static VkResult @@ -3093,7 +3093,7 @@ tu_CmdBeginRenderPass2(VkCommandBuffer commandBuffer, cmd->state.framebuffer = fb; cmd->state.render_area = pRenderPassBegin->renderArea; - trace_start_render_pass(&cmd->trace); + trace_start_render_pass(&cmd->trace, &cmd->cs); /* Note: because this is external, any flushes will happen before draw_cs * gets called. However deferred flushes could have to happen later as part @@ -4494,7 +4494,7 @@ tu_dispatch(struct tu_cmd_buffer *cmd, A6XX_HLSQ_CS_KERNEL_GROUP_Y(1), A6XX_HLSQ_CS_KERNEL_GROUP_Z(1)); - trace_start_compute(&cmd->trace); + trace_start_compute(&cmd->trace, cs); if (info->indirect) { uint64_t iova = tu_buffer_iova(info->indirect) + info->indirect_offset; @@ -4514,7 +4514,7 @@ tu_dispatch(struct tu_cmd_buffer *cmd, tu_cs_emit(cs, CP_EXEC_CS_3_NGROUPS_Z(info->blocks[2])); } - trace_end_compute(&cmd->trace, + trace_end_compute(&cmd->trace, cs, info->indirect != NULL, local_size[0], local_size[1], local_size[2], info->blocks[0], info->blocks[1], info->blocks[2]); diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index 0538915063e..3be2e54df10 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -1278,18 +1278,17 @@ tu_trace_destroy_ts_buffer(struct u_trace_context *utctx, void *timestamps) } static void -tu_trace_record_ts(struct u_trace *ut, void *timestamps, +tu_trace_record_ts(struct u_trace *ut, void *cs, void *timestamps, unsigned idx) { - struct tu_cmd_buffer *cmd = container_of(ut, struct tu_cmd_buffer, trace); struct tu_bo *bo = timestamps; - struct tu_cs *cs = &cmd->cs; + struct tu_cs *ts_cs = cs; unsigned ts_offset = idx * sizeof(uint64_t); - tu_cs_emit_pkt7(cs, CP_EVENT_WRITE, 4); - tu_cs_emit(cs, CP_EVENT_WRITE_0_EVENT(RB_DONE_TS) | CP_EVENT_WRITE_0_TIMESTAMP); - tu_cs_emit_qw(cs, bo->iova + ts_offset); - tu_cs_emit(cs, 0x00000000); + tu_cs_emit_pkt7(ts_cs, CP_EVENT_WRITE, 4); + tu_cs_emit(ts_cs, CP_EVENT_WRITE_0_EVENT(RB_DONE_TS) | CP_EVENT_WRITE_0_TIMESTAMP); + tu_cs_emit_qw(ts_cs, bo->iova + ts_offset); + tu_cs_emit(ts_cs, 0x00000000); } static uint64_t diff --git a/src/gallium/auxiliary/util/u_trace_gallium.c b/src/gallium/auxiliary/util/u_trace_gallium.c index e8fd0f809d2..3e9a254a469 100644 --- a/src/gallium/auxiliary/util/u_trace_gallium.c +++ b/src/gallium/auxiliary/util/u_trace_gallium.c @@ -74,20 +74,20 @@ u_trace_pipe_context_init(struct u_trace_context *utctx, } inline void -trace_framebuffer_state(struct u_trace *ut, const struct pipe_framebuffer_state *pfb) +trace_framebuffer_state(struct u_trace *ut, void *cs, const struct pipe_framebuffer_state *pfb) { if (likely(!ut->enabled)) return; - trace_framebuffer(ut, pfb); + trace_framebuffer(ut, cs, pfb); for (unsigned i = 0; i < pfb->nr_cbufs; i++) { if (pfb->cbufs[i]) { - trace_surface(ut, pfb->cbufs[i]); + trace_surface(ut, cs, pfb->cbufs[i]); } } if (pfb->zsbuf) { - trace_surface(ut, pfb->zsbuf); + trace_surface(ut, cs, pfb->zsbuf); } } diff --git a/src/gallium/auxiliary/util/u_trace_gallium.h b/src/gallium/auxiliary/util/u_trace_gallium.h index f4df9be9f5c..e37e3e66361 100644 --- a/src/gallium/auxiliary/util/u_trace_gallium.h +++ b/src/gallium/auxiliary/util/u_trace_gallium.h @@ -48,7 +48,7 @@ u_trace_pipe_context_init(struct u_trace_context *utctx, */ void -trace_framebuffer_state(struct u_trace *ut, const struct pipe_framebuffer_state *pfb); +trace_framebuffer_state(struct u_trace *ut, void *cs, const struct pipe_framebuffer_state *pfb); #ifdef __cplusplus } diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c index 86b810ca567..c7d893c14f0 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c @@ -938,7 +938,7 @@ handle_rgba_blit(struct fd_context *ctx, DBG_BLIT(info, batch); - trace_start_blit(&batch->trace, info->src.resource->target, + trace_start_blit(&batch->trace, batch->draw, info->src.resource->target, info->dst.resource->target); if ((info->src.resource->target == PIPE_BUFFER) && @@ -953,7 +953,7 @@ handle_rgba_blit(struct fd_context *ctx, emit_blit_texture(ctx, batch->draw, info); } - trace_end_blit(&batch->trace); + trace_end_blit(&batch->trace, batch->draw); fd6_event_write(batch, batch->draw, PC_CCU_FLUSH_COLOR_TS, true); fd6_event_write(batch, batch->draw, PC_CCU_FLUSH_DEPTH_TS, true); diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_compute.c b/src/gallium/drivers/freedreno/a6xx/fd6_compute.c index 1075b7528cc..1802a589a0b 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_compute.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_compute.c @@ -174,8 +174,8 @@ fd6_launch_grid(struct fd_context *ctx, const struct pipe_grid_info *info) in_dt OUT_RING(ring, 1); /* HLSQ_CS_KERNEL_GROUP_Y */ OUT_RING(ring, 1); /* HLSQ_CS_KERNEL_GROUP_Z */ - trace_grid_info(&ctx->batch->trace, info); - trace_start_compute(&ctx->batch->trace); + trace_grid_info(&ctx->batch->trace, ring, info); + trace_start_compute(&ctx->batch->trace, ring); if (info->indirect) { struct fd_resource *rsc = fd_resource(info->indirect); @@ -195,7 +195,7 @@ fd6_launch_grid(struct fd_context *ctx, const struct pipe_grid_info *info) in_dt OUT_RING(ring, CP_EXEC_CS_3_NGROUPS_Z(info->grid[2])); } - trace_end_compute(&ctx->batch->trace); + trace_end_compute(&ctx->batch->trace, ring); OUT_WFI5(ring); diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c index c9cd60e2ef8..583f840cf83 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c @@ -1247,7 +1247,7 @@ fd6_emit_restore(struct fd_batch *batch, struct fd_ringbuffer *ring) // struct fd_context *ctx = batch->ctx; if (!batch->nondraw) { - trace_start_state_restore(&batch->trace); + trace_start_state_restore(&batch->trace, ring); } fd6_cache_inv(batch, ring); @@ -1360,7 +1360,7 @@ fd6_emit_restore(struct fd_batch *batch, struct fd_ringbuffer *ring) OUT_RING(ring, 0x00000000); if (!batch->nondraw) { - trace_end_state_restore(&batch->trace); + trace_end_state_restore(&batch->trace, ring); } } diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c index 3f04a409bc6..79ba93adacb 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c @@ -710,9 +710,9 @@ emit_binning_pass(struct fd_batch *batch) assert_dt A6XX_SP_TP_WINDOW_OFFSET_X(0) | A6XX_SP_TP_WINDOW_OFFSET_Y(0)); /* emit IB to binning drawcmds: */ - trace_start_binning_ib(&batch->trace); + trace_start_binning_ib(&batch->trace, ring); fd6_emit_ib(ring, batch->draw); - trace_end_binning_ib(&batch->trace); + trace_end_binning_ib(&batch->trace, ring); fd_reset_wfi(batch); @@ -732,9 +732,9 @@ emit_binning_pass(struct fd_batch *batch) assert_dt OUT_PKT7(ring, CP_WAIT_FOR_ME, 0); - trace_start_vsc_overflow_test(&batch->trace); + trace_start_vsc_overflow_test(&batch->trace, batch->gmem); emit_vsc_overflow_test(batch); - trace_end_vsc_overflow_test(&batch->trace); + trace_end_vsc_overflow_test(&batch->trace, batch->gmem); OUT_PKT7(ring, CP_SET_VISIBILITY_OVERRIDE, 1); OUT_RING(ring, 0x0); @@ -794,9 +794,9 @@ fd6_emit_tile_init(struct fd_batch *batch) assert_dt fd6_emit_lrz_flush(ring); if (batch->prologue) { - trace_start_prologue(&batch->trace); + trace_start_prologue(&batch->trace, ring); fd6_emit_ib(ring, batch->prologue); - trace_end_prologue(&batch->trace); + trace_end_prologue(&batch->trace, ring); } fd6_cache_inv(batch, ring); @@ -1249,13 +1249,13 @@ fd6_emit_tile_renderprep(struct fd_batch *batch, const struct fd_tile *tile) if (!batch->tile_setup) return; - trace_start_clear_restore(&batch->trace, batch->fast_cleared); + trace_start_clear_restore(&batch->trace, batch->gmem, batch->fast_cleared); if (batch->fast_cleared || !use_hw_binning(batch)) { fd6_emit_ib(batch->gmem, batch->tile_setup); } else { emit_conditional_ib(batch, tile, batch->tile_setup); } - trace_end_clear_restore(&batch->trace); + trace_end_clear_restore(&batch->trace, batch->gmem); } static bool @@ -1427,13 +1427,13 @@ fd6_emit_tile_gmem2mem(struct fd_batch *batch, const struct fd_tile *tile) OUT_RING(ring, A6XX_CP_SET_MARKER_0_MODE(RM6_RESOLVE)); emit_marker6(ring, 7); - trace_start_resolve(&batch->trace); + trace_start_resolve(&batch->trace, batch->gmem); if (batch->fast_cleared || !use_hw_binning(batch)) { fd6_emit_ib(batch->gmem, batch->tile_fini); } else { emit_conditional_ib(batch, tile, batch->tile_fini); } - trace_end_resolve(&batch->trace); + trace_end_resolve(&batch->trace, batch->gmem); } static void @@ -1466,7 +1466,7 @@ emit_sysmem_clears(struct fd_batch *batch, struct fd_ringbuffer *ring) assert_dt if (!buffers) return; - trace_start_clear_restore(&batch->trace, buffers); + trace_start_clear_restore(&batch->trace, ring, buffers); if (buffers & PIPE_CLEAR_COLOR) { for (int i = 0; i < pfb->nr_cbufs; i++) { @@ -1514,7 +1514,7 @@ emit_sysmem_clears(struct fd_batch *batch, struct fd_ringbuffer *ring) assert_dt fd6_event_write(batch, ring, PC_CCU_FLUSH_COLOR_TS, true); fd_wfi(batch, ring); - trace_end_clear_restore(&batch->trace); + trace_end_clear_restore(&batch->trace, ring); } static void @@ -1547,11 +1547,11 @@ fd6_emit_sysmem_prep(struct fd_batch *batch) assert_dt if (batch->prologue) { if (!batch->nondraw) { - trace_start_prologue(&batch->trace); + trace_start_prologue(&batch->trace, ring); } fd6_emit_ib(ring, batch->prologue); if (!batch->nondraw) { - trace_end_prologue(&batch->trace); + trace_end_prologue(&batch->trace, ring); } } diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c index cd95721746c..de4d42f02bc 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.c +++ b/src/gallium/drivers/freedreno/freedreno_context.c @@ -452,11 +452,11 @@ fd_get_device_reset_status(struct pipe_context *pctx) } static void -fd_trace_record_ts(struct u_trace *ut, void *timestamps, +fd_trace_record_ts(struct u_trace *ut, void *cs, void *timestamps, unsigned idx) { struct fd_batch *batch = container_of(ut, struct fd_batch, trace); - struct fd_ringbuffer *ring = batch->nondraw ? batch->draw : batch->gmem; + struct fd_ringbuffer *ring = cs; struct pipe_resource *buffer = timestamps; if (ring->cur == batch->last_timestamp_cmd) { diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.c b/src/gallium/drivers/freedreno/freedreno_gmem.c index 3cf36bef139..22d4bc279d2 100644 --- a/src/gallium/drivers/freedreno/freedreno_gmem.c +++ b/src/gallium/drivers/freedreno/freedreno_gmem.c @@ -592,7 +592,7 @@ render_tiles(struct fd_batch *batch, struct fd_gmem_stateobj *gmem) assert_dt for (i = 0; i < (gmem->nbins_x * gmem->nbins_y); i++) { struct fd_tile *tile = &gmem->tile[i]; - trace_start_tile(&batch->trace, tile->bin_h, tile->yoff, tile->bin_w, + trace_start_tile(&batch->trace, batch->gmem, tile->bin_h, tile->yoff, tile->bin_w, tile->xoff); ctx->emit_tile_prep(batch, tile); @@ -607,13 +607,13 @@ render_tiles(struct fd_batch *batch, struct fd_gmem_stateobj *gmem) assert_dt ctx->query_prepare_tile(batch, i, batch->gmem); /* emit IB to drawcmds: */ - trace_start_draw_ib(&batch->trace); + trace_start_draw_ib(&batch->trace, batch->gmem); if (ctx->emit_tile) { ctx->emit_tile(batch, tile); } else { ctx->screen->emit_ib(batch->gmem, batch->draw); } - trace_end_draw_ib(&batch->trace); + trace_end_draw_ib(&batch->trace, batch->gmem); fd_reset_wfi(batch); /* emit gmem2mem to transfer tile back to system memory: */ @@ -637,13 +637,13 @@ render_sysmem(struct fd_batch *batch) assert_dt ctx->query_prepare_tile(batch, 0, batch->gmem); if (!batch->nondraw) { - trace_start_draw_ib(&batch->trace); + trace_start_draw_ib(&batch->trace, batch->gmem); } /* emit IB to drawcmds: */ ctx->screen->emit_ib(batch->gmem, batch->draw); if (!batch->nondraw) { - trace_end_draw_ib(&batch->trace); + trace_end_draw_ib(&batch->trace, batch->gmem); } fd_reset_wfi(batch); @@ -682,9 +682,9 @@ fd_gmem_render_tiles(struct fd_batch *batch) */ fd_perfetto_submit(ctx); #endif - trace_flush_batch(&batch->trace, batch, batch->cleared, + trace_flush_batch(&batch->trace, batch->gmem, batch, batch->cleared, batch->gmem_reason, batch->num_draws); - trace_framebuffer_state(&batch->trace, pfb); + trace_framebuffer_state(&batch->trace, batch->gmem, pfb); } if (ctx->emit_sysmem_prep && !batch->nondraw) { @@ -727,30 +727,30 @@ fd_gmem_render_tiles(struct fd_batch *batch) render_sysmem(batch); ctx->stats.batch_nondraw++; } else if (sysmem) { - trace_render_sysmem(&batch->trace); - trace_start_render_pass( - &batch->trace, ctx->submit_count, pipe_surface_format(pfb->cbufs[0]), + trace_render_sysmem(&batch->trace, batch->gmem); + trace_start_render_pass(&batch->trace, batch->gmem, + ctx->submit_count, pipe_surface_format(pfb->cbufs[0]), pipe_surface_format(pfb->zsbuf), pfb->width, pfb->height, pfb->nr_cbufs, pfb->samples, 0, 0, 0); if (ctx->query_prepare) ctx->query_prepare(batch, 1); render_sysmem(batch); - trace_end_render_pass(&batch->trace); + trace_end_render_pass(&batch->trace, batch->gmem); ctx->stats.batch_sysmem++; } else { struct fd_gmem_stateobj *gmem = lookup_gmem_state(batch, false, false); batch->gmem_state = gmem; - trace_render_gmem(&batch->trace, gmem->nbins_x, gmem->nbins_y, + trace_render_gmem(&batch->trace, batch->gmem, gmem->nbins_x, gmem->nbins_y, gmem->bin_w, gmem->bin_h); - trace_start_render_pass( - &batch->trace, ctx->submit_count, pipe_surface_format(pfb->cbufs[0]), + trace_start_render_pass(&batch->trace, batch->gmem, + ctx->submit_count, pipe_surface_format(pfb->cbufs[0]), pipe_surface_format(pfb->zsbuf), pfb->width, pfb->height, pfb->nr_cbufs, pfb->samples, gmem->nbins_x * gmem->nbins_y, gmem->bin_w, gmem->bin_h); if (ctx->query_prepare) ctx->query_prepare(batch, gmem->nbins_x * gmem->nbins_y); render_tiles(batch, gmem); - trace_end_render_pass(&batch->trace); + trace_end_render_pass(&batch->trace, batch->gmem); batch->gmem_state = NULL; fd_screen_lock(ctx->screen); diff --git a/src/util/perf/u_trace.c b/src/util/perf/u_trace.c index c163e2640b9..f07ae602142 100644 --- a/src/util/perf/u_trace.c +++ b/src/util/perf/u_trace.c @@ -471,7 +471,7 @@ u_trace_disable_event_range(struct u_trace_iterator begin_it, * functions. */ void * -u_trace_append(struct u_trace *ut, const struct u_tracepoint *tp) +u_trace_append(struct u_trace *ut, void *cs, const struct u_tracepoint *tp) { struct u_trace_chunk *chunk = get_chunk(ut); @@ -491,7 +491,7 @@ u_trace_append(struct u_trace *ut, const struct u_tracepoint *tp) chunk->payload_buf += tp->payload_sz; /* record a timestamp for the trace: */ - ut->utctx->record_timestamp(ut, chunk->timestamps, chunk->num_traces); + ut->utctx->record_timestamp(ut, cs, chunk->timestamps, chunk->num_traces); chunk->traces[chunk->num_traces] = (struct u_trace_event) { .tp = tp, diff --git a/src/util/perf/u_trace.h b/src/util/perf/u_trace.h index 177b2ede97f..c184a14e94d 100644 --- a/src/util/perf/u_trace.h +++ b/src/util/perf/u_trace.h @@ -90,14 +90,15 @@ typedef void (*u_trace_delete_ts_buffer)(struct u_trace_context *utctx, void *timestamps); /** - * Driver provided callback to emit commands to capture a 64b timestamp - * into the specified timestamps buffer, at the specified index. + * Driver provided callback to emit commands into the soecified command + * stream to capture a 64b timestamp into the specified timestamps buffer, + * at the specified index. * * The hw counter that the driver records should be something that runs at * a fixed rate, even as the GPU freq changes. The same source used for * GL_TIMESTAMP queries should be appropriate. */ -typedef void (*u_trace_record_ts)(struct u_trace *ut, +typedef void (*u_trace_record_ts)(struct u_trace *ut, void *cs, void *timestamps, unsigned idx); /** diff --git a/src/util/perf/u_trace.py b/src/util/perf/u_trace.py index 428076a1962..d0d99c828ee 100644 --- a/src/util/perf/u_trace.py +++ b/src/util/perf/u_trace.py @@ -198,12 +198,12 @@ struct trace_${trace_name} { void ${trace.tp_perfetto}(${ctx_param}, uint64_t ts_ns, const void *flush_data, const struct trace_${trace_name} *payload); #endif % endif -void __trace_${trace_name}(struct u_trace *ut +void __trace_${trace_name}(struct u_trace *ut, void *cs % for arg in trace.args: , ${arg.type} ${arg.var} % endfor ); -static inline void trace_${trace_name}(struct u_trace *ut +static inline void trace_${trace_name}(struct u_trace *ut, void *cs % for arg in trace.args: , ${arg.type} ${arg.var} % endfor @@ -214,7 +214,7 @@ static inline void trace_${trace_name}(struct u_trace *ut if (!unlikely(ut->enabled)) % endif return; - __trace_${trace_name}(ut + __trace_${trace_name}(ut, cs % for arg in trace.args: , ${arg.var} % endfor @@ -303,13 +303,13 @@ static const struct u_tracepoint __tp_${trace_name} = { #endif % endif }; -void __trace_${trace_name}(struct u_trace *ut +void __trace_${trace_name}(struct u_trace *ut, void *cs % for arg in trace.args: , ${arg.type} ${arg.var} % endfor ) { struct trace_${trace_name} *__entry = - (struct trace_${trace_name} *)u_trace_append(ut, &__tp_${trace_name}); + (struct trace_${trace_name} *)u_trace_append(ut, cs, &__tp_${trace_name}); (void)__entry; % for arg in trace.tp_struct: __entry->${arg.name} = ${arg.var}; diff --git a/src/util/perf/u_trace_priv.h b/src/util/perf/u_trace_priv.h index 242c63f22e0..331a8c84ace 100644 --- a/src/util/perf/u_trace_priv.h +++ b/src/util/perf/u_trace_priv.h @@ -55,6 +55,6 @@ struct u_tracepoint { * Append a tracepoint, returning pointer that can be filled with trace * payload. */ -void * u_trace_append(struct u_trace *ut, const struct u_tracepoint *tp); +void * u_trace_append(struct u_trace *ut, void *cs, const struct u_tracepoint *tp); #endif /* _U_TRACE_PRIV_H */