diff --git a/src/gallium/drivers/iris/iris_utrace.c b/src/gallium/drivers/iris/iris_utrace.c index 88c84d12f17..b13a2581e38 100644 --- a/src/gallium/drivers/iris/iris_utrace.c +++ b/src/gallium/drivers/iris/iris_utrace.c @@ -112,7 +112,7 @@ iris_utrace_record_ts(struct u_trace *trace, void *cs, const bool is_end_compute = cs == NULL && - (flags & INTEL_DS_TRACEPOINT_FLAG_END_OF_PIPE_CS); + (flags & INTEL_DS_TRACEPOINT_FLAG_END_CS); if (is_end_compute) { assert(ice->utrace.last_compute_walker != NULL); batch->screen->vtbl.rewrite_compute_walker_pc( diff --git a/src/intel/ds/intel_driver_ds.h b/src/intel/ds/intel_driver_ds.h index c0d82230803..bc2f9756003 100644 --- a/src/intel/ds/intel_driver_ds.h +++ b/src/intel/ds/intel_driver_ds.h @@ -71,8 +71,14 @@ enum intel_ds_tracepoint_flags { /** * Whether this tracepoint's timestamp is recorded on the compute pipeline. */ - INTEL_DS_TRACEPOINT_FLAG_END_OF_PIPE_CS = BITFIELD_BIT(1), - + INTEL_DS_TRACEPOINT_FLAG_END_CS = BITFIELD_BIT(1), + /** + * Whether this tracepoint's timestamp is recorded on the compute pipeline + * or from top of pipe if there was no dispatch (useful for acceleration + * structure builds where the runtime might choose to not emit anything for + * a number of reasons). + */ + INTEL_DS_TRACEPOINT_FLAG_END_CS_OR_NOOP = BITFIELD_BIT(2), }; /* Convert internal driver PIPE_CONTROL stall bits to intel_ds_stall_flag. */ diff --git a/src/intel/ds/intel_tracepoints.py b/src/intel/ds/intel_tracepoints.py index 029d189997b..67cd0e29fa1 100644 --- a/src/intel/ds/intel_tracepoints.py +++ b/src/intel/ds/intel_tracepoints.py @@ -47,7 +47,7 @@ def define_tracepoints(args): def begin_end_tp(name, tp_args=[], tp_struct=None, tp_print=None, tp_default_enabled=True, end_pipelined=True, - compute=False, + compute=False, maybe_compute=False, need_cs_param=False): global intel_default_tps if tp_default_enabled: @@ -59,7 +59,9 @@ def define_tracepoints(args): tp_flags = [] if end_pipelined: if compute: - tp_flags.append('INTEL_DS_TRACEPOINT_FLAG_END_OF_PIPE_CS') + tp_flags.append('INTEL_DS_TRACEPOINT_FLAG_END_CS') + elif maybe_compute: + tp_flags.append('INTEL_DS_TRACEPOINT_FLAG_END_CS_OR_NOOP') else: tp_flags.append('INTEL_DS_TRACEPOINT_FLAG_END_OF_PIPE') Tracepoint('intel_end_{0}'.format(name), @@ -199,13 +201,13 @@ def define_tracepoints(args): need_cs_param=True) begin_end_tp('as_build') - begin_end_tp('as_build_leaves', compute=True) - begin_end_tp('as_morton_generate', compute=True) - begin_end_tp('as_morton_sort', compute=True) - begin_end_tp('as_lbvh_build_internal', compute=True) - begin_end_tp('as_ploc_build_internal', compute=True) - begin_end_tp('as_encode', compute=True) - begin_end_tp('as_copy', compute=True) + begin_end_tp('as_build_leaves', maybe_compute=True) + begin_end_tp('as_morton_generate', maybe_compute=True) + begin_end_tp('as_morton_sort', maybe_compute=True) + begin_end_tp('as_lbvh_build_internal', maybe_compute=True) + begin_end_tp('as_ploc_build_internal', maybe_compute=True) + begin_end_tp('as_encode', maybe_compute=True) + begin_end_tp('as_copy', maybe_compute=True) begin_end_tp('rays', tp_args=[Arg(type='uint32_t', var='group_x', c_format='%u'), diff --git a/src/intel/vulkan/anv_utrace.c b/src/intel/vulkan/anv_utrace.c index 8145bbc2549..6fb1cfa7dd4 100644 --- a/src/intel/vulkan/anv_utrace.c +++ b/src/intel/vulkan/anv_utrace.c @@ -350,21 +350,36 @@ anv_utrace_record_ts(struct u_trace *ut, void *cs, /* Is this a end of compute trace point? */ const bool is_end_compute = cs == NULL && - (flags & INTEL_DS_TRACEPOINT_FLAG_END_OF_PIPE_CS); - - assert(device->info->verx10 < 125 || - !is_end_compute || - cmd_buffer->state.last_indirect_dispatch != NULL || - cmd_buffer->state.last_compute_walker != NULL); - - enum anv_timestamp_capture_type capture_type = - (device->info->verx10 >= 125 && is_end_compute) ? - (cmd_buffer->state.last_indirect_dispatch != NULL ? - ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH : ANV_TIMESTAMP_REWRITE_COMPUTE_WALKER) : - (flags & (INTEL_DS_TRACEPOINT_FLAG_END_OF_PIPE | - INTEL_DS_TRACEPOINT_FLAG_END_OF_PIPE_CS)) ? - ANV_TIMESTAMP_CAPTURE_END_OF_PIPE : ANV_TIMESTAMP_CAPTURE_TOP_OF_PIPE; - + (flags & INTEL_DS_TRACEPOINT_FLAG_END_CS); + const bool is_end_compute_or_noop = + cs == NULL && + (flags & INTEL_DS_TRACEPOINT_FLAG_END_CS_OR_NOOP); + enum anv_timestamp_capture_type capture_type; + if (is_end_compute) { + assert(device->info->verx10 < 125 || + !is_end_compute || + cmd_buffer->state.last_indirect_dispatch != NULL || + cmd_buffer->state.last_compute_walker != NULL); + capture_type = + device->info->verx10 >= 125 ? + (cmd_buffer->state.last_indirect_dispatch != NULL ? + ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH : + ANV_TIMESTAMP_REWRITE_COMPUTE_WALKER) : + ANV_TIMESTAMP_CAPTURE_END_OF_PIPE; + } else if (is_end_compute_or_noop) { + capture_type = + device->info->verx10 >= 125 ? + (cmd_buffer->state.last_indirect_dispatch != NULL ? + ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH : + (cmd_buffer->state.last_compute_walker != NULL ? + ANV_TIMESTAMP_REWRITE_COMPUTE_WALKER : + ANV_TIMESTAMP_CAPTURE_TOP_OF_PIPE)) : + ANV_TIMESTAMP_CAPTURE_TOP_OF_PIPE; + } else { + capture_type = (flags & INTEL_DS_TRACEPOINT_FLAG_END_CS) ? + ANV_TIMESTAMP_CAPTURE_END_OF_PIPE : + ANV_TIMESTAMP_CAPTURE_TOP_OF_PIPE; + } void *addr = capture_type == ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH ? cmd_buffer->state.last_indirect_dispatch :