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 Workerutil_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 Workerutil_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 Workerutil_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 Workerutil_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 }