From cff047280a94a380aba2385329eecbcc55426a71 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Wed, 5 Nov 2025 12:49:23 +0200 Subject: [PATCH] anv: avoid invalid timestamp generation due to skipped commands We skip the stall emission for STATE_BASE_ADDRESS since this one can be skipped on Gfx12.5+ and instead add a new sba tracepoint that has valid timestamps. Signed-off-by: Lionel Landwerlin Fixes: 0147908a89 ("anv: predicate emission of STATE_BASE_ADDRESS") Reviewed-by: Casey Bowman Part-of: --- src/intel/ds/intel_driver_ds.cc | 1 + src/intel/ds/intel_tracepoints.py | 4 ++++ src/intel/vulkan/genX_cmd_buffer.c | 13 +++++++++++++ 3 files changed, 18 insertions(+) diff --git a/src/intel/ds/intel_driver_ds.cc b/src/intel/ds/intel_driver_ds.cc index 3a9a7e4c9e4..5a5ab8a279a 100644 --- a/src/intel/ds/intel_driver_ds.cc +++ b/src/intel/ds/intel_driver_ds.cc @@ -395,6 +395,7 @@ extern "C" { CREATE_DUAL_EVENT_CALLBACK(frame, INTEL_DS_QUEUE_STAGE_FRAME) CREATE_DUAL_EVENT_CALLBACK(batch, INTEL_DS_QUEUE_STAGE_CMD_BUFFER) CREATE_DUAL_EVENT_CALLBACK(cmd_buffer, INTEL_DS_QUEUE_STAGE_CMD_BUFFER) +CREATE_DUAL_EVENT_CALLBACK(sba, INTEL_DS_QUEUE_STAGE_CMD_BUFFER) CREATE_DUAL_EVENT_CALLBACK(render_pass, INTEL_DS_QUEUE_STAGE_RENDER_PASS) CREATE_DUAL_EVENT_CALLBACK(blorp, INTEL_DS_QUEUE_STAGE_BLORP) CREATE_DUAL_EVENT_CALLBACK(draw, INTEL_DS_QUEUE_STAGE_DRAW) diff --git a/src/intel/ds/intel_tracepoints.py b/src/intel/ds/intel_tracepoints.py index 6a3f8693c4d..6ce8dec611d 100644 --- a/src/intel/ds/intel_tracepoints.py +++ b/src/intel/ds/intel_tracepoints.py @@ -126,6 +126,10 @@ def define_tracepoints(args): begin_end_tp('xfb', end_pipelined=False) + # STATE_BASE_ADDRESS emission, only for Anv + begin_end_tp('sba', + end_pipelined=False) + # Dynamic rendering tracepoints, only for Anv begin_end_tp('render_pass', tp_args=[Arg(type='uint64_t', var='command_buffer_handle', c_format='%" PRIu64 "', perfetto_field=True), diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 7bdba356b3a..527d31fba04 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -251,6 +251,15 @@ genX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer) fill_state_base_addr(cmd_buffer, &sba); #if GFX_VERx10 >= 125 + trace_intel_begin_sba(cmd_buffer->batch.trace); + + /* Disable stall tracing to avoid leaving a tracepoint with random + * timestamp if the STATE_BASE_ADDRESS instruction sequence is skipped + * over. + */ + struct u_trace *tmp_trace = cmd_buffer->batch.trace; + cmd_buffer->batch.trace = NULL; + struct mi_builder b; mi_builder_init(&b, device->info, &cmd_buffer->batch); mi_builder_set_mocs(&b, isl_mocs(&device->isl_dev, 0, false)); @@ -369,6 +378,10 @@ genX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer) mi_imm(sba.BindlessSurfaceStateBaseAddress.offset)); mi_goto_target(&b, &t); + + cmd_buffer->batch.trace = tmp_trace; + + trace_intel_end_sba(cmd_buffer->batch.trace); #endif #if GFX_VERx10 >= 125