xref: /aosp_15_r20/external/mesa3d/src/util/perf/u_gpuvis.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2023 Bas Nieuwenhuizen
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include "u_gpuvis.h"
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include <threads.h>
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #define GPUVIS_TRACE_IMPLEMENTATION
11*61046927SAndroid Build Coastguard Worker #include "gpuvis_trace_utils.h"
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker /* Random base value to prevent collisions. As contexts are considered thread
14*61046927SAndroid Build Coastguard Worker  * global by gpuvis, collisions are quite likely if we start at 0 and there
15*61046927SAndroid Build Coastguard Worker  * are independent libraries tacing
16*61046927SAndroid Build Coastguard Worker  */
17*61046927SAndroid Build Coastguard Worker static unsigned int gpuvis_base_ctx;
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker static _Thread_local unsigned int gpuvis_current_ctx;
20*61046927SAndroid Build Coastguard Worker 
21*61046927SAndroid Build Coastguard Worker static once_flag gpuvis_once_flag = ONCE_FLAG_INIT;
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker static void
util_gpuvis_init_once()24*61046927SAndroid Build Coastguard Worker util_gpuvis_init_once()
25*61046927SAndroid Build Coastguard Worker {
26*61046927SAndroid Build Coastguard Worker    gpuvis_trace_init();
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker    /* Initialize it by address to avoid collisions between libraries using
29*61046927SAndroid Build Coastguard Worker     * this code (e.g. GL & vulkan) */
30*61046927SAndroid Build Coastguard Worker    gpuvis_base_ctx = (uintptr_t) util_gpuvis_init_once >> 12;
31*61046927SAndroid Build Coastguard Worker }
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker void
util_gpuvis_init(void)34*61046927SAndroid Build Coastguard Worker util_gpuvis_init(void)
35*61046927SAndroid Build Coastguard Worker {
36*61046927SAndroid Build Coastguard Worker    call_once(&gpuvis_once_flag, util_gpuvis_init_once);
37*61046927SAndroid Build Coastguard Worker }
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker void
util_gpuvis_begin(const char * name)40*61046927SAndroid Build Coastguard Worker util_gpuvis_begin(const char *name)
41*61046927SAndroid Build Coastguard Worker {
42*61046927SAndroid Build Coastguard Worker    unsigned int ctx = gpuvis_base_ctx + ++gpuvis_current_ctx;
43*61046927SAndroid Build Coastguard Worker    gpuvis_trace_begin_ctx_printf(ctx, "mesa:%s", name);
44*61046927SAndroid Build Coastguard Worker }
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker void
util_gpuvis_end(void)47*61046927SAndroid Build Coastguard Worker util_gpuvis_end(void)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker    unsigned int ctx = gpuvis_base_ctx + gpuvis_current_ctx--;
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker    /* Use an empty string to avoid warnings about an empty format string. */
52*61046927SAndroid Build Coastguard Worker    gpuvis_trace_end_ctx_printf(ctx, "%s", "");
53*61046927SAndroid Build Coastguard Worker }