diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.c b/src/gallium/drivers/freedreno/freedreno_gmem.c index 9f7124dfdee..2ee9b0b4b5d 100644 --- a/src/gallium/drivers/freedreno/freedreno_gmem.c +++ b/src/gallium/drivers/freedreno/freedreno_gmem.c @@ -708,14 +708,11 @@ fd_gmem_render_tiles(struct fd_batch *batch) if (!(batch->cleared || batch->num_draws)) sysmem = true; - if (!batch->nondraw) { #if HAVE_PERFETTO - /* For non-draw batches, we don't really have a good place to - * match up the api event submit-id to the on-gpu rendering, - * so skip this for non-draw batches. - */ - fd_perfetto_submit(ctx); + fd_perfetto_submit(ctx); #endif + + if (!batch->nondraw) { trace_flush_batch(&batch->trace, batch->gmem, batch, batch->cleared, batch->gmem_reason, batch->num_draws); trace_framebuffer_state(&batch->trace, batch->gmem, pfb); @@ -760,8 +757,11 @@ fd_gmem_render_tiles(struct fd_batch *batch) if (batch->nondraw) { DBG("%p: rendering non-draw", batch); - if (!fd_ringbuffer_empty(batch->draw)) + if (!fd_ringbuffer_empty(batch->draw)) { + trace_start_nondraw(&batch->trace, batch->gmem, ctx->submit_count); render_sysmem(batch); + trace_end_nondraw(&batch->trace, batch->gmem); + } ctx->stats.batch_nondraw++; } else if (sysmem) { trace_render_sysmem(&batch->trace, batch->gmem); diff --git a/src/gallium/drivers/freedreno/freedreno_perfetto.cc b/src/gallium/drivers/freedreno/freedreno_perfetto.cc index 55bd7d858bb..ce268f397cb 100644 --- a/src/gallium/drivers/freedreno/freedreno_perfetto.cc +++ b/src/gallium/drivers/freedreno/freedreno_perfetto.cc @@ -187,6 +187,8 @@ stage_end(struct pipe_context *pctx, uint64_t ts_ns, enum fd_stage_id stage) data->set_name("binHeight"); data->set_value(std::to_string(p->binh)); } + } else if (stage == NONDRAW_STAGE_ID) { + event->set_submission_id(p->submit_id); } else if (stage == COMPUTE_STAGE_ID) { { auto data = event->add_extra_data(); @@ -368,6 +370,28 @@ fd_end_render_pass(struct pipe_context *pctx, uint64_t ts_ns, stage_end(pctx, ts_ns, SURFACE_STAGE_ID); } +void +fd_start_nondraw(struct pipe_context *pctx, uint64_t ts_ns, + uint16_t tp_idx, const void *flush_data, + const struct trace_start_nondraw *payload, + const void *indirect_data) +{ + stage_start(pctx, ts_ns, NONDRAW_STAGE_ID); + + struct fd_perfetto_state *p = &fd_context(pctx)->perfetto; + + p->submit_id = payload->submit_id; +} + +void +fd_end_nondraw(struct pipe_context *pctx, uint64_t ts_ns, + uint16_t tp_idx, const void *flush_data, + const struct trace_end_nondraw *payload, + const void *indirect_data) +{ + stage_end(pctx, ts_ns, NONDRAW_STAGE_ID); +} + void fd_start_binning_ib(struct pipe_context *pctx, uint64_t ts_ns, uint16_t tp_idx, const void *flush_data, diff --git a/src/gallium/drivers/freedreno/freedreno_perfetto.h b/src/gallium/drivers/freedreno/freedreno_perfetto.h index 19261d1cc78..23a48f3578b 100644 --- a/src/gallium/drivers/freedreno/freedreno_perfetto.h +++ b/src/gallium/drivers/freedreno/freedreno_perfetto.h @@ -17,6 +17,7 @@ extern "C" { */ enum fd_stage_id { SURFACE_STAGE_ID, /* Surface is a sort of meta-stage for render-target info */ + NONDRAW_STAGE_ID, BINNING_STAGE_ID, GMEM_STAGE_ID, BYPASS_STAGE_ID, @@ -37,6 +38,7 @@ static const struct { const char *desc; } stages[] = { [SURFACE_STAGE_ID] = {"Surface"}, + [NONDRAW_STAGE_ID] = {"Non-draw"}, [BINNING_STAGE_ID] = {"Binning", "Perform Visibility pass and determine target bins"}, [GMEM_STAGE_ID] = {"Render", "Rendering to GMEM"}, [BYPASS_STAGE_ID] = {"Render", "Rendering to system memory"}, diff --git a/src/gallium/drivers/freedreno/freedreno_tracepoints.py b/src/gallium/drivers/freedreno/freedreno_tracepoints.py index f5897bf56fb..7bd6b757794 100644 --- a/src/gallium/drivers/freedreno/freedreno_tracepoints.py +++ b/src/gallium/drivers/freedreno/freedreno_tracepoints.py @@ -102,6 +102,10 @@ begin_end_tp('render_pass', TracepointArg(type='uint16_t', var='binh', c_format='%u')], ) +begin_end_tp('nondraw', + args=[TracepointArg(type='uint32_t', var='submit_id', c_format='%u')], +) + begin_end_tp('binning_ib') begin_end_tp('vsc_overflow_test') begin_end_tp('prologue')