Monado OpenXR Runtime
Loading...
Searching...
No Matches
u_var.h
Go to the documentation of this file.
1// Copyright 2019-2024, Collabora, Ltd.
2// Copyright 2024-2025, NVIDIA CORPORATION.
3// SPDX-License-Identifier: BSL-1.0
4/*!
5 * @file
6 * @brief Variable tracking code.
7 * @author Jakob Bornecrantz <jakob@collabora.com>
8 * @ingroup aux_util
9 */
10
11#pragma once
12
13#include "xrt/xrt_defines.h" // IWYU pragma: keep
14
15#include "util/u_logging.h"
16
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22
23struct xrt_frame_sink;
24struct u_sink_debug;
26struct m_ff_f64;
27struct m_ff_vec3_f32;
28
29/*!
30 * Used to plot an array for values.
31 *
32 * @ingroup aux_util
33 */
35{
36 void *data;
37 int *index_ptr;
38 int length;
39};
40
42{
43 void *data;
44 int length;
45};
46
47/*!
48 * Used to plot a graph of timing information.
49 *
50 * @ingroup aux_util
51 */
53{
54 //! Values to be plotted.
56
57 //! A reference line drawn on the plot.
59
60 //! If false, reference_timing will be the bottom of the graph.
62
63 //! How many units the graph expands by default.
64 float range;
65
66 //! Rescale graph's value range when value exceeds range.
68
69 //! A string describing the unit used, not freed.
70 const char *unit;
71};
72
73/*!
74 * Callback for a button action
75 *
76 * @ingroup aux_util
77 */
78typedef void (*u_var_button_cb)(void *);
79
80/*!
81 * Simple pushable button.
82 *
83 * @ingroup aux_util
84 */
86{
87 //! Callback function to execute on button press
89
90 //! Pointer that will be passed to the function as its only argument
91 void *ptr;
92
93 /*!
94 * Is the pointer pressing down on the button curruently, this is not
95 * edge triggered like the callback. For a mouse this means that the
96 * pointer is hovering the button and the left is held down.
97 */
98 xrt_atomic_s32_t downed;
99
100 //! Button text, use var `name` if zeroed
101 char label[64];
102
103 //! Button dimensions, zero for auto size
104 float width;
105 float height;
106
107 //! Whether this button is disabled
109};
110
111/*!
112 * Combo box information.
113 *
114 * @ingroup aux_util
115 */
117{
118 //! Number of options.
119 int count;
120
121 //! List of `count` option names separated by \0.
122 const char *options;
123
124 //! Pointer to the option value.
125 int *value;
126};
127
128/*!
129 * Draggable single precision float information.
130 *
131 * @ingroup aux_util
132 */
134{
135 float val;
136 float step;
137 float min;
138 float max;
139};
140
141/*!
142 * Draggable usingned 8-bit integer information.
143 *
144 * @ingroup aux_util
145 */
147{
148 /*!
149 * @note Using a float instead of storing the value like @ref
150 * u_var_draggable_f32. It seemed better to decouple the UI from the value
151 * itself.
152 * @todo Unify "draggable" widgets interface.
153 */
154 uint8_t *val;
155 uint8_t step;
156 uint8_t min;
157 uint8_t max;
158};
159
160/*!
161 * Draggable usingned 16-bit integer information.
162 *
163 * @ingroup aux_util
164 */
166{
167 /*!
168 * @note Using a float instead of storing the value like @ref
169 * u_var_draggable_f32. It seemed better to decouple the UI from the value
170 * itself.
171 * @todo Unify "draggable" widgets interface.
172 */
173 uint16_t *val;
174 uint16_t step;
175 uint16_t min;
176 uint16_t max;
177};
178
179/*!
180 * Histogram based on single precision bars.
181 *
182 * @ingroup aux_util
183 */
185{
186 float *values; //!< Bin heights
187 int count; //!< Number of bins
188 float width; //!< Widget width or 0 for auto
189 float height; //!< Widget height or 0 for auto
190};
191
192/*!
193 * A point on the curve, uses doubles like ImPlotPoint.
194 *
195 * @ingroup aux_util
196 */
198{
199 double x;
200 double y;
201};
202
203/*!
204 * Callback for getting points on a curve.
205 *
206 * @ingroup aux_util
207 */
208typedef struct u_var_curve_point (*u_var_curve_getter)(void *data, int i);
209
210/*!
211 * A single curve on a plot.
212 *
213 * @ingroup aux_util
214 */
216{
217 u_var_curve_getter getter; //!< Getter of 2D points for the curve
218 void *data; //!< User data for `getter`
219 int count; //!< Number of points to draw; param i < count
220 const char *label; //!< Curve name
221 const char *xlabel; //!< Label of the X axis
222 const char *ylabel; //!< Label of the Y axis
223};
224
225/*!
226 * A collection of curves to be plotted.
227 *
228 * @ingroup aux_util
229 */
231{
232 struct u_var_curve curves[16];
233 int curve_count;
234
235 // These override individual curve axis labels
236 const char *xlabel; //!< Label of the X axis
237 const char *ylabel; //!< Label of the Y axis
238};
239
240/*!
241 * What kind of variable is this tracking.
242 *
243 * @ingroup aux_util
244 */
246{
247 U_VAR_KIND_BOOL,
248 U_VAR_KIND_RGB_U8,
249 U_VAR_KIND_RGB_F32,
250 U_VAR_KIND_U8,
251 U_VAR_KIND_DRAGGABLE_U8,
252 U_VAR_KIND_U16,
253 U_VAR_KIND_U16_ARR,
254 U_VAR_KIND_U32,
255 U_VAR_KIND_U64,
256 U_VAR_KIND_I32,
257 U_VAR_KIND_I64,
258 U_VAR_KIND_F32,
259 U_VAR_KIND_DRAGGABLE_F32,
260 U_VAR_KIND_F64,
261 U_VAR_KIND_F32_ARR,
262 U_VAR_KIND_TIMING,
263 U_VAR_KIND_VEC3_I32,
264 U_VAR_KIND_VEC3_F32,
265 U_VAR_KIND_POSE,
266 U_VAR_KIND_SINK_DEBUG,
267 U_VAR_KIND_NATIVE_IMAGES_DEBUG,
268 U_VAR_KIND_LOG_LEVEL,
269 U_VAR_KIND_RO_TEXT,
270 U_VAR_KIND_RO_RAW_TEXT,
271 U_VAR_KIND_RO_I16,
272 U_VAR_KIND_RO_I32,
273 U_VAR_KIND_RO_U16,
274 U_VAR_KIND_RO_U32,
275 U_VAR_KIND_RO_F32,
276 U_VAR_KIND_RO_I64,
277 U_VAR_KIND_RO_U64,
278 U_VAR_KIND_RO_F64,
279 U_VAR_KIND_RO_I64_NS,
280 U_VAR_KIND_RO_VEC2_F32,
281 U_VAR_KIND_RO_VEC3_I32,
282 U_VAR_KIND_RO_VEC3_F32,
283 U_VAR_KIND_RO_VEC3_F64,
284 U_VAR_KIND_RO_QUAT_F32,
285 U_VAR_KIND_RO_FF_F64,
286 U_VAR_KIND_RO_FF_VEC3_F32,
287 U_VAR_KIND_GUI_HEADER,
288 U_VAR_KIND_GUI_HEADER_BEGIN,
289 U_VAR_KIND_GUI_HEADER_END,
290 U_VAR_KIND_GUI_SAMELINE,
291 U_VAR_KIND_BUTTON,
292 U_VAR_KIND_COMBO,
293 U_VAR_KIND_HISTOGRAM_F32,
294 U_VAR_KIND_DRAGGABLE_U16,
295 U_VAR_KIND_CURVE,
296 U_VAR_KIND_CURVES,
297};
298
299/*!
300 * Maximum string length for a tracked variable.
301 *
302 * @ingroup aux_util
303 */
304#define U_VAR_NAME_STRING_SIZE 256
305
306/*!
307 * Struct that keeps all of the information about the variable, some of the UI
308 * state is kept on it.
309 *
310 * @ingroup aux_util
311 */
313{
314 char name[U_VAR_NAME_STRING_SIZE];
315 void *ptr;
316
317 enum u_var_kind kind;
318
319 struct
320 {
321 bool graphed;
322 } gui;
323};
324
325/*!
326 * Struct containing the information about a root object.
327 *
328 * @ingroup aux_util
329 */
331{
332 //! The displayed name.
333 const char *name;
334
335 //! Raw name without any suffix.
336 const char *raw_name;
337
338 //! The number of the window, or zero (name and raw_name are the same).
339 uint32_t number;
340};
341
342/*!
343 * Callback for entering and leaving root nodes.
344 *
345 * @ingroup aux_util
346 */
347typedef void (*u_var_root_cb)(struct u_var_root_info *info, void *);
348
349/*!
350 * Callback on each variable a root node has.
351 *
352 * @ingroup aux_util
353 */
354typedef void (*u_var_elm_cb)(struct u_var_info *info, void *);
355
356/*!
357 * Add a named root object, the u_var subsystem is completely none-invasive
358 * to the object it's tracking. The root pointer is used as a entry into a
359 * hashmap of hidden objects. When not active all calls are stubs and have no
360 * side-effects.
361 *
362 * This is intended only for debugging and is turned off by default, as this all
363 * very very unsafe. It is only pointers straight into objects, completely
364 * ignores ownership or any safe practices.
365 *
366 * The parameter @p suffix_with_number makes the variable tracking code suffix
367 * the name of the object with with a number. This allows multiple objects of
368 * the same name name.
369 *
370 * ```c
371 * // On create
372 * u_var_add_root((void*)psmv, "PS Move Controller", true);
373 * u_var_add_rgb_u8((void*)psmv, &psmv->led_color, "LED");
374 * u_var_add_log_level(psmv, &psmv->log_level, "Log level");
375 *
376 * // On destroy, only need to destroy the root object.
377 * u_var_remove_root((void*)psmv);
378 * ```
379 *
380 * @param root Object to be tracked.
381 * @param c_name Name of object, null terminated "C" string.
382 * @param suffix_with_number Should name be suffixed with a number.
383 *
384 * @ingroup aux_util
385 */
386void
387u_var_add_root(void *root, const char *c_name, bool suffix_with_number);
388
389/*!
390 * Remove the root node.
391 *
392 * @ingroup aux_util
393 */
394void
396
397/*!
398 * Visit all root nodes and their variables.
399 *
400 * @ingroup aux_util
401 */
402void
403u_var_visit(u_var_root_cb enter_cb, u_var_root_cb exit_cb, u_var_elm_cb elem_cb, void *priv);
404
405/*!
406 * This forces the variable tracking code to on, it is disabled by default.
407 *
408 * @ingroup aux_util
409 */
410void
412
413#define U_VAR_ADD_FUNCS() \
414 ADD_FUNC(bool, bool, BOOL) \
415 ADD_FUNC(rgb_u8, struct xrt_colour_rgb_u8, RGB_U8) \
416 ADD_FUNC(rgb_f32, struct xrt_colour_rgb_f32, RGB_F32) \
417 ADD_FUNC(u8, uint8_t, U8) \
418 ADD_FUNC(u16, uint16_t, U16) \
419 ADD_FUNC(u16_arr, struct u_var_u16_arr, U16_ARR) \
420 ADD_FUNC(u32, uint32_t, U32) \
421 ADD_FUNC(u64, uint64_t, U64) \
422 ADD_FUNC(i32, int32_t, I32) \
423 ADD_FUNC(i64, int64_t, I64) \
424 ADD_FUNC(f32, float, F32) \
425 ADD_FUNC(f64, double, F64) \
426 ADD_FUNC(f32_arr, struct u_var_f32_arr, F32_ARR) \
427 ADD_FUNC(f32_timing, struct u_var_timing, TIMING) \
428 ADD_FUNC(vec3_i32, struct xrt_vec3_i32, VEC3_I32) \
429 ADD_FUNC(vec3_f32, struct xrt_vec3, VEC3_F32) \
430 ADD_FUNC(pose, struct xrt_pose, POSE) \
431 ADD_FUNC(sink_debug, struct u_sink_debug, SINK_DEBUG) \
432 ADD_FUNC(native_images_debug, struct u_native_images_debug, NATIVE_IMAGES_DEBUG) \
433 ADD_FUNC(log_level, enum u_logging_level, LOG_LEVEL) \
434 ADD_FUNC(ro_text, const char, RO_TEXT) \
435 ADD_FUNC(ro_raw_text, const char, RO_RAW_TEXT) \
436 ADD_FUNC(ro_i16, int16_t, RO_I16) \
437 ADD_FUNC(ro_i32, int32_t, RO_I32) \
438 ADD_FUNC(ro_u16, uint16_t, RO_U16) \
439 ADD_FUNC(ro_u32, uint32_t, RO_U32) \
440 ADD_FUNC(ro_f32, float, RO_F32) \
441 ADD_FUNC(ro_i64, int64_t, RO_I64) \
442 ADD_FUNC(ro_u64, uint64_t, RO_U64) \
443 ADD_FUNC(ro_f64, double, RO_F64) \
444 ADD_FUNC(ro_i64_ns, int64_t, RO_I64_NS) \
445 ADD_FUNC(ro_vec2_f32, struct xrt_vec2, RO_VEC2_F32) \
446 ADD_FUNC(ro_vec3_i32, struct xrt_vec3_i32, RO_VEC3_I32) \
447 ADD_FUNC(ro_vec3_f32, struct xrt_vec3, RO_VEC3_F32) \
448 ADD_FUNC(ro_vec3_f64, struct xrt_vec3_f64, RO_VEC3_F64) \
449 ADD_FUNC(ro_quat_f32, struct xrt_quat, RO_QUAT_F32) \
450 ADD_FUNC(ro_ff_f64, struct m_ff_f64, RO_FF_F64) \
451 ADD_FUNC(ro_ff_vec3_f32, struct m_ff_vec3_f32, RO_FF_VEC3_F32) \
452 ADD_FUNC(gui_header, bool, GUI_HEADER) \
453 ADD_FUNC(gui_header_begin, bool, GUI_HEADER_BEGIN) \
454 ADD_FUNC(gui_header_end, bool, GUI_HEADER_END) \
455 ADD_FUNC(gui_sameline, void, GUI_SAMELINE) \
456 ADD_FUNC(button, struct u_var_button, BUTTON) \
457 ADD_FUNC(combo, struct u_var_combo, COMBO) \
458 ADD_FUNC(draggable_f32, struct u_var_draggable_f32, DRAGGABLE_F32) \
459 ADD_FUNC(draggable_u8, struct u_var_draggable_u8, DRAGGABLE_U8) \
460 ADD_FUNC(draggable_u16, struct u_var_draggable_u16, DRAGGABLE_U16) \
461 ADD_FUNC(histogram_f32, struct u_var_histogram_f32, HISTOGRAM_F32) \
462 ADD_FUNC(curve, struct u_var_curve, CURVE) \
463 ADD_FUNC(curves, struct u_var_curves, CURVES)
464
465#define ADD_FUNC(SUFFIX, TYPE, ENUM) void u_var_add_##SUFFIX(void *, TYPE *, const char *);
466
467U_VAR_ADD_FUNCS()
468
469#undef ADD_FUNC
470
471
472#ifdef __cplusplus
473}
474#endif
void u_var_add_root(void *root, const char *c_name, bool suffix_with_number)
Add a named root object, the u_var subsystem is completely none-invasive to the object it's tracking.
void(* u_var_button_cb)(void *)
Callback for a button action.
Definition u_var.h:78
void(* u_var_root_cb)(struct u_var_root_info *info, void *)
Callback for entering and leaving root nodes.
Definition u_var.h:347
#define U_VAR_NAME_STRING_SIZE
Maximum string length for a tracked variable.
Definition u_var.h:304
void u_var_visit(u_var_root_cb enter_cb, u_var_root_cb exit_cb, u_var_elm_cb elem_cb, void *priv)
Visit all root nodes and their variables.
void u_var_force_on(void)
This forces the variable tracking code to on, it is disabled by default.
void u_var_remove_root(void *root)
Remove the root node.
struct u_var_curve_point(* u_var_curve_getter)(void *data, int i)
Callback for getting points on a curve.
Definition u_var.h:208
u_var_kind
What kind of variable is this tracking.
Definition u_var.h:246
void(* u_var_elm_cb)(struct u_var_info *info, void *)
Callback on each variable a root node has.
Definition u_var.h:354
Definition m_filter_fifo.c:198
Definition m_filter_fifo.c:23
A struct for debugging one or more native images.
Definition u_native_images_debug.h:28
Allows more safely to debug sink inputs and outputs.
Definition u_sink.h:214
Simple pushable button.
Definition u_var.h:86
bool disabled
Whether this button is disabled.
Definition u_var.h:108
char label[64]
Button text, use var name if zeroed.
Definition u_var.h:101
xrt_atomic_s32_t downed
Is the pointer pressing down on the button curruently, this is not edge triggered like the callback.
Definition u_var.h:98
u_var_button_cb cb
Callback function to execute on button press.
Definition u_var.h:88
void * ptr
Pointer that will be passed to the function as its only argument.
Definition u_var.h:91
float width
Button dimensions, zero for auto size.
Definition u_var.h:104
Combo box information.
Definition u_var.h:117
int count
Number of options.
Definition u_var.h:119
int * value
Pointer to the option value.
Definition u_var.h:125
const char * options
List of count option names separated by \0.
Definition u_var.h:122
A point on the curve, uses doubles like ImPlotPoint.
Definition u_var.h:198
A single curve on a plot.
Definition u_var.h:216
const char * ylabel
Label of the Y axis.
Definition u_var.h:222
int count
Number of points to draw; param i < count.
Definition u_var.h:219
const char * xlabel
Label of the X axis.
Definition u_var.h:221
void * data
User data for getter
Definition u_var.h:218
const char * label
Curve name.
Definition u_var.h:220
u_var_curve_getter getter
Getter of 2D points for the curve.
Definition u_var.h:217
A collection of curves to be plotted.
Definition u_var.h:231
const char * ylabel
Label of the Y axis.
Definition u_var.h:237
const char * xlabel
Label of the X axis.
Definition u_var.h:236
Draggable single precision float information.
Definition u_var.h:134
Draggable usingned 16-bit integer information.
Definition u_var.h:166
uint16_t * val
Definition u_var.h:173
Draggable usingned 8-bit integer information.
Definition u_var.h:147
uint8_t * val
Definition u_var.h:154
Used to plot an array for values.
Definition u_var.h:35
Histogram based on single precision bars.
Definition u_var.h:185
float height
Widget height or 0 for auto.
Definition u_var.h:189
float width
Widget width or 0 for auto.
Definition u_var.h:188
int count
Number of bins.
Definition u_var.h:187
float * values
Bin heights.
Definition u_var.h:186
Struct that keeps all of the information about the variable, some of the UI state is kept on it.
Definition u_var.h:313
Struct containing the information about a root object.
Definition u_var.h:331
uint32_t number
The number of the window, or zero (name and raw_name are the same).
Definition u_var.h:339
const char * name
The displayed name.
Definition u_var.h:333
const char * raw_name
Raw name without any suffix.
Definition u_var.h:336
Used to plot a graph of timing information.
Definition u_var.h:53
float range
How many units the graph expands by default.
Definition u_var.h:64
bool center_reference_timing
If false, reference_timing will be the bottom of the graph.
Definition u_var.h:61
bool dynamic_rescale
Rescale graph's value range when value exceeds range.
Definition u_var.h:67
float reference_timing
A reference line drawn on the plot.
Definition u_var.h:58
struct u_var_f32_arr values
Values to be plotted.
Definition u_var.h:55
const char * unit
A string describing the unit used, not freed.
Definition u_var.h:70
Definition u_var.h:42
A object that is sent frames.
Definition xrt_frame.h:58
Basic logging functionality.
Common defines and enums for XRT.