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