xref: /aosp_15_r20/external/mesa3d/src/util/perf/u_trace.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2020 Google, Inc.
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*61046927SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #ifndef _U_TRACE_H
25*61046927SAndroid Build Coastguard Worker #define _U_TRACE_H
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
28*61046927SAndroid Build Coastguard Worker #include <stdint.h>
29*61046927SAndroid Build Coastguard Worker #include <stdio.h>
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
32*61046927SAndroid Build Coastguard Worker #include "util/u_atomic.h"
33*61046927SAndroid Build Coastguard Worker #include "util/u_queue.h"
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
36*61046927SAndroid Build Coastguard Worker extern "C" {
37*61046927SAndroid Build Coastguard Worker #endif
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker /* A trace mechanism (very) loosely inspired by the linux kernel tracepoint
40*61046927SAndroid Build Coastguard Worker  * mechanism, in that it allows for defining driver specific (or common)
41*61046927SAndroid Build Coastguard Worker  * tracepoints, which generate 'trace_$name()' functions that can be
42*61046927SAndroid Build Coastguard Worker  * called at various points in commandstream emit.
43*61046927SAndroid Build Coastguard Worker  *
44*61046927SAndroid Build Coastguard Worker  * Currently a printf backend is implemented, but the expectation is to
45*61046927SAndroid Build Coastguard Worker  * also implement a perfetto backend for shipping out traces to a tool like
46*61046927SAndroid Build Coastguard Worker  * AGI.
47*61046927SAndroid Build Coastguard Worker  *
48*61046927SAndroid Build Coastguard Worker  * Notable differences:
49*61046927SAndroid Build Coastguard Worker  *
50*61046927SAndroid Build Coastguard Worker  *  - GPU timestamps!  A driver provided callback is used to emit timestamps
51*61046927SAndroid Build Coastguard Worker  *    to a buffer.  At a later point in time (when stalling to wait for the
52*61046927SAndroid Build Coastguard Worker  *    GPU is not required), the timestamps are re-united with the trace
53*61046927SAndroid Build Coastguard Worker  *    payload.  This makes the trace mechanism suitable for profiling.
54*61046927SAndroid Build Coastguard Worker  *
55*61046927SAndroid Build Coastguard Worker  *  - Instead of a systemwide trace ringbuffer, buffering of un-retired
56*61046927SAndroid Build Coastguard Worker  *    tracepoints is split into two stages.  Traces are emitted to a
57*61046927SAndroid Build Coastguard Worker  *    'u_trace' instance, and at a later time flushed to a 'u_trace_context'
58*61046927SAndroid Build Coastguard Worker  *    instance.  This avoids the requirement that commandstream containing
59*61046927SAndroid Build Coastguard Worker  *    tracepoints is emitted in the same order as it is generated.
60*61046927SAndroid Build Coastguard Worker  *
61*61046927SAndroid Build Coastguard Worker  *    If the hw has multiple parallel "engines" (for example, 3d/blit/compute)
62*61046927SAndroid Build Coastguard Worker  *    then a `u_trace_context` per-engine should be used.
63*61046927SAndroid Build Coastguard Worker  *
64*61046927SAndroid Build Coastguard Worker  *  - Unlike kernel tracepoints, u_trace tracepoints are defined in py
65*61046927SAndroid Build Coastguard Worker  *    from which header and src files are generated.  Since we already have
66*61046927SAndroid Build Coastguard Worker  *    a build dependency on python+mako, this gives more flexibility than
67*61046927SAndroid Build Coastguard Worker  *    clunky preprocessor macro magic.
68*61046927SAndroid Build Coastguard Worker  *
69*61046927SAndroid Build Coastguard Worker  */
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker struct u_trace_context;
72*61046927SAndroid Build Coastguard Worker struct u_trace;
73*61046927SAndroid Build Coastguard Worker struct u_trace_chunk;
74*61046927SAndroid Build Coastguard Worker struct u_trace_printer;
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker /**
77*61046927SAndroid Build Coastguard Worker  * Special reserved value to indicate that no timestamp was captured,
78*61046927SAndroid Build Coastguard Worker  * and that the timestamp of the previous trace should be reused.
79*61046927SAndroid Build Coastguard Worker  */
80*61046927SAndroid Build Coastguard Worker #define U_TRACE_NO_TIMESTAMP ((uint64_t) 0)
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker /**
83*61046927SAndroid Build Coastguard Worker  * Address representation
84*61046927SAndroid Build Coastguard Worker  */
85*61046927SAndroid Build Coastguard Worker struct u_trace_address {
86*61046927SAndroid Build Coastguard Worker    /**
87*61046927SAndroid Build Coastguard Worker     * Pointer to a buffer object
88*61046927SAndroid Build Coastguard Worker     */
89*61046927SAndroid Build Coastguard Worker    void *bo;
90*61046927SAndroid Build Coastguard Worker    /**
91*61046927SAndroid Build Coastguard Worker     * Offset inside the buffer object or address of bo is NULL
92*61046927SAndroid Build Coastguard Worker     */
93*61046927SAndroid Build Coastguard Worker    uint64_t offset;
94*61046927SAndroid Build Coastguard Worker };
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker /**
97*61046927SAndroid Build Coastguard Worker  * Driver provided callback to create a buffer which will be read by
98*61046927SAndroid Build Coastguard Worker  * u_trace_read_ts function.
99*61046927SAndroid Build Coastguard Worker  */
100*61046927SAndroid Build Coastguard Worker typedef void *(*u_trace_create_buffer)(struct u_trace_context *utctx,
101*61046927SAndroid Build Coastguard Worker                                        uint64_t size_B);
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker /**
104*61046927SAndroid Build Coastguard Worker  * Driver provided callback to delete a buffer.
105*61046927SAndroid Build Coastguard Worker  */
106*61046927SAndroid Build Coastguard Worker typedef void (*u_trace_delete_buffer)(struct u_trace_context *utctx,
107*61046927SAndroid Build Coastguard Worker                                       void *buffer);
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker /**
110*61046927SAndroid Build Coastguard Worker  * Driver provided callback to emit commands into the soecified command
111*61046927SAndroid Build Coastguard Worker  * stream to capture a 64b timestamp into the specified timestamps buffer,
112*61046927SAndroid Build Coastguard Worker  * at the specified index.
113*61046927SAndroid Build Coastguard Worker  *
114*61046927SAndroid Build Coastguard Worker  * The hw counter that the driver records should be something that runs at
115*61046927SAndroid Build Coastguard Worker  * a fixed rate, even as the GPU freq changes.  The same source used for
116*61046927SAndroid Build Coastguard Worker  * GL_TIMESTAMP queries should be appropriate.
117*61046927SAndroid Build Coastguard Worker  */
118*61046927SAndroid Build Coastguard Worker typedef void (*u_trace_record_ts)(struct u_trace *ut,
119*61046927SAndroid Build Coastguard Worker                                   void *cs,
120*61046927SAndroid Build Coastguard Worker                                   void *timestamps,
121*61046927SAndroid Build Coastguard Worker                                   uint64_t offset_B,
122*61046927SAndroid Build Coastguard Worker                                   uint32_t flags);
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker /**
125*61046927SAndroid Build Coastguard Worker  * Driver provided callback to capture indirect data.
126*61046927SAndroid Build Coastguard Worker  */
127*61046927SAndroid Build Coastguard Worker typedef void (*u_trace_capture_data)(struct u_trace *ut,
128*61046927SAndroid Build Coastguard Worker                                      void *cs,
129*61046927SAndroid Build Coastguard Worker                                      void *dst_buffer,
130*61046927SAndroid Build Coastguard Worker                                      uint64_t dst_offset_B,
131*61046927SAndroid Build Coastguard Worker                                      void *src_buffer,
132*61046927SAndroid Build Coastguard Worker                                      uint64_t src_offset_B,
133*61046927SAndroid Build Coastguard Worker                                      uint32_t size_B);
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker /**
136*61046927SAndroid Build Coastguard Worker  * Driver provided callback to read back previously recorded indirect data.
137*61046927SAndroid Build Coastguard Worker  */
138*61046927SAndroid Build Coastguard Worker typedef const void *(*u_trace_get_data)(struct u_trace_context *utctx,
139*61046927SAndroid Build Coastguard Worker                                         void *buffer,
140*61046927SAndroid Build Coastguard Worker                                         uint64_t offset_B,
141*61046927SAndroid Build Coastguard Worker                                         uint32_t size_B);
142*61046927SAndroid Build Coastguard Worker /**
143*61046927SAndroid Build Coastguard Worker  * Driver provided callback to read back a previously recorded timestamp.
144*61046927SAndroid Build Coastguard Worker  * If necessary, this should block until the GPU has finished writing back
145*61046927SAndroid Build Coastguard Worker  * the timestamps.  (The timestamps will be read back in order, so it is
146*61046927SAndroid Build Coastguard Worker  * safe to only synchronize on idx==0.)
147*61046927SAndroid Build Coastguard Worker  *
148*61046927SAndroid Build Coastguard Worker  * flush_data is data provided by the driver via u_trace_flush.
149*61046927SAndroid Build Coastguard Worker  *
150*61046927SAndroid Build Coastguard Worker  * The returned timestamp should be in units of nanoseconds.  The same
151*61046927SAndroid Build Coastguard Worker  * timebase as GL_TIMESTAMP queries should be used.
152*61046927SAndroid Build Coastguard Worker  *
153*61046927SAndroid Build Coastguard Worker  * The driver can return the special U_TRACE_NO_TIMESTAMP value to indicate
154*61046927SAndroid Build Coastguard Worker  * that no timestamp was captured and the timestamp from the previous trace
155*61046927SAndroid Build Coastguard Worker  * will be re-used.  (The first trace in the u_trace buf may not do this.)
156*61046927SAndroid Build Coastguard Worker  * This allows the driver to detect cases where multiple tracepoints are
157*61046927SAndroid Build Coastguard Worker  * emitted with no other intervening cmdstream, to avoid pointlessly
158*61046927SAndroid Build Coastguard Worker  * capturing the same timestamp multiple times in a row.
159*61046927SAndroid Build Coastguard Worker  */
160*61046927SAndroid Build Coastguard Worker typedef uint64_t (*u_trace_read_ts)(struct u_trace_context *utctx,
161*61046927SAndroid Build Coastguard Worker                                     void *timestamps,
162*61046927SAndroid Build Coastguard Worker                                     uint64_t offset_B,
163*61046927SAndroid Build Coastguard Worker                                     void *flush_data);
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker /**
166*61046927SAndroid Build Coastguard Worker  * Driver provided callback to create a buffer which will be read by
167*61046927SAndroid Build Coastguard Worker  * u_trace_read_ts function.
168*61046927SAndroid Build Coastguard Worker  */
169*61046927SAndroid Build Coastguard Worker typedef void *(*u_trace_copy_data)(struct u_trace *ut,
170*61046927SAndroid Build Coastguard Worker                                    void *cs,
171*61046927SAndroid Build Coastguard Worker                                    void *dst,
172*61046927SAndroid Build Coastguard Worker                                    uint64_t dst_offset_B,
173*61046927SAndroid Build Coastguard Worker                                    void *src,
174*61046927SAndroid Build Coastguard Worker                                    uint64_t src_offset_B,
175*61046927SAndroid Build Coastguard Worker                                    uint64_t size_B);
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker /**
178*61046927SAndroid Build Coastguard Worker  * Driver provided callback to delete flush data.
179*61046927SAndroid Build Coastguard Worker  */
180*61046927SAndroid Build Coastguard Worker typedef void (*u_trace_delete_flush_data)(struct u_trace_context *utctx,
181*61046927SAndroid Build Coastguard Worker                                           void *flush_data);
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker enum u_trace_type {
184*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_PRINT = 1u << 0,
185*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_JSON = 1u << 1,
186*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_PERFETTO_ACTIVE = 1u << 2,
187*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_PERFETTO_ENV = 1u << 3,
188*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_MARKERS = 1u << 4,
189*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_INDIRECTS = 1u << 5,
190*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_CSV = 1u << 6,
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_PRINT_CSV = U_TRACE_TYPE_PRINT | U_TRACE_TYPE_CSV,
193*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_PRINT_JSON = U_TRACE_TYPE_PRINT | U_TRACE_TYPE_JSON,
194*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_PERFETTO =
195*61046927SAndroid Build Coastguard Worker       U_TRACE_TYPE_PERFETTO_ACTIVE | U_TRACE_TYPE_PERFETTO_ENV,
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker    /*
198*61046927SAndroid Build Coastguard Worker     * A mask of traces that require appending to the tracepoint chunk list.
199*61046927SAndroid Build Coastguard Worker     */
200*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_REQUIRE_QUEUING = U_TRACE_TYPE_PRINT | U_TRACE_TYPE_PERFETTO,
201*61046927SAndroid Build Coastguard Worker    /*
202*61046927SAndroid Build Coastguard Worker     * A mask of traces that require processing the tracepoint chunk list.
203*61046927SAndroid Build Coastguard Worker     */
204*61046927SAndroid Build Coastguard Worker    U_TRACE_TYPE_REQUIRE_PROCESSING =
205*61046927SAndroid Build Coastguard Worker       U_TRACE_TYPE_PRINT | U_TRACE_TYPE_PERFETTO_ACTIVE,
206*61046927SAndroid Build Coastguard Worker };
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker /**
209*61046927SAndroid Build Coastguard Worker  * The trace context provides tracking for "in-flight" traces, once the
210*61046927SAndroid Build Coastguard Worker  * cmdstream that records timestamps has been flushed.
211*61046927SAndroid Build Coastguard Worker  */
212*61046927SAndroid Build Coastguard Worker struct u_trace_context {
213*61046927SAndroid Build Coastguard Worker    /* All traces enabled in this context */
214*61046927SAndroid Build Coastguard Worker    enum u_trace_type enabled_traces;
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker    void *pctx;
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker    u_trace_create_buffer create_buffer;
219*61046927SAndroid Build Coastguard Worker    u_trace_delete_buffer delete_buffer;
220*61046927SAndroid Build Coastguard Worker    u_trace_capture_data capture_data;
221*61046927SAndroid Build Coastguard Worker    u_trace_get_data get_data;
222*61046927SAndroid Build Coastguard Worker    u_trace_record_ts record_timestamp;
223*61046927SAndroid Build Coastguard Worker    u_trace_read_ts read_timestamp;
224*61046927SAndroid Build Coastguard Worker    u_trace_delete_flush_data delete_flush_data;
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker    uint64_t timestamp_size_bytes;
227*61046927SAndroid Build Coastguard Worker    uint64_t max_indirect_size_bytes;
228*61046927SAndroid Build Coastguard Worker 
229*61046927SAndroid Build Coastguard Worker    FILE *out;
230*61046927SAndroid Build Coastguard Worker    struct u_trace_printer *out_printer;
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker    /* Once u_trace_flush() is called u_trace_chunk's are queued up to
233*61046927SAndroid Build Coastguard Worker     * render tracepoints on a queue.  The per-chunk queue jobs block until
234*61046927SAndroid Build Coastguard Worker     * timestamps are available.
235*61046927SAndroid Build Coastguard Worker     */
236*61046927SAndroid Build Coastguard Worker    struct util_queue queue;
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker #ifdef HAVE_PERFETTO
239*61046927SAndroid Build Coastguard Worker    /* node in global list of trace contexts. */
240*61046927SAndroid Build Coastguard Worker    struct list_head node;
241*61046927SAndroid Build Coastguard Worker #endif
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker    /* State to accumulate time across N chunks associated with a single
244*61046927SAndroid Build Coastguard Worker     * batch (u_trace).
245*61046927SAndroid Build Coastguard Worker     */
246*61046927SAndroid Build Coastguard Worker    uint64_t last_time_ns;
247*61046927SAndroid Build Coastguard Worker    uint64_t first_time_ns;
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker    uint32_t frame_nr;
250*61046927SAndroid Build Coastguard Worker    uint32_t batch_nr;
251*61046927SAndroid Build Coastguard Worker    uint32_t event_nr;
252*61046927SAndroid Build Coastguard Worker    bool start_of_frame;
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker    void *dummy_indirect_data;
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker    /* list of unprocessed trace chunks in fifo order: */
257*61046927SAndroid Build Coastguard Worker    struct list_head flushed_trace_chunks;
258*61046927SAndroid Build Coastguard Worker };
259*61046927SAndroid Build Coastguard Worker 
260*61046927SAndroid Build Coastguard Worker /**
261*61046927SAndroid Build Coastguard Worker  * The u_trace ptr is passed as the first arg to generated tracepoints.
262*61046927SAndroid Build Coastguard Worker  * It provides buffering for tracepoint payload until the corresponding
263*61046927SAndroid Build Coastguard Worker  * driver cmdstream containing the emitted commands to capture is
264*61046927SAndroid Build Coastguard Worker  * flushed.
265*61046927SAndroid Build Coastguard Worker  *
266*61046927SAndroid Build Coastguard Worker  * Individual tracepoints emitted to u_trace are expected to be "executed"
267*61046927SAndroid Build Coastguard Worker  * (ie. timestamp captured) in FIFO order with respect to other tracepoints
268*61046927SAndroid Build Coastguard Worker  * emitted to the same u_trace.  But the order WRT other u_trace instances
269*61046927SAndroid Build Coastguard Worker  * is undefined util u_trace_flush().
270*61046927SAndroid Build Coastguard Worker  */
271*61046927SAndroid Build Coastguard Worker struct u_trace {
272*61046927SAndroid Build Coastguard Worker    struct u_trace_context *utctx;
273*61046927SAndroid Build Coastguard Worker 
274*61046927SAndroid Build Coastguard Worker    uint32_t num_traces;
275*61046927SAndroid Build Coastguard Worker 
276*61046927SAndroid Build Coastguard Worker    struct list_head
277*61046927SAndroid Build Coastguard Worker       trace_chunks; /* list of unflushed trace chunks in fifo order */
278*61046927SAndroid Build Coastguard Worker };
279*61046927SAndroid Build Coastguard Worker 
280*61046927SAndroid Build Coastguard Worker void u_trace_context_init(struct u_trace_context *utctx,
281*61046927SAndroid Build Coastguard Worker                           void *pctx,
282*61046927SAndroid Build Coastguard Worker                           uint32_t timestamp_size_bytes,
283*61046927SAndroid Build Coastguard Worker                           uint32_t max_indirect_size_bytes,
284*61046927SAndroid Build Coastguard Worker                           u_trace_create_buffer create_buffer,
285*61046927SAndroid Build Coastguard Worker                           u_trace_delete_buffer delete_buffer,
286*61046927SAndroid Build Coastguard Worker                           u_trace_record_ts record_timestamp,
287*61046927SAndroid Build Coastguard Worker                           u_trace_read_ts read_timestamp,
288*61046927SAndroid Build Coastguard Worker                           u_trace_capture_data capture_data,
289*61046927SAndroid Build Coastguard Worker                           u_trace_get_data get_data,
290*61046927SAndroid Build Coastguard Worker                           u_trace_delete_flush_data delete_flush_data);
291*61046927SAndroid Build Coastguard Worker void u_trace_context_fini(struct u_trace_context *utctx);
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker /**
294*61046927SAndroid Build Coastguard Worker  * Flush (trigger processing) of traces previously flushed to the
295*61046927SAndroid Build Coastguard Worker  * trace-context by u_trace_flush().
296*61046927SAndroid Build Coastguard Worker  *
297*61046927SAndroid Build Coastguard Worker  * This should typically be called in the driver's pctx->flush().
298*61046927SAndroid Build Coastguard Worker  */
299*61046927SAndroid Build Coastguard Worker void u_trace_context_process(struct u_trace_context *utctx, bool eof);
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker void u_trace_init(struct u_trace *ut, struct u_trace_context *utctx);
302*61046927SAndroid Build Coastguard Worker void u_trace_fini(struct u_trace *ut);
303*61046927SAndroid Build Coastguard Worker 
304*61046927SAndroid Build Coastguard Worker void u_trace_state_init(void);
305*61046927SAndroid Build Coastguard Worker bool u_trace_is_enabled(enum u_trace_type type);
306*61046927SAndroid Build Coastguard Worker 
307*61046927SAndroid Build Coastguard Worker bool u_trace_has_points(struct u_trace *ut);
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker struct u_trace_iterator {
310*61046927SAndroid Build Coastguard Worker    struct u_trace *ut;
311*61046927SAndroid Build Coastguard Worker    struct u_trace_chunk *chunk;
312*61046927SAndroid Build Coastguard Worker    uint32_t event_idx;
313*61046927SAndroid Build Coastguard Worker };
314*61046927SAndroid Build Coastguard Worker 
315*61046927SAndroid Build Coastguard Worker struct u_trace_iterator u_trace_begin_iterator(struct u_trace *ut);
316*61046927SAndroid Build Coastguard Worker 
317*61046927SAndroid Build Coastguard Worker struct u_trace_iterator u_trace_end_iterator(struct u_trace *ut);
318*61046927SAndroid Build Coastguard Worker 
319*61046927SAndroid Build Coastguard Worker bool u_trace_iterator_equal(struct u_trace_iterator a,
320*61046927SAndroid Build Coastguard Worker                             struct u_trace_iterator b);
321*61046927SAndroid Build Coastguard Worker 
322*61046927SAndroid Build Coastguard Worker typedef void (*u_trace_copy_buffer)(struct u_trace_context *utctx,
323*61046927SAndroid Build Coastguard Worker                                     void *cmdstream,
324*61046927SAndroid Build Coastguard Worker                                     void *ts_from,
325*61046927SAndroid Build Coastguard Worker                                     uint64_t from_offset,
326*61046927SAndroid Build Coastguard Worker                                     void *ts_to,
327*61046927SAndroid Build Coastguard Worker                                     uint64_t to_offset,
328*61046927SAndroid Build Coastguard Worker                                     uint64_t size_B);
329*61046927SAndroid Build Coastguard Worker 
330*61046927SAndroid Build Coastguard Worker /**
331*61046927SAndroid Build Coastguard Worker  * Clones tracepoints range into target u_trace.
332*61046927SAndroid Build Coastguard Worker  * Provides callback for driver to copy timestamps on GPU from
333*61046927SAndroid Build Coastguard Worker  * one buffer to another.
334*61046927SAndroid Build Coastguard Worker  *
335*61046927SAndroid Build Coastguard Worker  * It allows:
336*61046927SAndroid Build Coastguard Worker  * - Tracing re-usable command buffer in Vulkan, by copying tracepoints
337*61046927SAndroid Build Coastguard Worker  *   each time it is submitted.
338*61046927SAndroid Build Coastguard Worker  * - Per-tile tracing for tiling GPUs, by copying a range of tracepoints
339*61046927SAndroid Build Coastguard Worker  *   corresponding to a tile.
340*61046927SAndroid Build Coastguard Worker  */
341*61046927SAndroid Build Coastguard Worker void u_trace_clone_append(struct u_trace_iterator begin_it,
342*61046927SAndroid Build Coastguard Worker                           struct u_trace_iterator end_it,
343*61046927SAndroid Build Coastguard Worker                           struct u_trace *into,
344*61046927SAndroid Build Coastguard Worker                           void *cmdstream,
345*61046927SAndroid Build Coastguard Worker                           u_trace_copy_buffer copy_buffer);
346*61046927SAndroid Build Coastguard Worker 
347*61046927SAndroid Build Coastguard Worker void u_trace_disable_event_range(struct u_trace_iterator begin_it,
348*61046927SAndroid Build Coastguard Worker                                  struct u_trace_iterator end_it);
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker #define U_TRACE_FRAME_UNKNOWN -1
351*61046927SAndroid Build Coastguard Worker /**
352*61046927SAndroid Build Coastguard Worker  * Flush traces to the parent trace-context.  At this point, the expectation
353*61046927SAndroid Build Coastguard Worker  * is that all the tracepoints are "executed" by the GPU following any
354*61046927SAndroid Build Coastguard Worker  * previously flushed u_trace batch.
355*61046927SAndroid Build Coastguard Worker  *
356*61046927SAndroid Build Coastguard Worker  * flush_data is a way for driver to pass additional data, which becomes
357*61046927SAndroid Build Coastguard Worker  * available only at the point of flush, to the u_trace_read_ts callback and
358*61046927SAndroid Build Coastguard Worker  * perfetto. The typical example of such data would be a fence to wait on in
359*61046927SAndroid Build Coastguard Worker  * u_trace_read_ts, and a submission_id to pass into perfetto. The destruction
360*61046927SAndroid Build Coastguard Worker  * of the data is done via u_trace_delete_flush_data.
361*61046927SAndroid Build Coastguard Worker  *
362*61046927SAndroid Build Coastguard Worker  * This should typically be called when the corresponding cmdstream
363*61046927SAndroid Build Coastguard Worker  * (containing the timestamp reads) is flushed to the kernel.
364*61046927SAndroid Build Coastguard Worker  */
365*61046927SAndroid Build Coastguard Worker void u_trace_flush(struct u_trace *ut,
366*61046927SAndroid Build Coastguard Worker                    void *flush_data,
367*61046927SAndroid Build Coastguard Worker                    uint32_t frame_nr,
368*61046927SAndroid Build Coastguard Worker                    bool free_data);
369*61046927SAndroid Build Coastguard Worker 
370*61046927SAndroid Build Coastguard Worker #ifdef HAVE_PERFETTO
371*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE bool
u_trace_perfetto_active(struct u_trace_context * utctx)372*61046927SAndroid Build Coastguard Worker u_trace_perfetto_active(struct u_trace_context *utctx)
373*61046927SAndroid Build Coastguard Worker {
374*61046927SAndroid Build Coastguard Worker    return p_atomic_read_relaxed(&utctx->enabled_traces) &
375*61046927SAndroid Build Coastguard Worker           U_TRACE_TYPE_PERFETTO_ACTIVE;
376*61046927SAndroid Build Coastguard Worker }
377*61046927SAndroid Build Coastguard Worker 
378*61046927SAndroid Build Coastguard Worker void u_trace_perfetto_start(void);
379*61046927SAndroid Build Coastguard Worker void u_trace_perfetto_stop(void);
380*61046927SAndroid Build Coastguard Worker #else
381*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE bool
u_trace_perfetto_active(UNUSED struct u_trace_context * utctx)382*61046927SAndroid Build Coastguard Worker u_trace_perfetto_active(UNUSED struct u_trace_context *utctx)
383*61046927SAndroid Build Coastguard Worker {
384*61046927SAndroid Build Coastguard Worker    return false;
385*61046927SAndroid Build Coastguard Worker }
386*61046927SAndroid Build Coastguard Worker #endif
387*61046927SAndroid Build Coastguard Worker 
388*61046927SAndroid Build Coastguard Worker /**
389*61046927SAndroid Build Coastguard Worker  * Return whether utrace is enabled at all or not, this can be used to
390*61046927SAndroid Build Coastguard Worker  * gate any expensive traces.
391*61046927SAndroid Build Coastguard Worker  */
392*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE bool
u_trace_enabled(struct u_trace_context * utctx)393*61046927SAndroid Build Coastguard Worker u_trace_enabled(struct u_trace_context *utctx)
394*61046927SAndroid Build Coastguard Worker {
395*61046927SAndroid Build Coastguard Worker    return p_atomic_read_relaxed(&utctx->enabled_traces) != 0;
396*61046927SAndroid Build Coastguard Worker }
397*61046927SAndroid Build Coastguard Worker 
398*61046927SAndroid Build Coastguard Worker /**
399*61046927SAndroid Build Coastguard Worker  * Return whether chunks should be processed or not.
400*61046927SAndroid Build Coastguard Worker  */
401*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE bool
u_trace_should_process(struct u_trace_context * utctx)402*61046927SAndroid Build Coastguard Worker u_trace_should_process(struct u_trace_context *utctx)
403*61046927SAndroid Build Coastguard Worker {
404*61046927SAndroid Build Coastguard Worker    return p_atomic_read_relaxed(&utctx->enabled_traces) &
405*61046927SAndroid Build Coastguard Worker           U_TRACE_TYPE_REQUIRE_PROCESSING;
406*61046927SAndroid Build Coastguard Worker }
407*61046927SAndroid Build Coastguard Worker 
408*61046927SAndroid Build Coastguard Worker /**
409*61046927SAndroid Build Coastguard Worker  * Return whether to emit markers into the command stream even if the queue
410*61046927SAndroid Build Coastguard Worker  * isn't active.
411*61046927SAndroid Build Coastguard Worker  */
412*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE bool
u_trace_markers_enabled(struct u_trace_context * utctx)413*61046927SAndroid Build Coastguard Worker u_trace_markers_enabled(struct u_trace_context *utctx)
414*61046927SAndroid Build Coastguard Worker {
415*61046927SAndroid Build Coastguard Worker    return p_atomic_read_relaxed(&utctx->enabled_traces) &
416*61046927SAndroid Build Coastguard Worker           U_TRACE_TYPE_MARKERS;
417*61046927SAndroid Build Coastguard Worker }
418*61046927SAndroid Build Coastguard Worker 
419*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
420*61046927SAndroid Build Coastguard Worker }
421*61046927SAndroid Build Coastguard Worker #endif
422*61046927SAndroid Build Coastguard Worker 
423*61046927SAndroid Build Coastguard Worker #endif /* _U_TRACE_H */
424