Monado OpenXR Runtime
u_trace_marker.h
Go to the documentation of this file.
1// Copyright 2020-2022, Collabora, Ltd.
2// Copyright 2024-2025, NVIDIA CORPORATION.
3// SPDX-License-Identifier: BSL-1.0
4/*!
5 * @file
6 * @brief Tracing support code, see @ref tracing.
7 * @author Jakob Bornecrantz <jakob@collabora.com>
8 * @ingroup aux_util
9 */
10
11#pragma once
12
13#include "xrt/xrt_compiler.h"
14#include "xrt/xrt_config_os.h"
15#include "xrt/xrt_config_have.h"
16#include "xrt/xrt_config_build.h" // IWYU pragma: keep
17
18#include <stdio.h>
19
20#if defined(XRT_FEATURE_TRACING) && defined(XRT_HAVE_PERCETTO)
21#define U_TRACE_PERCETTO
22#include <percetto.h>
23#endif
24
25#if !defined(XRT_FEATURE_TRACING) || !defined(XRT_HAVE_TRACY)
26#define U_TRACE_FUNC_COLOR(CATEGORY, COLOR) \
27 (void)COLOR; \
28 U_TRACE_FUNC(CATEGORY)
29
30#define U_TRACE_IDENT_COLOR(CATEGORY, IDENT, COLOR) \
31 (void)COLOR; \
32 U_TRACE_IDENT(CATEGORY, IDENT)
33
34#define U_TRACE_BEGIN_COLOR(CATEGORY, IDENT, COLOR) \
35 (void)COLOR; \
36 U_TRACE_BEGIN(CATEGORY, IDENT)
37#endif
38
39#if defined(XRT_FEATURE_TRACING) && defined(XRT_HAVE_TRACY)
40#ifndef TRACY_ENABLE
41#define TRACY_ENABLE
42#endif // TRACY_ENABLE
43#define U_TRACE_TRACY
44#include "tracy/TracyC.h"
45#ifdef __cplusplus
46#include "tracy/Tracy.hpp"
47#endif
48#endif
49
50
51#ifdef __cplusplus
52extern "C" {
53#endif
54
55/*!
56 * Should the extra tracks be enabled, see @ref tracing.
57 *
58 * @ingroup aux_util
59 */
61{
62 U_TRACE_WHICH_SERVICE,
63 U_TRACE_WHICH_OPENXR,
64};
65
66/*!
67 * Internal setup function, use @ref U_TRACE_TARGET_SETUP, see @ref tracing.
68 *
69 * @ingroup aux_util
70 */
71void
73
74/*!
75 * Must be called from a non-static/global constructor context.
76 *
77 * @ingroup aux_util
78 */
79void
81
82#define COLOR_TRACE_MARKER(COLOR) U_TRACE_FUNC_COLOR(color, COLOR)
83#define COLOR_TRACE_IDENT(IDENT, COLOR) U_TRACE_IDENT_COLOR(color, IDENT, COLOR)
84#define COLOR_TRACE_BEGIN(IDENT, COLOR) U_TRACE_BEGIN_COLOR(color, IDENT, COLOR)
85#define COLOR_TRACE_END(IDENT) U_TRACE_END(color, IDENT)
86
87#define VK_TRACE_MARKER() U_TRACE_FUNC_COLOR(vk, 0xffffff)
88#define VK_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(vk, IDENT, 0xffffff)
89#define VK_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(vk, IDENT, 0xffffff)
90#define VK_TRACE_END(IDENT) U_TRACE_END(vk, IDENT)
91// Markers for sub-zones within a Vulkan marked zone.
92#define VK_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x491556)
93#define VK_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x324ff2)
94#define VK_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xabc9c8)
95#define VK_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xc12a8a)
96
97#define XRT_TRACE_MARKER() U_TRACE_FUNC_COLOR(xrt, 0x708090)
98#define XRT_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(xrt, IDENT, 0x708090)
99#define XRT_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(xrt, IDENT, 0x708090)
100#define XRT_TRACE_END(IDENT) U_TRACE_END(xrt, IDENT)
101// Markers for sub-zones within a driver marked zone.
102#define XRT_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x1e1447)
103#define XRT_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x404444)
104#define XRT_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x0c080b)
105#define XRT_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xeff9d6)
106
107#define DRV_TRACE_MARKER() U_TRACE_FUNC_COLOR(drv, 0x000080)
108#define DRV_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(drv, IDENT, 0x000080)
109#define DRV_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(drv, IDENT, 0x000080)
110#define DRV_TRACE_END(IDENT) U_TRACE_END(drv, IDENT)
111// Markers for sub-zones within a driver marked zone.
112#define DRV_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x000107)
113#define DRV_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xc9bad3)
114#define DRV_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x1bb4ba)
115#define DRV_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x05080a)
116
117#define IPC_TRACE_MARKER() U_TRACE_FUNC_COLOR(ipc, 0x87cefa)
118#define IPC_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(ipc, IDENT, 0x87cefa)
119#define IPC_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(ipc, IDENT, 0x87cefa)
120#define IPC_TRACE_END(IDENT) U_TRACE_END(ipc, IDENT)
121// Markers for sub-zones within a IPC marked zone.
122#define IPC_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xc934d3)
123#define IPC_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x010f05)
124#define IPC_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x050707)
125#define IPC_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x0c0108)
126
127#define OXR_TRACE_MARKER() U_TRACE_FUNC_COLOR(oxr, 0x7fffd4)
128#define OXR_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(oxr, IDENT, 0x7fffd4)
129#define OXR_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(oxr, IDENT, 0x7fffd4)
130#define OXR_TRACE_END(IDENT) U_TRACE_END(oxr, IDENT, 0x7fffd4)
131// Markers for sub-zones within a OpenXR marked zone.
132#define OXR_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xb06044)
133#define OXR_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xe8e7e5)
134#define OXR_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x135584)
135#define OXR_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x20eac5)
136
137#define COMP_TRACE_MARKER() U_TRACE_FUNC_COLOR(comp, 0x00ff00)
138#define COMP_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x00ff00)
139#define COMP_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(comp, IDENT, 0x00ff00)
140#define COMP_TRACE_END(IDENT) U_TRACE_END(comp, IDENT)
141// Markers for sub-zones within a compositor marked zone.
142#define COMP_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xff2312)
143#define COMP_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x2312ff)
144#define COMP_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x33a012)
145#define COMP_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x88a0d2)
146
147#define SINK_TRACE_MARKER() U_TRACE_FUNC_COLOR(sink, 0xffa500)
148#define SINK_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(sink, IDENT, 0xffa500)
149#define SINK_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(sink, IDENT, 0xffa500)
150#define SINK_TRACE_END(IDENT) U_TRACE_END(sink, IDENT)
151// Markers for sub-zones within a sink marked zone.
152#define SINK_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x898368)
153#define SINK_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x026d09)
154#define SINK_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xa6eda1)
155#define SINK_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x233f93)
156
157#define SWAPCHAIN_TRACE_MARKER() U_TRACE_FUNC_COLOR(sc, 0x007700)
158#define SWAPCHAIN_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(sc, IDENT, 0x007700)
159#define SWAPCHAIN_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(sc, IDENT, 0x007700)
160#define SWAPCHAIN_TRACE_END(IDENT) U_TRACE_END(sc, IDENT)
161// Markers for sub-zones within a swap chain marked zone.
162#define SWAPCHAIN_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xa4a4f2)
163#define SWAPCHAIN_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x376349)
164#define SWAPCHAIN_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xa0766a)
165#define SWAPCHAIN_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xacdce0)
166
167#define TRACK_TRACE_MARKER() U_TRACE_FUNC_COLOR(track, 0xff0000)
168#define TRACK_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(track, IDENT, 0xff0000)
169#define TRACK_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(track, IDENT, 0xff0000)
170#define TRACK_TRACE_END(IDENT) U_TRACE_END(track, IDENT, 0xff0000)
171// Markers for sub-zones within a track marked zone.
172#define TRACK_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x384949)
173#define TRACK_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x373d1e)
174#define TRACK_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x053d37)
175#define TRACK_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x0b223f)
176
177
178/*
179 *
180 * When disabled.
181 *
182 */
183
184#ifndef XRT_FEATURE_TRACING
185
186
187#define U_TRACE_FUNC(CATEGORY) \
188 do { \
189 } while (false)
190
191#define U_TRACE_IDENT(CATEGORY, IDENT) \
192 do { \
193 } while (false)
194
195#define U_TRACE_BEGIN(CATEGORY, IDENT) \
196 int __trace_##IDENT = 0; /* To ensure they are balanced */ \
197 do { \
198 } while (false)
199
200#define U_TRACE_END(CATEGORY, IDENT) \
201 do { \
202 (void)__trace_##IDENT; /* To ensure they are balanced */ \
203 } while (false)
204
205#define U_TRACE_EVENT_BEGIN_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
206 do { \
207 } while (false)
208
209#define U_TRACE_EVENT_BEGIN_ON_TRACK_DATA(CATEGORY, TRACK, TIME, NAME, ...) \
210 do { \
211 } while (false)
212
213#define U_TRACE_EVENT_END_ON_TRACK(CATEGORY, TRACK, TIME) \
214 do { \
215 } while (false)
216
217#define U_TRACE_INSTANT_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
218 do { \
219 } while (false)
220
221#define U_TRACE_CATEGORY_IS_ENABLED(_) (false)
222
223#define U_TRACE_SET_THREAD_NAME(STRING) \
224 do { \
225 (void)STRING; \
226 } while (false)
227
228/*!
229 * Add to target c file to enable tracing, see @ref tracing.
230 *
231 * @ingroup aux_util
232 */
233#define U_TRACE_TARGET_SETUP(WHICH)
234
235
236/*
237 *
238 * Tracy support.
239 *
240 */
241
242#elif defined(XRT_HAVE_TRACY) // && XRT_FEATURE_TRACING
243
244// Different wrappers for different cases.
245#ifdef __cplusplus
246
247#define U_TRACE_FUNC_COLOR(CATEGORY, COLOR) ZoneScopedC(COLOR)
248
249#define U_TRACE_FUNC(CATEGORY) ZoneScoped
250
251#define U_TRACE_IDENT_COLOR(CATEGORY, IDENT, COLOR) ZoneScopedNC(#IDENT, COLOR)
252
253#define U_TRACE_IDENT(CATEGORY, IDENT) ZoneScopedN(#IDENT)
254
255#elif !defined(XRT_OS_WINDOWS) || defined(__clang__) // !__cplusplus
256
257static inline void
258u_trace_scope_cleanup(TracyCZoneCtx *ctx_ptr)
259{
260 TracyCZoneEnd(*ctx_ptr);
261}
262
263#define U_TRACE_FUNC_COLOR(CATEGORY, COLOR) \
264 static const struct ___tracy_source_location_data __func_loc = { \
265 NULL, __func__, __FILE__, (uint32_t)__LINE__, COLOR, \
266 }; \
267 TracyCZoneCtx __attribute__((cleanup(u_trace_scope_cleanup))) ctx = \
268 ___tracy_emit_zone_begin(&__func_loc, true); \
269 (void)ctx
270
271
272#define U_TRACE_FUNC(CATEGORY) \
273 static const struct ___tracy_source_location_data __func_loc = { \
274 NULL, __func__, __FILE__, (uint32_t)__LINE__, 0, \
275 }; \
276 TracyCZoneCtx __attribute__((cleanup(u_trace_scope_cleanup))) ctx = \
277 ___tracy_emit_zone_begin(&__func_loc, true); \
278 (void)ctx
279
280#define U_TRACE_IDENT_COLOR(CATEGORY, IDENT, COLOR) \
281 static const struct ___tracy_source_location_data __##IDENT##_loc = { \
282 #IDENT, __func__, __FILE__, (uint32_t)__LINE__, COLOR, \
283 }; \
284 TracyCZoneCtx __attribute__((cleanup(u_trace_scope_cleanup))) ctx##IDENT = \
285 ___tracy_emit_zone_begin(&__##IDENT##_loc, true); \
286 (void)ctx##IDENT
287
288#define U_TRACE_IDENT(CATEGORY, IDENT) \
289 static const struct ___tracy_source_location_data __##IDENT##_loc = { \
290 #IDENT, __func__, __FILE__, (uint32_t)__LINE__, 0, \
291 }; \
292 TracyCZoneCtx __attribute__((cleanup(u_trace_scope_cleanup))) ctx##IDENT = \
293 ___tracy_emit_zone_begin(&__##IDENT##_loc, true); \
294 (void)ctx##IDENT
295
296#else // !XRT_OS_WINDOWS && !__cplusplus
297#define U_TRACE_FUNC_COLOR(CATEGORY, COLOR) \
298 do { \
299 } while (false)
300
301#define U_TRACE_FUNC(CATEGORY) \
302 do { \
303 } while (false)
304
305#define U_TRACE_IDENT_COLOR(CATEGORY, IDENT, COLOR) \
306 do { \
307 } while (false)
308
309#define U_TRACE_IDENT(CATEGORY, IDENT) \
310 do { \
311 } while (false)
312
313#endif // !XRT_OS_WINDOWS && !__cplusplus
314
315#define U_TRACE_BEGIN(CATEGORY, IDENT) TracyCZoneN(__trace_##IDENT, #IDENT, true)
316#define U_TRACE_BEGIN_COLOR(CATEGORY, IDENT, COLOR) TracyCZoneNC(__trace_##IDENT, #IDENT, COLOR, true)
317#define U_TRACE_END(CATEGORY, IDENT) TracyCZoneEnd(__trace_##IDENT)
318
319#define U_TRACE_EVENT_BEGIN_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
320 do { \
321 } while (false)
322
323#define U_TRACE_EVENT_BEGIN_ON_TRACK_DATA(CATEGORY, TRACK, TIME, NAME, ...) \
324 do { \
325 } while (false)
326
327#define U_TRACE_EVENT_END_ON_TRACK(CATEGORY, TRACK, TIME) \
328 do { \
329 } while (false)
330
331#define U_TRACE_INSTANT_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
332 do { \
333 } while (false)
334
335#define U_TRACE_CATEGORY_IS_ENABLED(_) (true) // All categories are always enabled with Tracy.
336
337#define U_TRACE_SET_THREAD_NAME(STRING) \
338 do { \
339 /* To help with thread ordering and seeing when a thread is created. */ \
340 TracyCZoneN(created, "created", true); \
341 TracyCSetThreadName(STRING); \
342 TracyCZoneEnd(created); \
343 } while (false)
344
345#define U_TRACE_TARGET_SETUP(WHICH)
346
347
348/*
349 *
350 * Percetto support.
351 *
352 */
353
354#elif defined(XRT_HAVE_PERCETTO) // && XRT_FEATURE_TRACKING && !XRT_HAVE_TRACY
355
356#ifndef XRT_OS_LINUX
357#error "Tracing only supported on Linux"
358#endif
359
360
361#define U_TRACE_CATEGORIES(C, G) \
362 C(vk, "vk") /* Vulkan calls */ \
363 C(xrt, "xrt") /* Misc XRT calls */ \
364 C(drv, "drv") /* Driver calls */ \
365 C(ipc, "ipc") /* IPC calls */ \
366 C(oxr, "st/oxr") /* OpenXR State Tracker calls */ \
367 C(sink, "sink") /* Sink/frameserver calls */ \
368 C(comp, "comp") /* Compositor calls */ \
369 C(sc, "sc") /* Swapchain calls */ \
370 C(track, "track") /* Tracking calls */ \
371 C(timing, "timing") /* Timing calls */
372
373PERCETTO_CATEGORY_DECLARE(U_TRACE_CATEGORIES)
374
375PERCETTO_TRACK_DECLARE(pc_cpu);
376PERCETTO_TRACK_DECLARE(pc_allotted);
377PERCETTO_TRACK_DECLARE(pc_gpu);
378PERCETTO_TRACK_DECLARE(pc_margin);
379PERCETTO_TRACK_DECLARE(pc_error);
380PERCETTO_TRACK_DECLARE(pc_info);
381PERCETTO_TRACK_DECLARE(pc_present);
382PERCETTO_TRACK_DECLARE(pa_cpu);
383PERCETTO_TRACK_DECLARE(pa_draw);
384PERCETTO_TRACK_DECLARE(pa_wait);
385
386#define U_TRACE_FUNC(CATEGORY) TRACE_EVENT(CATEGORY, __func__)
387#define U_TRACE_IDENT(CATEGORY, IDENT) TRACE_EVENT(CATEGORY, #IDENT)
388#define U_TRACE_BEGIN(CATEGORY, IDENT) TRACE_EVENT_BEGIN(CATEGORY, #IDENT)
389#define U_TRACE_END(CATEGORY, IDENT) TRACE_EVENT_END(CATEGORY)
390#define U_TRACE_EVENT_BEGIN_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
391 TRACE_EVENT_BEGIN_ON_TRACK(CATEGORY, TRACK, TIME, NAME)
392#define U_TRACE_EVENT_BEGIN_ON_TRACK_DATA(CATEGORY, TRACK, TIME, NAME, ...) \
393 TRACE_EVENT_BEGIN_ON_TRACK_DATA(CATEGORY, TRACK, TIME, NAME, __VA_ARGS__)
394#define U_TRACE_EVENT_END_ON_TRACK(CATEGORY, TRACK, TIME) TRACE_EVENT_END_ON_TRACK(CATEGORY, TRACK, TIME)
395#define U_TRACE_CATEGORY_IS_ENABLED(CATEGORY) PERCETTO_CATEGORY_IS_ENABLED(CATEGORY)
396#define U_TRACE_INSTANT_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
397 TRACE_ANY_WITH_ARGS(PERCETTO_EVENT_INSTANT, CATEGORY, &g_percetto_track_##TRACK, TIME, NAME, 0)
398#define U_TRACE_DATA(fd, type, data) u_trace_data(fd, type, (void *)&(data), sizeof(data))
399
400#define U_TRACE_SET_THREAD_NAME(STRING) \
401 do { \
402 (void)STRING; \
403 } while (false)
404
405#define U_TRACE_TARGET_SETUP(WHICH) \
406 void __attribute__((constructor(101))) u_trace_marker_constructor(void); \
407 \
408 void u_trace_marker_constructor(void) \
409 { \
410 u_trace_marker_setup(WHICH); \
411 }
412
413#else // !XRT_FEATURE_TRACING && !XRT_HAVE_PERCETTO && !XRT_HAVE_TRACY
414
415#error "Need to have Percetto/Perfetto"
416
417#endif // Error checking
418
419
420#ifdef __cplusplus
421}
422#endif
u_trace_which
Should the extra tracks be enabled, see Tracing support.
Definition: u_trace_marker.h:61
void u_trace_marker_setup(enum u_trace_which which)
Internal setup function, use U_TRACE_TARGET_SETUP, see Tracing support.
Definition: u_trace_marker.c:95
void u_trace_marker_init(void)
Must be called from a non-static/global constructor context.
Definition: u_trace_marker.c:103
Header holding common defines.
Auto detect OS and certain features.