$darkmode
Suckless OGL 1.0.0
A lean, high-performance C11 PBR Renderer
perf_timer.h
Go to the documentation of this file.
1 
10 #ifndef PERF_TIMER_H
11 #define PERF_TIMER_H
12 
13 #include "gl_common.h"
14 #include <time.h>
15 
23 typedef struct {
24  struct timespec start;
25  struct timespec end;
26 } PerfTimer;
27 
34 typedef struct {
35  GLuint query_start;
36  GLuint query_end;
37  int active;
38 } GPUTimer;
39 
40 #ifdef TRACY_ENABLE
41 #include <tracy/TracyC.h>
42 #endif
43 
48 typedef struct {
51 #ifdef TRACY_ENABLE
52  TracyCZoneCtx tracy_ctx;
53  TracyCZoneCtx host_ctx;
54 #endif
55 } HybridTimer;
56 
57 /* ========================================================================= */
58 /* CPU Timer API */
59 /* ========================================================================= */
60 
65 void perf_timer_start(PerfTimer* timer);
66 
72 double perf_timer_elapsed_ms(PerfTimer* timer);
73 
79 double perf_timer_elapsed_us(PerfTimer* timer);
80 
86 double perf_timer_elapsed_s(PerfTimer* timer);
87 
88 /* ========================================================================= */
89 /* GPU Timer API */
90 /* ========================================================================= */
91 
96 void gpu_timer_start(GPUTimer* timer);
97 
103 
112 double gpu_timer_elapsed_ms(GPUTimer* timer, int wait_for_result);
113 
118 void gpu_timer_cleanup(GPUTimer* timer);
119 
120 /* ========================================================================= */
121 /* Hybrid Timer API */
122 /* ========================================================================= */
123 
129 
135 void perf_hybrid_stop(HybridTimer* timer, const char* label);
136 
147 double perf_hybrid_stop_debug(HybridTimer* timer, const char* label);
148 
149 /* ========================================================================= */
150 /* Macro Helpers */
151 /* ========================================================================= */
152 
164 #define PERF_MEASURE_MS(var_name) \
165  double var_name = 0.0; \
166  for (PerfTimer \
167  _timer##var_name = {0}, \
168  *_run = (perf_timer_start(&_timer##var_name), (PerfTimer*)1); \
169  _run; \
170  var_name = perf_timer_elapsed_ms(&_timer##var_name), _run = NULL)
171 
175 #define PERF_MEASURE_LOG(label) \
176  for (PerfTimer _timer = {0}, \
177  *_run = (perf_timer_start(&_timer), (PerfTimer*)1); \
178  _run; LOG_INFO("perf", "%s: %.2f ms", label, \
179  perf_timer_elapsed_ms(&_timer)), \
180  _run = NULL)
181 
185 #define GPU_MEASURE_MS(var_name) \
186  double var_name = 0.0; \
187  for (GPUTimer _gpu_timer##var_name = {0}, \
188  *_gpu_run = (gpu_timer_start(&_gpu_timer##var_name), \
189  (GPUTimer*)1); \
190  _gpu_run; \
191  var_name = gpu_timer_elapsed_ms(&_gpu_timer##var_name, 1), \
192  gpu_timer_cleanup(&_gpu_timer##var_name), \
193  _gpu_run = NULL)
194 
198 #define GPU_MEASURE_LOG(label) \
199  for (GPUTimer \
200  _gpu_timer = {0}, \
201  *_gpu_run = (gpu_timer_start(&_gpu_timer), (GPUTimer*)1); \
202  _gpu_run; LOG_INFO("perf.gpu", "%s: %.2f ms", label, \
203  gpu_timer_elapsed_ms(&_gpu_timer, 1)), \
204  gpu_timer_cleanup(&_gpu_timer), _gpu_run = NULL)
205 
210 #define HYBRID_MEASURE_LOG(label) \
211  for (HybridTimer _h = perf_hybrid_start(), *_h_run = (HybridTimer*)1; \
212  _h_run; perf_hybrid_stop(&_h, label), _h_run = NULL)
213 
228 #define HYBRID_MEASURE_DEBUG_MS(var_name, label) \
229  double var_name = 0.0; \
230  for (HybridTimer _h##var_name = perf_hybrid_start(), \
231  *_h_run = (HybridTimer*)1; \
232  _h_run; var_name = perf_hybrid_stop_debug(&_h##var_name, label), \
233  _h_run = NULL)
234 
239 typedef struct {
241  const char* label;
243 
245 static inline void hybrid_timer_cleanup_raii(HybridTimerRAII* timer_raii)
246 {
247  perf_hybrid_stop(&timer_raii->timer, timer_raii->label);
248 }
249 
261 #define HYBRID_FUNC_TIMER(label) \
262  HybridTimerRAII _h_raii \
263  __attribute__((cleanup(hybrid_timer_cleanup_raii))) \
264  __attribute__((unused)) = {perf_hybrid_start(), label}
265 
266 #endif /* PERF_TIMER_H */
Common OpenGL definitions, RAII helpers, and utilities.
double perf_timer_elapsed_ms(PerfTimer *timer)
Stops the timer and returns elapsed time in milliseconds.
Definition: perf_timer.c:39
void perf_hybrid_stop(HybridTimer *timer, const char *label)
Stops both measurements and logs the results to the console.
Definition: perf_timer.c:289
double perf_timer_elapsed_s(PerfTimer *timer)
Stops the timer and returns elapsed time in seconds.
Definition: perf_timer.c:71
double perf_timer_elapsed_us(PerfTimer *timer)
Stops the timer and returns elapsed time in microseconds.
Definition: perf_timer.c:55
double gpu_timer_elapsed_ms(GPUTimer *timer, int wait_for_result)
Stops the GPU timer and retrieves the result.
Definition: perf_timer.c:110
void perf_timer_start(PerfTimer *timer)
Starts the CPU timer.
Definition: perf_timer.c:30
HybridTimer perf_hybrid_start(void)
Starts both CPU and GPU measurement simultaneously.
Definition: perf_timer.c:212
void gpu_timer_stop(GPUTimer *timer)
Explicitly stops the GPU timer (records end timestamp).
static void hybrid_timer_cleanup_raii(HybridTimerRAII *timer_raii)
Internal cleanup function for HybridTimerRAII.
Definition: perf_timer.h:245
void gpu_timer_start(GPUTimer *timer)
Initializes and starts a GPU measurement.
Definition: perf_timer.c:91
void gpu_timer_cleanup(GPUTimer *timer)
Releases OpenGL resources associated with the GPU timer.
Definition: perf_timer.c:164
double perf_hybrid_stop_debug(HybridTimer *timer, const char *label)
Like perf_hybrid_stop, but logs at DEBUG level instead of INFO.
Definition: perf_timer.c:298
GPU performance timer using OpenGL Query Objects.
Definition: perf_timer.h:34
int active
Definition: perf_timer.h:37
GLuint query_end
Definition: perf_timer.h:36
GLuint query_start
Definition: perf_timer.h:35
Internal helper for scope-based timing.
Definition: perf_timer.h:239
const char * label
Definition: perf_timer.h:241
HybridTimer timer
Definition: perf_timer.h:240
Hybrid timer combining CPU and GPU measurements.
Definition: perf_timer.h:48
PerfTimer cpu
Definition: perf_timer.h:49
GPUTimer gpu
Definition: perf_timer.h:50
CPU high-precision timer.
Definition: perf_timer.h:23