From 898fa317dda097bbc58183659da23c3ea7a67af3 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 31 Jul 2025 08:20:34 -0700 Subject: [PATCH] util: Optimize MESA_TRACE_FUNC() Avoiding the vsnprintf speeds up drawoverhead -test 3 by 60+% !! Signed-off-by: Rob Clark Part-of: --- src/util/perf/cpu_trace.h | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/util/perf/cpu_trace.h b/src/util/perf/cpu_trace.h index 8ce3e8d0aa7..baa30c07f93 100644 --- a/src/util/perf/cpu_trace.h +++ b/src/util/perf/cpu_trace.h @@ -130,6 +130,11 @@ struct mesa_trace_flow { * * to work. */ +#define _MESA_TRACE_SCOPE_NAME(name) \ + void *_MESA_TRACE_SCOPE_VAR(__LINE__) \ + __attribute__((cleanup(_mesa_trace_scope_end), unused)) = \ + _mesa_trace_scope_begin_name(name) + #define _MESA_TRACE_SCOPE(format, ...) \ void *_MESA_TRACE_SCOPE_VAR(__LINE__) \ __attribute__((cleanup(_mesa_trace_scope_end), unused)) = \ @@ -140,12 +145,22 @@ struct mesa_trace_flow { __attribute__((cleanup(_mesa_trace_scope_end), unused)) = \ _mesa_trace_scope_flow_begin(name, id) + +static inline void * +_mesa_trace_scope_begin_name(const char *name) +{ + void *scope = NULL; + _MESA_TRACE_BEGIN(name); + _MESA_GPUVIS_TRACE_BEGIN(name); + scope = _MESA_SYSPROF_TRACE_BEGIN(name); + return scope; +} + __attribute__((format(printf, 1, 2))) static inline void * _mesa_trace_scope_begin(const char *format, ...) { char name[_MESA_TRACE_SCOPE_MAX_NAME_LENGTH]; - void *scope = NULL; va_list args; va_start(args, format); @@ -154,10 +169,7 @@ _mesa_trace_scope_begin(const char *format, ...) va_end(args); assert(len < _MESA_TRACE_SCOPE_MAX_NAME_LENGTH); - _MESA_TRACE_BEGIN(name); - _MESA_GPUVIS_TRACE_BEGIN(name); - scope = _MESA_SYSPROF_TRACE_BEGIN(name); - return scope; + return _mesa_trace_scope_begin_name(name); } static inline void * @@ -188,12 +200,14 @@ _mesa_trace_scope_end(UNUSED void **scope) #else #define _MESA_TRACE_SCOPE(format, ...) +#define _MESA_TRACE_SCOPE_FLOW(func, id) +#define _MESA_TRACE_SCOPE_NAME(name) #endif /* __has_attribute(cleanup) && __has_attribute(unused) */ #define MESA_TRACE_SCOPE(format, ...) _MESA_TRACE_SCOPE(format, ##__VA_ARGS__) #define MESA_TRACE_SCOPE_FLOW(name, id) _MESA_TRACE_SCOPE_FLOW(name, id) -#define MESA_TRACE_FUNC() _MESA_TRACE_SCOPE("%s", __func__) +#define MESA_TRACE_FUNC() _MESA_TRACE_SCOPE_NAME(__func__) #define MESA_TRACE_FUNC_FLOW(id) _MESA_TRACE_SCOPE_FLOW(__func__, id) #define MESA_TRACE_SET_COUNTER(name, value) _MESA_TRACE_SET_COUNTER(name, value) #define MESA_TRACE_TIMESTAMP_BEGIN(name, track_id, flow_id, clock, timestamp) \