xref: /aosp_15_r20/external/mesa3d/src/util/perf/cpu_trace.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #ifndef CPU_TRACE_H
7*61046927SAndroid Build Coastguard Worker #define CPU_TRACE_H
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include "u_perfetto.h"
10*61046927SAndroid Build Coastguard Worker #include "u_gpuvis.h"
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #include "util/detect_os.h"
13*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker #if defined(HAVE_PERFETTO)
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker /* note that util_perfetto_is_tracing_enabled always returns false util
18*61046927SAndroid Build Coastguard Worker  * util_perfetto_init is called
19*61046927SAndroid Build Coastguard Worker  */
20*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_BEGIN(name)                                              \
21*61046927SAndroid Build Coastguard Worker    do {                                                                      \
22*61046927SAndroid Build Coastguard Worker       if (unlikely(util_perfetto_is_tracing_enabled()))                      \
23*61046927SAndroid Build Coastguard Worker          util_perfetto_trace_begin(name);                                    \
24*61046927SAndroid Build Coastguard Worker    } while (0)
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_FLOW_BEGIN(name, id)                                     \
27*61046927SAndroid Build Coastguard Worker    do {                                                                      \
28*61046927SAndroid Build Coastguard Worker       if (unlikely(util_perfetto_is_tracing_enabled()))                      \
29*61046927SAndroid Build Coastguard Worker          util_perfetto_trace_begin_flow(name, id);                           \
30*61046927SAndroid Build Coastguard Worker    } while (0)
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_END()                                                    \
33*61046927SAndroid Build Coastguard Worker    do {                                                                      \
34*61046927SAndroid Build Coastguard Worker       if (unlikely(util_perfetto_is_tracing_enabled()))                      \
35*61046927SAndroid Build Coastguard Worker          util_perfetto_trace_end();                                          \
36*61046927SAndroid Build Coastguard Worker    } while (0)
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_SET_COUNTER(name, value)                                 \
39*61046927SAndroid Build Coastguard Worker    do {                                                                      \
40*61046927SAndroid Build Coastguard Worker       if (unlikely(util_perfetto_is_tracing_enabled()))                      \
41*61046927SAndroid Build Coastguard Worker          util_perfetto_counter_set(name, value);                             \
42*61046927SAndroid Build Coastguard Worker    } while (0)
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_TIMESTAMP_BEGIN(name, track_id, flow_id, timestamp)      \
45*61046927SAndroid Build Coastguard Worker    do {                                                                      \
46*61046927SAndroid Build Coastguard Worker       if (unlikely(util_perfetto_is_tracing_enabled()))                      \
47*61046927SAndroid Build Coastguard Worker          util_perfetto_trace_full_begin(name, track_id, flow_id, timestamp); \
48*61046927SAndroid Build Coastguard Worker    } while (0)
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_TIMESTAMP_END(name, track_id, timestamp)                 \
51*61046927SAndroid Build Coastguard Worker    do {                                                                      \
52*61046927SAndroid Build Coastguard Worker       if (unlikely(util_perfetto_is_tracing_enabled()))                      \
53*61046927SAndroid Build Coastguard Worker          util_perfetto_trace_full_end(name, track_id, timestamp);            \
54*61046927SAndroid Build Coastguard Worker    } while (0)
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker /* NOTE: for now disable atrace for C++ to workaround a ndk bug with ordering
57*61046927SAndroid Build Coastguard Worker  * between stdatomic.h and atomic.h.  See:
58*61046927SAndroid Build Coastguard Worker  *
59*61046927SAndroid Build Coastguard Worker  *   https://github.com/android/ndk/issues/1178
60*61046927SAndroid Build Coastguard Worker  */
61*61046927SAndroid Build Coastguard Worker #elif DETECT_OS_ANDROID && !defined(__cplusplus)
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker #include <cutils/trace.h>
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_BEGIN(name)                                              \
66*61046927SAndroid Build Coastguard Worker    atrace_begin(ATRACE_TAG_GRAPHICS, name)
67*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_END() atrace_end(ATRACE_TAG_GRAPHICS)
68*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_FLOW_BEGIN(name, id)                                     \
69*61046927SAndroid Build Coastguard Worker    atrace_begin(ATRACE_TAG_GRAPHICS, name)
70*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_SET_COUNTER(name, value)
71*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_TIMESTAMP_BEGIN(name, track_id, flow_id, timestamp)
72*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_TIMESTAMP_END(name, track_id, timestamp)
73*61046927SAndroid Build Coastguard Worker #else
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_BEGIN(name)
76*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_END()
77*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_FLOW_BEGIN(name, id)
78*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_SET_COUNTER(name, value)
79*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_TIMESTAMP_BEGIN(name, track_id, flow_id, timestamp)
80*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_TIMESTAMP_END(name, track_id, timestamp)
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker #endif /* HAVE_PERFETTO */
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker #if defined(HAVE_GPUVIS)
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker #define _MESA_GPUVIS_TRACE_BEGIN(name) util_gpuvis_begin(name)
87*61046927SAndroid Build Coastguard Worker #define _MESA_GPUVIS_TRACE_END() util_gpuvis_end()
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker #else
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker #define _MESA_GPUVIS_TRACE_BEGIN(name)
92*61046927SAndroid Build Coastguard Worker #define _MESA_GPUVIS_TRACE_END()
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker #endif /* HAVE_GPUVIS */
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker #if __has_attribute(cleanup) && __has_attribute(unused)
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_SCOPE_VAR_CONCAT(name, suffix) name##suffix
99*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_SCOPE_VAR(suffix)                                        \
100*61046927SAndroid Build Coastguard Worker    _MESA_TRACE_SCOPE_VAR_CONCAT(_mesa_trace_scope_, suffix)
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker /* This must expand to a single non-scoped statement for
103*61046927SAndroid Build Coastguard Worker  *
104*61046927SAndroid Build Coastguard Worker  *    if (cond)
105*61046927SAndroid Build Coastguard Worker  *       _MESA_TRACE_SCOPE(...)
106*61046927SAndroid Build Coastguard Worker  *
107*61046927SAndroid Build Coastguard Worker  * to work.
108*61046927SAndroid Build Coastguard Worker  */
109*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_SCOPE(name)                                              \
110*61046927SAndroid Build Coastguard Worker    int _MESA_TRACE_SCOPE_VAR(__LINE__)                                       \
111*61046927SAndroid Build Coastguard Worker       __attribute__((cleanup(_mesa_trace_scope_end), unused)) =              \
112*61046927SAndroid Build Coastguard Worker          _mesa_trace_scope_begin(name)
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_SCOPE_FLOW(name, id)                                     \
115*61046927SAndroid Build Coastguard Worker    int _MESA_TRACE_SCOPE_VAR(__LINE__)                                       \
116*61046927SAndroid Build Coastguard Worker       __attribute__((cleanup(_mesa_trace_scope_end), unused)) =              \
117*61046927SAndroid Build Coastguard Worker          _mesa_trace_scope_flow_begin(name, id)
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker static inline int
_mesa_trace_scope_begin(const char * name)120*61046927SAndroid Build Coastguard Worker _mesa_trace_scope_begin(const char *name)
121*61046927SAndroid Build Coastguard Worker {
122*61046927SAndroid Build Coastguard Worker    _MESA_TRACE_BEGIN(name);
123*61046927SAndroid Build Coastguard Worker    _MESA_GPUVIS_TRACE_BEGIN(name);
124*61046927SAndroid Build Coastguard Worker    return 0;
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker static inline int
_mesa_trace_scope_flow_begin(const char * name,uint64_t * id)128*61046927SAndroid Build Coastguard Worker _mesa_trace_scope_flow_begin(const char *name, uint64_t *id)
129*61046927SAndroid Build Coastguard Worker {
130*61046927SAndroid Build Coastguard Worker    if (*id == 0)
131*61046927SAndroid Build Coastguard Worker       *id = util_perfetto_next_id();
132*61046927SAndroid Build Coastguard Worker    _MESA_TRACE_FLOW_BEGIN(name, *id);
133*61046927SAndroid Build Coastguard Worker    _MESA_GPUVIS_TRACE_BEGIN(name);
134*61046927SAndroid Build Coastguard Worker    return 0;
135*61046927SAndroid Build Coastguard Worker }
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker static inline void
_mesa_trace_scope_end(UNUSED int * scope)138*61046927SAndroid Build Coastguard Worker _mesa_trace_scope_end(UNUSED int *scope)
139*61046927SAndroid Build Coastguard Worker {
140*61046927SAndroid Build Coastguard Worker    _MESA_GPUVIS_TRACE_END();
141*61046927SAndroid Build Coastguard Worker    _MESA_TRACE_END();
142*61046927SAndroid Build Coastguard Worker }
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker #else
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker #define _MESA_TRACE_SCOPE(name)
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker #endif /* __has_attribute(cleanup) && __has_attribute(unused) */
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker #define MESA_TRACE_SCOPE(name) _MESA_TRACE_SCOPE(name)
151*61046927SAndroid Build Coastguard Worker #define MESA_TRACE_SCOPE_FLOW(name, id) _MESA_TRACE_SCOPE_FLOW(name, id)
152*61046927SAndroid Build Coastguard Worker #define MESA_TRACE_FUNC() _MESA_TRACE_SCOPE(__func__)
153*61046927SAndroid Build Coastguard Worker #define MESA_TRACE_FUNC_FLOW(id) _MESA_TRACE_SCOPE_FLOW(__func__, id)
154*61046927SAndroid Build Coastguard Worker #define MESA_TRACE_SET_COUNTER(name, value) _MESA_TRACE_SET_COUNTER(name, value)
155*61046927SAndroid Build Coastguard Worker #define MESA_TRACE_TIMESTAMP_BEGIN(name, track_id, flow_id, timestamp) \
156*61046927SAndroid Build Coastguard Worker    _MESA_TRACE_TIMESTAMP_BEGIN(name, track_id, flow_id, timestamp)
157*61046927SAndroid Build Coastguard Worker #define MESA_TRACE_TIMESTAMP_END(name, track_id, timestamp) \
158*61046927SAndroid Build Coastguard Worker    _MESA_TRACE_TIMESTAMP_END(name, track_id, timestamp)
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker static inline void
util_cpu_trace_init()161*61046927SAndroid Build Coastguard Worker util_cpu_trace_init()
162*61046927SAndroid Build Coastguard Worker {
163*61046927SAndroid Build Coastguard Worker    util_perfetto_init();
164*61046927SAndroid Build Coastguard Worker    util_gpuvis_init();
165*61046927SAndroid Build Coastguard Worker }
166*61046927SAndroid Build Coastguard Worker 
167*61046927SAndroid Build Coastguard Worker #endif /* CPU_TRACE_H */
168