Monado OpenXR Runtime
oxr_objects.h
Go to the documentation of this file.
1// Copyright 2018-2024, Collabora, Ltd.
2// Copyright 2023-2025, NVIDIA CORPORATION.
3// SPDX-License-Identifier: BSL-1.0
4/*!
5 * @file
6 * @brief The objects representing OpenXR handles, and prototypes for internal functions used in the state tracker.
7 * @author Jakob Bornecrantz <jakob@collabora.com>
8 * @author Korcan Hussein <korcan.hussein@collabora.com>
9 * @ingroup oxr_main
10 */
11
12#pragma once
13
14#include "xrt/xrt_space.h"
15#include "xrt/xrt_limits.h"
16#include "xrt/xrt_system.h"
17#include "xrt/xrt_future.h"
18#include "xrt/xrt_device.h"
19#include "xrt/xrt_tracking.h"
20#include "xrt/xrt_compositor.h"
23#include "xrt/xrt_config_os.h"
24#include "xrt/xrt_config_have.h"
25
26#include "os/os_threading.h"
27
28#include "util/u_index_fifo.h"
29#include "util/u_hashset.h"
30#include "util/u_hashmap.h"
31#include "util/u_device.h"
32
34#include "oxr_subaction.h"
35#include "oxr_defines.h"
36#include "oxr_frame_sync.h"
37
38#if defined(XRT_HAVE_D3D11) || defined(XRT_HAVE_D3D12)
39#include <dxgi.h>
40#include <d3dcommon.h>
41#endif
42
43#ifdef XRT_FEATURE_RENDERDOC
44#include "renderdoc_app.h"
45#ifndef XRT_OS_WINDOWS
46#include <dlfcn.h>
47#endif // !XRT_OS_WINDOWS
48#endif // XRT_FEATURE_RENDERDOC
49
50#ifdef XRT_OS_ANDROID
51#include "xrt/xrt_android.h"
52#endif // #ifdef XRT_OS_ANDROID
53
54#ifdef __cplusplus
55extern "C" {
56#endif
57
58
59/*!
60 * @defgroup oxr OpenXR state tracker
61 *
62 * Client application facing code.
63 *
64 * @ingroup xrt
65 */
66
67/*!
68 * @brief Cast a pointer to an OpenXR handle in such a way as to avoid warnings.
69 *
70 * Avoids -Wpointer-to-int-cast by first casting to the same size int, then
71 * promoting to the 64-bit int, then casting to the handle type. That's a lot of
72 * no-ops on 64-bit, but a widening conversion on 32-bit.
73 *
74 * @ingroup oxr
75 */
76#define XRT_CAST_PTR_TO_OXR_HANDLE(HANDLE_TYPE, PTR) ((HANDLE_TYPE)(uint64_t)(uintptr_t)(PTR))
77
78/*!
79 * @brief Cast an OpenXR handle to a pointer in such a way as to avoid warnings.
80 *
81 * Avoids -Wint-to-pointer-cast by first casting to a 64-bit int, then to a
82 * pointer-sized int, then to the desired pointer type. That's a lot of no-ops
83 * on 64-bit, but a narrowing (!) conversion on 32-bit.
84 *
85 * @ingroup oxr
86 */
87#define XRT_CAST_OXR_HANDLE_TO_PTR(PTR_TYPE, HANDLE) ((PTR_TYPE)(uintptr_t)(uint64_t)(HANDLE))
88
89/*!
90 * @defgroup oxr_main OpenXR main code
91 *
92 * Gets called from @ref oxr_api functions and talks to devices and
93 * @ref comp using @ref xrt_iface.
94 *
95 * @ingroup oxr
96 * @{
97 */
98
99
100/*
101 *
102 * Forward declare structs.
103 *
104 */
105
106struct xrt_instance;
107struct oxr_logger;
109struct oxr_instance;
110struct oxr_system;
111struct oxr_session;
112struct oxr_event;
113struct oxr_swapchain;
114struct oxr_space;
115struct oxr_action_set;
116struct oxr_action;
118struct oxr_handle_base;
122struct oxr_action_input;
123struct oxr_action_output;
124struct oxr_dpad_state;
125struct oxr_binding;
127struct oxr_action_set_ref;
128struct oxr_action_ref;
129struct oxr_hand_tracker;
130struct oxr_facial_tracker_htc;
131struct oxr_face_tracker2_fb;
132struct oxr_body_tracker_fb;
133struct oxr_xdev_list;
134struct oxr_plane_detector_ext;
135
136#define XRT_MAX_HANDLE_CHILDREN 256
137#define OXR_MAX_BINDINGS_PER_ACTION 32
138
139struct time_state;
140
141/*!
142 * Function pointer type for a handle destruction function.
143 *
144 * @relates oxr_handle_base
145 */
146typedef XrResult (*oxr_handle_destroyer)(struct oxr_logger *log, struct oxr_handle_base *hb);
147
148
149
150/*
151 *
152 * Helpers
153 *
154 */
155
156/*!
157 * Safely copy an xrt_pose to an XrPosef.
158 */
159#define OXR_XRT_POSE_TO_XRPOSEF(FROM, TO) \
160 do { \
161 union { \
162 struct xrt_pose xrt; \
163 XrPosef oxr; \
164 } safe_copy = {FROM}; \
165 TO = safe_copy.oxr; \
166 } while (false)
167
168/*!
169 * Safely copy an xrt_fov to an XrFovf.
170 */
171#define OXR_XRT_FOV_TO_XRFOVF(FROM, TO) \
172 do { \
173 union { \
174 struct xrt_fov xrt; \
175 XrFovf oxr; \
176 } safe_copy = {FROM}; \
177 TO = safe_copy.oxr; \
178 } while (false)
179
180
181static inline const char *
182xr_action_type_to_str(XrActionType type)
183{
184 // clang-format off
185 switch (type) {
186 #define PRINT(name, value) \
187 case name: return #name;
188 XR_LIST_ENUM_XrActionType(PRINT)
189 #undef PRINT
190 default: return "XR_ACTION_TYPE_UNKNOWN";
191 }
192 // clang-format on
193}
194
195/*
196 *
197 * oxr_handle_base.c
198 *
199 */
200
201/*!
202 * Destroy the handle's object, as well as all child handles recursively.
203 *
204 * This should be how all handle-associated objects are destroyed.
205 *
206 * @public @memberof oxr_handle_base
207 */
208XrResult
209oxr_handle_destroy(struct oxr_logger *log, struct oxr_handle_base *hb);
210
211/*!
212 * Returns a human-readable label for a handle state.
213 *
214 * @relates oxr_handle_base
215 */
216const char *
218
219/*!
220 *
221 * @name oxr_instance.c
222 * @{
223 *
224 */
225
226/*!
227 * To go back to a OpenXR object.
228 *
229 * @relates oxr_instance
230 */
231static inline XrInstance
233{
234 return XRT_CAST_PTR_TO_OXR_HANDLE(XrInstance, inst);
235}
236
237/*!
238 * Creates a instance, does minimal validation of @p createInfo.
239 *
240 * @param[in] log Logger
241 * @param[in] createInfo OpenXR creation info.
242 * @param[in] extensions Parsed extension list to be enabled.
243 * @param[out] out_inst Pointer to pointer to a instance, returned instance.
244 *
245 * @public @static @memberof oxr_instance
246 */
247XrResult
249 const XrInstanceCreateInfo *createInfo,
250 XrVersion major_minor,
251 const struct oxr_extension_status *extensions,
252 struct oxr_instance **out_inst);
253
254/*!
255 * Must be called with oxr_instance::system_init_lock held.
256 *
257 * @public @memberof oxr_instance
258 */
259XrResult
261
262/*!
263 * @public @memberof oxr_instance
264 */
265XrResult
266oxr_instance_get_properties(struct oxr_logger *log,
267 struct oxr_instance *inst,
268 XrInstanceProperties *instanceProperties);
269
270#if XR_USE_TIMESPEC
271
272/*!
273 * @public @memberof oxr_instance
274 */
275XrResult
276oxr_instance_convert_time_to_timespec(struct oxr_logger *log,
277 struct oxr_instance *inst,
278 XrTime time,
279 struct timespec *timespecTime);
280
281/*!
282 * @public @memberof oxr_instance
283 */
284XrResult
285oxr_instance_convert_timespec_to_time(struct oxr_logger *log,
286 struct oxr_instance *inst,
287 const struct timespec *timespecTime,
288 XrTime *time);
289#endif // XR_USE_TIMESPEC
290
291#ifdef XR_USE_PLATFORM_WIN32
292
293/*!
294 * @public @memberof oxr_instance
295 */
296XrResult
297oxr_instance_convert_time_to_win32perfcounter(struct oxr_logger *log,
298 struct oxr_instance *inst,
299 XrTime time,
300 LARGE_INTEGER *win32perfcounterTime);
301
302/*!
303 * @public @memberof oxr_instance
304 */
305XrResult
306oxr_instance_convert_win32perfcounter_to_time(struct oxr_logger *log,
307 struct oxr_instance *inst,
308 const LARGE_INTEGER *win32perfcounterTime,
309 XrTime *time);
310
311#endif // XR_USE_PLATFORM_WIN32
312
313/*!
314 * @}
315 */
316
317/*!
318 *
319 * @name oxr_path.c
320 * @{
321 *
322 */
323
324/*!
325 * Initialize the path system.
326 * @private @memberof oxr_instance
327 */
328XrResult
329oxr_path_init(struct oxr_logger *log, struct oxr_instance *inst);
330
331/*!
332 * @public @memberof oxr_instance
333 */
334bool
335oxr_path_is_valid(struct oxr_logger *log, struct oxr_instance *inst, XrPath path);
336
337/*!
338 * @public @memberof oxr_instance
339 */
340void *
341oxr_path_get_attached(struct oxr_logger *log, struct oxr_instance *inst, XrPath path);
342
343/*!
344 * Get the path for the given string if it exists, or create it if it does not.
345 *
346 * @public @memberof oxr_instance
347 */
348XrResult
350 struct oxr_logger *log, struct oxr_instance *inst, const char *str, size_t length, XrPath *out_path);
351
352/*!
353 * Only get the path for the given string if it exists.
354 *
355 * @public @memberof oxr_instance
356 */
357XrResult
358oxr_path_only_get(struct oxr_logger *log, struct oxr_instance *inst, const char *str, size_t length, XrPath *out_path);
359
360/*!
361 * Get a pointer and length of the internal string.
362 *
363 * The pointer has the same life time as the instance. The length is the number
364 * of valid characters, not including the null termination character (but an
365 * extra null byte is always reserved at the end so can strings can be given
366 * to functions expecting null terminated strings).
367 *
368 * @public @memberof oxr_instance
369 */
370XrResult
372 struct oxr_logger *log, const struct oxr_instance *inst, XrPath path, const char **out_str, size_t *out_length);
373
374/*!
375 * Destroy the path system and all paths that the instance has created.
376 *
377 * @private @memberof oxr_instance
378 */
379void
380oxr_path_destroy(struct oxr_logger *log, struct oxr_instance *inst);
381
382/*!
383 * @}
384 */
385
386/*!
387 * To go back to a OpenXR object.
388 *
389 * @relates oxr_action_set
390 */
391static inline XrActionSet
393{
394 return XRT_CAST_PTR_TO_OXR_HANDLE(XrActionSet, act_set);
395}
396
397/*!
398 * To go back to a OpenXR object.
399 *
400 * @relates oxr_hand_tracker
401 */
402static inline XrHandTrackerEXT
404{
405 return XRT_CAST_PTR_TO_OXR_HANDLE(XrHandTrackerEXT, hand_tracker);
406}
407
408#ifdef OXR_HAVE_EXT_plane_detection
409/*!
410 * To go back to a OpenXR object.
411 *
412 * @relates oxr_plane_detector
413 */
414static inline XrPlaneDetectorEXT
415oxr_plane_detector_to_openxr(struct oxr_plane_detector_ext *plane_detector)
416{
417 return XRT_CAST_PTR_TO_OXR_HANDLE(XrPlaneDetectorEXT, plane_detector);
418}
419#endif // OXR_HAVE_EXT_plane_detection
420
421/*!
422 * To go back to a OpenXR object.
423 *
424 * @relates oxr_action
425 */
426static inline XrAction
428{
429 return XRT_CAST_PTR_TO_OXR_HANDLE(XrAction, act);
430}
431
432#ifdef OXR_HAVE_HTC_facial_tracking
433/*!
434 * To go back to a OpenXR object.
435 *
436 * @relates oxr_facial_tracker_htc
437 */
438static inline XrFacialTrackerHTC
439oxr_facial_tracker_htc_to_openxr(struct oxr_facial_tracker_htc *face_tracker_htc)
440{
441 return XRT_CAST_PTR_TO_OXR_HANDLE(XrFacialTrackerHTC, face_tracker_htc);
442}
443#endif
444
445#ifdef OXR_HAVE_FB_body_tracking
446/*!
447 * To go back to a OpenXR object.
448 *
449 * @relates oxr_facial_tracker_htc
450 */
451static inline XrBodyTrackerFB
452oxr_body_tracker_fb_to_openxr(struct oxr_body_tracker_fb *body_tracker_fb)
453{
454 return XRT_CAST_PTR_TO_OXR_HANDLE(XrBodyTrackerFB, body_tracker_fb);
455}
456#endif
457
458#ifdef OXR_HAVE_FB_face_tracking2
459/*!
460 * To go back to a OpenXR object.
461 *
462 * @relates oxr_face_tracker2_fb
463 */
464static inline XrFaceTracker2FB
465oxr_face_tracker2_fb_to_openxr(struct oxr_face_tracker2_fb *face_tracker2_fb)
466{
467 return XRT_CAST_PTR_TO_OXR_HANDLE(XrFaceTracker2FB, face_tracker2_fb);
468}
469#endif
470/*!
471 *
472 * @name oxr_input.c
473 * @{
474 *
475 */
476
477/*!
478 * Helper function to classify subaction_paths.
479 *
480 * Sets all members of @p subaction_paths ( @ref oxr_subaction_paths ) as
481 * appropriate based on the subaction paths found in the list.
482 *
483 * If no paths are provided, @p subaction_paths->any will be true.
484 *
485 * @return false if an invalid subaction path is provided.
486 *
487 * @public @memberof oxr_instance
488 * @see oxr_subaction_paths
489 */
490bool
492 const struct oxr_instance *inst,
493 uint32_t subaction_path_count,
494 const XrPath *subaction_paths,
495 struct oxr_subaction_paths *subaction_paths_out);
496
497/*!
498 * Find the pose input for the set of subaction_paths
499 *
500 * @public @memberof oxr_session
501 */
502XrResult
504 uint32_t act_key,
505 const struct oxr_subaction_paths *subaction_paths_ptr,
506 struct oxr_action_input **out_input);
507
508/*!
509 * @public @memberof oxr_instance
510 */
511XrResult
512oxr_action_set_create(struct oxr_logger *log,
513 struct oxr_instance *inst,
514 const XrActionSetCreateInfo *createInfo,
515 struct oxr_action_set **out_act_set);
516
517/*!
518 * @public @memberof oxr_action
519 */
520XrResult
521oxr_action_create(struct oxr_logger *log,
522 struct oxr_action_set *act_set,
523 const XrActionCreateInfo *createInfo,
524 struct oxr_action **out_act);
525
526/*!
527 * @public @memberof oxr_session
528 * @see oxr_action_set
529 */
530XrResult
532 struct oxr_session *sess,
533 const XrSessionActionSetsAttachInfo *bindInfo);
534
535
536XrResult
537oxr_session_update_action_bindings(struct oxr_logger *log, struct oxr_session *sess);
538
539/*!
540 * Given an action act_key, look up the @ref oxr_action_attachment of
541 * the associated action in the given Session.
542 *
543 * @private @memberof oxr_session
544 */
545void
546oxr_session_get_action_attachment(struct oxr_session *sess,
547 uint32_t act_key,
548 struct oxr_action_attachment **out_act_attached);
549
550/*!
551 * @public @memberof oxr_session
552 */
553XrResult
555 struct oxr_session *sess,
556 uint32_t countActionSets,
557 const XrActiveActionSet *actionSets,
558 const XrActiveActionSetPrioritiesEXT *activePriorities);
559
560/*!
561 * @public @memberof oxr_session
562 */
563XrResult
564oxr_action_enumerate_bound_sources(struct oxr_logger *log,
565 struct oxr_session *sess,
566 uint32_t act_key,
567 uint32_t sourceCapacityInput,
568 uint32_t *sourceCountOutput,
569 XrPath *sources);
570
571/*!
572 * @public @memberof oxr_session
573 */
574XrResult
575oxr_action_get_boolean(struct oxr_logger *log,
576 struct oxr_session *sess,
577 uint32_t act_key,
578 struct oxr_subaction_paths subaction_paths,
579 XrActionStateBoolean *data);
580
581/*!
582 * @public @memberof oxr_session
583 */
584XrResult
585oxr_action_get_vector1f(struct oxr_logger *log,
586 struct oxr_session *sess,
587 uint32_t act_key,
588 struct oxr_subaction_paths subaction_paths,
589 XrActionStateFloat *data);
590
591/*!
592 * @public @memberof oxr_session
593 */
594XrResult
595oxr_action_get_vector2f(struct oxr_logger *log,
596 struct oxr_session *sess,
597 uint32_t act_key,
598 struct oxr_subaction_paths subaction_paths,
599 XrActionStateVector2f *data);
600/*!
601 * @public @memberof oxr_session
602 */
603XrResult
604oxr_action_get_pose(struct oxr_logger *log,
605 struct oxr_session *sess,
606 uint32_t act_key,
607 struct oxr_subaction_paths subaction_paths,
608 XrActionStatePose *data);
609/*!
610 * @public @memberof oxr_session
611 */
612XrResult
613oxr_action_apply_haptic_feedback(struct oxr_logger *log,
614 struct oxr_session *sess,
615 uint32_t act_key,
616 struct oxr_subaction_paths subaction_paths,
617 const XrHapticBaseHeader *hapticEvent);
618/*!
619 * @public @memberof oxr_session
620 */
621XrResult
622oxr_action_stop_haptic_feedback(struct oxr_logger *log,
623 struct oxr_session *sess,
624 uint32_t act_key,
625 struct oxr_subaction_paths subaction_paths);
626
627/*!
628 * @public @memberof oxr_instance
629 */
630XrResult
631oxr_hand_tracker_create(struct oxr_logger *log,
632 struct oxr_session *sess,
633 const XrHandTrackerCreateInfoEXT *createInfo,
634 struct oxr_hand_tracker **out_hand_tracker);
635
636/*!
637 * @}
638 */
639
640/*!
641 *
642 * @name oxr_binding.c
643 * @{
644 *
645 */
646
647/*!
648 * Find the best matching profile for the given @ref xrt_device.
649 *
650 * @param log Logger.
651 * @param sess Session.
652 * @param xdev Can be null.
653 * @param[out] out_p Returned interaction profile.
654 *
655 * @public @memberof oxr_session
656 */
657void
659 struct oxr_session *sess,
660 struct xrt_device *xdev,
661 struct oxr_interaction_profile **out_p);
662
663bool
664oxr_get_profile_for_device_name(struct oxr_logger *log,
665 struct oxr_session *sess,
666 enum xrt_device_name name,
667 struct oxr_interaction_profile **out_p);
668
670oxr_clone_profile(const struct oxr_interaction_profile *src_profile);
671
672/*!
673 * Free all memory allocated by the binding system.
674 *
675 * @public @memberof oxr_instance
676 */
677void
678oxr_binding_destroy_all(struct oxr_logger *log, struct oxr_instance *inst);
679
680/*!
681 * Free all memory allocated by the binding system.
682 *
683 * @public @memberof oxr_instance
684 */
685void
687
688/*!
689 * Find all bindings that is the given action key is bound to.
690 * @public @memberof oxr_interaction_profile
691 */
692void
694 struct oxr_interaction_profile *profile,
695 uint32_t key,
696 size_t max_binding_count,
697 struct oxr_binding **out_bindings,
698 size_t *out_binding_count);
699
700/*!
701 * @public @memberof oxr_instance
702 */
703XrResult
704oxr_action_suggest_interaction_profile_bindings(struct oxr_logger *log,
705 struct oxr_instance *inst,
706 const XrInteractionProfileSuggestedBinding *suggestedBindings,
707 struct oxr_dpad_state *state);
708
709/*!
710 * @public @memberof oxr_instance
711 */
712XrResult
713oxr_action_get_current_interaction_profile(struct oxr_logger *log,
714 struct oxr_session *sess,
715 XrPath topLevelUserPath,
716 XrInteractionProfileState *interactionProfile);
717
718/*!
719 * @public @memberof oxr_session
720 */
721XrResult
723 struct oxr_session *sess,
724 const XrInputSourceLocalizedNameGetInfo *getInfo,
725 uint32_t bufferCapacityInput,
726 uint32_t *bufferCountOutput,
727 char *buffer);
728
729/*!
730 * @}
731 */
732
733
734/*!
735 *
736 * @name oxr_dpad.c
737 * @{
738 *
739 */
740
741/*!
742 * Initialises a dpad state, has to be zero init before a call to this function.
743 *
744 * @public @memberof oxr_dpad_state_get
745 */
746bool
747oxr_dpad_state_init(struct oxr_dpad_state *state);
748
749/*!
750 * Look for a entry in the state for the given action set key,
751 * returns NULL if no entry has been made for that action set.
752 *
753 * @public @memberof oxr_dpad_state_get
754 */
755struct oxr_dpad_entry *
756oxr_dpad_state_get(struct oxr_dpad_state *state, uint64_t key);
757
758/*!
759 * Look for a entry in the state for the given action set key,
760 * allocates a new entry if none was found.
761 *
762 * @public @memberof oxr_dpad_state_get
763 */
764struct oxr_dpad_entry *
765oxr_dpad_state_get_or_add(struct oxr_dpad_state *state, uint64_t key);
766
767/*!
768 * Frees all state and entries attached to this dpad state.
769 *
770 * @public @memberof oxr_dpad_state_get
771 */
772void
773oxr_dpad_state_deinit(struct oxr_dpad_state *state);
774
775/*!
776 * Clones all oxr_dpad_state
777 * @param dst_dpad_state destination of cloning
778 * @param src_dpad_state source of cloning
779 * @public @memberof oxr_dpad_state_clone
780 */
781bool
782oxr_dpad_state_clone(struct oxr_dpad_state *dst_dpad_state, const struct oxr_dpad_state *src_dpad_state);
783
784
785/*!
786 * @}
787 */
788
789
790/*!
791 *
792 * @name oxr_session.c
793 * @{
794 *
795 */
796
797/*!
798 * To go back to a OpenXR object.
799 *
800 * @relates oxr_session
801 */
802static inline XrSession
804{
805 return XRT_CAST_PTR_TO_OXR_HANDLE(XrSession, sess);
806}
807
808XrResult
809oxr_session_create(struct oxr_logger *log,
810 struct oxr_system *sys,
811 const XrSessionCreateInfo *createInfo,
812 struct oxr_session **out_session);
813
814XrResult
815oxr_session_enumerate_formats(struct oxr_logger *log,
816 struct oxr_session *sess,
817 uint32_t formatCapacityInput,
818 uint32_t *formatCountOutput,
819 int64_t *formats);
820
821/*!
822 * Change the state of the session, queues a event.
823 */
824void
825oxr_session_change_state(struct oxr_logger *log, struct oxr_session *sess, XrSessionState state, XrTime time);
826
827XrResult
828oxr_session_begin(struct oxr_logger *log, struct oxr_session *sess, const XrSessionBeginInfo *beginInfo);
829
830XrResult
831oxr_session_end(struct oxr_logger *log, struct oxr_session *sess);
832
833XrResult
834oxr_session_request_exit(struct oxr_logger *log, struct oxr_session *sess);
835
836XRT_CHECK_RESULT XrResult
837oxr_session_poll(struct oxr_logger *log, struct oxr_session *sess);
838
839XrResult
840oxr_session_locate_views(struct oxr_logger *log,
841 struct oxr_session *sess,
842 const XrViewLocateInfo *viewLocateInfo,
843 XrViewState *viewState,
844 uint32_t viewCapacityInput,
845 uint32_t *viewCountOutput,
846 XrView *views);
847
848XrResult
849oxr_session_frame_wait(struct oxr_logger *log, struct oxr_session *sess, XrFrameState *frameState);
850
851XrResult
852oxr_session_frame_begin(struct oxr_logger *log, struct oxr_session *sess);
853
854XrResult
855oxr_session_frame_end(struct oxr_logger *log, struct oxr_session *sess, const XrFrameEndInfo *frameEndInfo);
856
857XrResult
859 struct oxr_hand_tracker *hand_tracker,
860 const XrHandJointsLocateInfoEXT *locateInfo,
861 XrHandJointLocationsEXT *locations);
862
863/*
864 * Gets the body pose in the base space.
865 */
866XrResult
867oxr_get_base_body_pose(struct oxr_logger *log,
868 const struct xrt_body_joint_set *body_joint_set,
869 struct oxr_space *base_spc,
870 struct xrt_device *body_xdev,
871 XrTime at_time,
872 struct xrt_space_relation *out_base_body);
873
874XrResult
875oxr_session_apply_force_feedback(struct oxr_logger *log,
876 struct oxr_hand_tracker *hand_tracker,
877 const XrForceFeedbackCurlApplyLocationsMNDX *locations);
878
879#ifdef OXR_HAVE_KHR_android_thread_settings
880XrResult
881oxr_session_android_thread_settings(struct oxr_logger *log,
882 struct oxr_session *sess,
883 XrAndroidThreadTypeKHR threadType,
884 uint32_t threadId);
885#endif // OXR_HAVE_KHR_android_thread_settings
886
887#ifdef OXR_HAVE_KHR_visibility_mask
888XrResult
889oxr_session_get_visibility_mask(struct oxr_logger *log,
890 struct oxr_session *session,
891 XrVisibilityMaskTypeKHR visibilityMaskType,
892 uint32_t viewIndex,
893 XrVisibilityMaskKHR *visibilityMask);
894
895XrResult
896oxr_event_push_XrEventDataVisibilityMaskChangedKHR(struct oxr_logger *log,
897 struct oxr_session *sess,
898 XrViewConfigurationType viewConfigurationType,
899 uint32_t viewIndex);
900#endif // OXR_HAVE_KHR_visibility_mask
901
902#ifdef OXR_HAVE_EXT_performance_settings
903XrResult
904oxr_session_set_perf_level(struct oxr_logger *log,
905 struct oxr_session *sess,
906 XrPerfSettingsDomainEXT domain,
907 XrPerfSettingsLevelEXT level);
908#endif // OXR_HAVE_EXT_performance_settings
909
910/*
911 *
912 * oxr_space.c
913 *
914 */
915
916/*!
917 * To go back to a OpenXR object.
918 */
919static inline XrSpace
921{
922 return XRT_CAST_PTR_TO_OXR_HANDLE(XrSpace, spc);
923}
924
925XrResult
926oxr_space_action_create(struct oxr_logger *log,
927 struct oxr_session *sess,
928 uint32_t key,
929 const XrActionSpaceCreateInfo *createInfo,
930 struct oxr_space **out_space);
931
932XrResult
933oxr_space_get_reference_bounds_rect(struct oxr_logger *log,
934 struct oxr_session *sess,
935 XrReferenceSpaceType referenceSpaceType,
936 XrExtent2Df *bounds);
937
938XrResult
939oxr_space_reference_create(struct oxr_logger *log,
940 struct oxr_session *sess,
941 const XrReferenceSpaceCreateInfo *createInfo,
942 struct oxr_space **out_space);
943
944/*!
945 * Monado special space that always points to a specific @ref xrt_device and
946 * pose, useful when you want to bypass the action binding system for instance.
947 */
948XrResult
950 struct oxr_session *sess,
951 struct xrt_device *xdev,
952 enum xrt_input_name name,
953 const struct xrt_pose *pose,
954 struct oxr_space **out_space);
955
956XrResult
958 struct oxr_logger *log, struct oxr_space *spc, struct oxr_space *baseSpc, XrTime time, XrSpaceLocation *location);
959
960XrResult
961oxr_spaces_locate(struct oxr_logger *log,
962 struct oxr_space **spcs,
963 uint32_t spc_count,
964 struct oxr_space *baseSpc,
965 XrTime time,
966 XrSpaceLocations *locations);
967
968/*!
969 * Locate the @ref xrt_device in the given base space, useful for implementing
970 * hand tracking location look ups and the like.
971 *
972 * @param log Logging struct.
973 * @param xdev Device to locate in the base space.
974 * @param baseSpc Base space where the device is to be located.
975 * @param[in] time Time in OpenXR domain.
976 * @param[out] out_relation Returns T_base_xdev, aka xdev in base space.
977 *
978 * @return Any errors, XR_SUCCESS, pose might not be valid on XR_SUCCESS.
979 */
980XRT_CHECK_RESULT XrResult
982 struct xrt_device *xdev,
983 struct oxr_space *baseSpc,
984 XrTime time,
985 struct xrt_space_relation *out_relation);
986
987
988/*
989 *
990 * oxr_swapchain.c
991 *
992 */
993
994/*!
995 * To go back to a OpenXR object.
996 */
997static inline XrSwapchain
999{
1000 return XRT_CAST_PTR_TO_OXR_HANDLE(XrSwapchain, sc);
1001}
1002
1003
1004/*
1005 *
1006 * oxr_messenger.c
1007 *
1008 */
1009
1010/*!
1011 * To go back to a OpenXR object.
1012 */
1013static inline XrDebugUtilsMessengerEXT
1015{
1016 return XRT_CAST_PTR_TO_OXR_HANDLE(XrDebugUtilsMessengerEXT, mssngr);
1017}
1018
1019XrResult
1021 struct oxr_instance *inst,
1022 const XrDebugUtilsMessengerCreateInfoEXT *,
1023 struct oxr_debug_messenger **out_mssngr);
1024XrResult
1025oxr_destroy_messenger(struct oxr_logger *log, struct oxr_debug_messenger *mssngr);
1026
1027
1028/*
1029 *
1030 * oxr_system.c
1031 *
1032 */
1033
1034XrResult
1035oxr_system_select(struct oxr_logger *log,
1036 struct oxr_system **systems,
1037 uint32_t system_count,
1038 XrFormFactor form_factor,
1039 struct oxr_system **out_selected);
1040
1041XrResult
1042oxr_system_fill_in(struct oxr_logger *log,
1043 struct oxr_instance *inst,
1044 XrSystemId systemId,
1045 uint32_t view_count,
1046 struct oxr_system *sys);
1047
1048XrResult
1049oxr_system_verify_id(struct oxr_logger *log, const struct oxr_instance *inst, XrSystemId systemId);
1050
1051XrResult
1052oxr_system_get_by_id(struct oxr_logger *log,
1053 struct oxr_instance *inst,
1054 XrSystemId systemId,
1055 struct oxr_system **system);
1056
1057XrResult
1058oxr_system_get_properties(struct oxr_logger *log, struct oxr_system *sys, XrSystemProperties *properties);
1059
1060XrResult
1061oxr_system_enumerate_view_confs(struct oxr_logger *log,
1062 struct oxr_system *sys,
1063 uint32_t viewConfigurationTypeCapacityInput,
1064 uint32_t *viewConfigurationTypeCountOutput,
1065 XrViewConfigurationType *viewConfigurationTypes);
1066
1067XrResult
1068oxr_system_enumerate_blend_modes(struct oxr_logger *log,
1069 struct oxr_system *sys,
1070 XrViewConfigurationType viewConfigurationType,
1071 uint32_t environmentBlendModeCapacityInput,
1072 uint32_t *environmentBlendModeCountOutput,
1073 XrEnvironmentBlendMode *environmentBlendModes);
1074
1075XrResult
1076oxr_system_get_view_conf_properties(struct oxr_logger *log,
1077 struct oxr_system *sys,
1078 XrViewConfigurationType viewConfigurationType,
1079 XrViewConfigurationProperties *configurationProperties);
1080
1081XrResult
1082oxr_system_enumerate_view_conf_views(struct oxr_logger *log,
1083 struct oxr_system *sys,
1084 XrViewConfigurationType viewConfigurationType,
1085 uint32_t viewCapacityInput,
1086 uint32_t *viewCountOutput,
1087 XrViewConfigurationView *views);
1088
1089bool
1090oxr_system_get_hand_tracking_support(struct oxr_logger *log, struct oxr_instance *inst);
1091
1092bool
1093oxr_system_get_eye_gaze_support(struct oxr_logger *log, struct oxr_instance *inst);
1094
1095bool
1096oxr_system_get_force_feedback_support(struct oxr_logger *log, struct oxr_instance *inst);
1097
1098void
1099oxr_system_get_face_tracking_htc_support(struct oxr_logger *log,
1100 struct oxr_instance *inst,
1101 bool *supports_eye,
1102 bool *supports_lip);
1103
1104void
1105oxr_system_get_face_tracking2_fb_support(struct oxr_logger *log,
1106 struct oxr_instance *inst,
1107 bool *supports_audio,
1108 bool *supports_visual);
1109
1110bool
1111oxr_system_get_body_tracking_fb_support(struct oxr_logger *log, struct oxr_instance *inst);
1112
1113bool
1114oxr_system_get_full_body_tracking_meta_support(struct oxr_logger *log, struct oxr_instance *inst);
1115
1116bool
1117oxr_system_get_body_tracking_calibration_meta_support(struct oxr_logger *log, struct oxr_instance *inst);
1118
1119/*
1120 *
1121 * oxr_event.cpp
1122 *
1123 */
1124
1125XrResult
1126oxr_event_push_XrEventDataSessionStateChanged(struct oxr_logger *log,
1127 struct oxr_session *sess,
1128 XrSessionState state,
1129 XrTime time);
1130
1131XrResult
1132oxr_event_push_XrEventDataInteractionProfileChanged(struct oxr_logger *log, struct oxr_session *sess);
1133
1134XrResult
1135oxr_event_push_XrEventDataReferenceSpaceChangePending(struct oxr_logger *log,
1136 struct oxr_session *sess,
1137 XrReferenceSpaceType referenceSpaceType,
1138 XrTime changeTime,
1139 XrBool32 poseValid,
1140 const XrPosef *poseInPreviousSpace);
1141
1142#ifdef OXR_HAVE_FB_display_refresh_rate
1143XrResult
1144oxr_event_push_XrEventDataDisplayRefreshRateChangedFB(struct oxr_logger *log,
1145 struct oxr_session *sess,
1146 float fromDisplayRefreshRate,
1147 float toDisplayRefreshRate);
1148#endif // OXR_HAVE_FB_display_refresh_rate
1149
1150#ifdef OXR_HAVE_EXTX_overlay
1151XrResult
1152oxr_event_push_XrEventDataMainSessionVisibilityChangedEXTX(struct oxr_logger *log,
1153 struct oxr_session *sess,
1154 bool visible);
1155#endif // OXR_HAVE_EXTX_overlay
1156
1157#ifdef OXR_HAVE_EXT_performance_settings
1158XrResult
1159oxr_event_push_XrEventDataPerfSettingsEXTX(struct oxr_logger *log,
1160 struct oxr_session *sess,
1161 enum xrt_perf_domain domain,
1162 enum xrt_perf_sub_domain subDomain,
1163 enum xrt_perf_notify_level fromLevel,
1164 enum xrt_perf_notify_level toLevel);
1165#endif // OXR_HAVE_EXT_performance_settings
1166/*!
1167 * This clears all pending events refers to the given session.
1168 */
1169XrResult
1170oxr_event_remove_session_events(struct oxr_logger *log, struct oxr_session *sess);
1171
1172/*!
1173 * Will return one event if available, also drain the sessions event queues.
1174 */
1175XrResult
1176oxr_poll_event(struct oxr_logger *log, struct oxr_instance *inst, XrEventDataBuffer *eventData);
1177
1178
1179/*
1180 *
1181 * oxr_xdev.c
1182 *
1183 */
1184
1185void
1186oxr_xdev_destroy(struct xrt_device **xdev_ptr);
1187
1188/*!
1189 * Return true if it finds an input of that name on this device.
1190 */
1191bool
1192oxr_xdev_find_input(struct xrt_device *xdev, enum xrt_input_name name, struct xrt_input **out_input);
1193
1194/*!
1195 * Return true if it finds an output of that name on this device.
1196 */
1197bool
1198oxr_xdev_find_output(struct xrt_device *xdev, enum xrt_output_name name, struct xrt_output **out_output);
1199
1200#ifdef OXR_HAVE_MNDX_xdev_space
1201static inline XrXDevListMNDX
1202oxr_xdev_list_to_openxr(struct oxr_xdev_list *sc)
1203{
1204 return XRT_CAST_PTR_TO_OXR_HANDLE(XrXDevListMNDX, sc);
1205}
1206
1207XrResult
1208oxr_xdev_list_create(struct oxr_logger *log,
1209 struct oxr_session *sess,
1210 const XrCreateXDevListInfoMNDX *createInfo,
1211 struct oxr_xdev_list **out_xdl);
1212
1213XrResult
1214oxr_xdev_list_get_properties(struct oxr_logger *log,
1215 struct oxr_xdev_list *xdl,
1216 uint32_t index,
1217 XrXDevPropertiesMNDX *properties);
1218
1219XrResult
1220oxr_xdev_list_space_create(struct oxr_logger *log,
1221 struct oxr_xdev_list *xdl,
1222 const XrCreateXDevSpaceInfoMNDX *createInfo,
1223 uint32_t index,
1224 struct oxr_space **out_space);
1225
1226#endif // OXR_HAVE_MNDX_xdev_space
1227
1228
1229/*
1230 *
1231 * OpenGL, located in various files.
1232 *
1233 */
1234
1235#ifdef XR_USE_GRAPHICS_API_OPENGL
1236#ifdef XR_USE_PLATFORM_XLIB
1237
1238XrResult
1239oxr_session_populate_gl_xlib(struct oxr_logger *log,
1240 struct oxr_system *sys,
1241 XrGraphicsBindingOpenGLXlibKHR const *next,
1242 struct oxr_session *sess);
1243#endif // XR_USE_PLATFORM_XLIB
1244
1245#ifdef XR_USE_PLATFORM_WIN32
1246XrResult
1247oxr_session_populate_gl_win32(struct oxr_logger *log,
1248 struct oxr_system *sys,
1249 XrGraphicsBindingOpenGLWin32KHR const *next,
1250 struct oxr_session *sess);
1251#endif // XR_USE_PLATFORM_WIN32
1252#endif // XR_USE_GRAPHICS_API_OPENGL
1253
1254#if defined(XR_USE_GRAPHICS_API_OPENGL) || defined(XR_USE_GRAPHICS_API_OPENGL_ES)
1255XrResult
1256oxr_swapchain_gl_create(struct oxr_logger * /*log*/,
1257 struct oxr_session *sess,
1258 const XrSwapchainCreateInfo * /*createInfo*/,
1259 struct oxr_swapchain **out_swapchain);
1260
1261#endif // XR_USE_GRAPHICS_API_OPENGL || XR_USE_GRAPHICS_API_OPENGL_ES
1262
1263#if defined(XR_USE_GRAPHICS_API_OPENGL_ES)
1264#if defined(XR_USE_PLATFORM_ANDROID)
1265XrResult
1266oxr_session_populate_gles_android(struct oxr_logger *log,
1267 struct oxr_system *sys,
1268 XrGraphicsBindingOpenGLESAndroidKHR const *next,
1269 struct oxr_session *sess);
1270#endif // XR_USE_PLATFORM_ANDROID
1271#endif // XR_USE_GRAPHICS_API_OPENGL_ES
1272
1273
1274/*
1275 *
1276 * Vulkan, located in various files.
1277 *
1278 */
1279
1280#ifdef XR_USE_GRAPHICS_API_VULKAN
1281
1282XrResult
1283oxr_vk_get_instance_exts(struct oxr_logger *log,
1284 struct oxr_system *sys,
1285 uint32_t namesCapacityInput,
1286 uint32_t *namesCountOutput,
1287 char *namesString);
1288
1289XrResult
1290oxr_vk_get_device_exts(struct oxr_logger *log,
1291 struct oxr_system *sys,
1292 uint32_t namesCapacityInput,
1293 uint32_t *namesCountOutput,
1294 char *namesString);
1295
1296XrResult
1297oxr_vk_get_requirements(struct oxr_logger *log,
1298 struct oxr_system *sys,
1299 XrGraphicsRequirementsVulkanKHR *graphicsRequirements);
1300
1301XrResult
1303 struct oxr_system *sys,
1304 const XrVulkanInstanceCreateInfoKHR *createInfo,
1305 VkInstance *vulkanInstance,
1306 VkResult *vulkanResult);
1307
1308XrResult
1310 struct oxr_system *sys,
1311 const XrVulkanDeviceCreateInfoKHR *createInfo,
1312 VkDevice *vulkanDevice,
1313 VkResult *vulkanResult);
1314
1315XrResult
1316oxr_vk_get_physical_device(struct oxr_logger *log,
1317 struct oxr_instance *inst,
1318 struct oxr_system *sys,
1319 VkInstance vkInstance,
1320 PFN_vkGetInstanceProcAddr getProc,
1321 VkPhysicalDevice *vkPhysicalDevice);
1322
1323XrResult
1324oxr_session_populate_vk(struct oxr_logger *log,
1325 struct oxr_system *sys,
1326 XrGraphicsBindingVulkanKHR const *next,
1327 struct oxr_session *sess);
1328
1329XrResult
1330oxr_swapchain_vk_create(struct oxr_logger * /*log*/,
1331 struct oxr_session *sess,
1332 const XrSwapchainCreateInfo * /*createInfo*/,
1333 struct oxr_swapchain **out_swapchain);
1334
1335#endif
1336
1337
1338/*
1339 *
1340 * EGL, located in various files.
1341 *
1342 */
1343
1344#ifdef XR_USE_PLATFORM_EGL
1345
1346XrResult
1347oxr_session_populate_egl(struct oxr_logger *log,
1348 struct oxr_system *sys,
1349 XrGraphicsBindingEGLMNDX const *next,
1350 struct oxr_session *sess);
1351
1352#endif
1353
1354/*
1355 *
1356 * D3D version independent routines, located in oxr_d3d.cpp
1357 *
1358 */
1359
1360#if defined(XRT_HAVE_D3D11) || defined(XRT_HAVE_D3D12) || defined(XRT_DOXYGEN)
1361/// Common GetRequirements call for D3D11 and D3D12
1362XrResult
1364 struct oxr_system *sys,
1365 LUID *adapter_luid,
1366 D3D_FEATURE_LEVEL *min_feature_level);
1367
1368/// Verify the provided LUID matches the expected one in @p sys
1369XrResult
1370oxr_d3d_check_luid(struct oxr_logger *log, struct oxr_system *sys, LUID *adapter_luid);
1371#endif
1372
1373/*
1374 *
1375 * D3D11, located in various files.
1376 *
1377 */
1378
1379#ifdef XR_USE_GRAPHICS_API_D3D11
1380
1381XrResult
1382oxr_d3d11_get_requirements(struct oxr_logger *log,
1383 struct oxr_system *sys,
1384 XrGraphicsRequirementsD3D11KHR *graphicsRequirements);
1385
1386/**
1387 * @brief Check to ensure the device provided at session create matches the LUID we returned earlier.
1388 *
1389 * @return XR_SUCCESS if the device matches the LUID
1390 */
1391XrResult
1392oxr_d3d11_check_device(struct oxr_logger *log, struct oxr_system *sys, ID3D11Device *device);
1393
1394
1395XrResult
1396oxr_session_populate_d3d11(struct oxr_logger *log,
1397 struct oxr_system *sys,
1398 XrGraphicsBindingD3D11KHR const *next,
1399 struct oxr_session *sess);
1400
1401XrResult
1402oxr_swapchain_d3d11_create(struct oxr_logger *,
1403 struct oxr_session *sess,
1404 const XrSwapchainCreateInfo *,
1405 struct oxr_swapchain **out_swapchain);
1406
1407#endif
1408
1409/*
1410 *
1411 * D3D12, located in various files.
1412 *
1413 */
1414
1415#ifdef XR_USE_GRAPHICS_API_D3D12
1416
1417XrResult
1418oxr_d3d12_get_requirements(struct oxr_logger *log,
1419 struct oxr_system *sys,
1420 XrGraphicsRequirementsD3D12KHR *graphicsRequirements);
1421
1422/**
1423 * @brief Check to ensure the device provided at session create matches the LUID we returned earlier.
1424 *
1425 * @return XR_SUCCESS if the device matches the LUID
1426 */
1427XrResult
1428oxr_d3d12_check_device(struct oxr_logger *log, struct oxr_system *sys, ID3D12Device *device);
1429
1430
1431XrResult
1432oxr_session_populate_d3d12(struct oxr_logger *log,
1433 struct oxr_system *sys,
1434 XrGraphicsBindingD3D12KHR const *next,
1435 struct oxr_session *sess);
1436
1437XrResult
1438oxr_swapchain_d3d12_create(struct oxr_logger *,
1439 struct oxr_session *sess,
1440 const XrSwapchainCreateInfo *,
1441 struct oxr_swapchain **out_swapchain);
1442
1443#endif
1444
1445/*
1446 *
1447 * Structs
1448 *
1449 */
1450
1451
1452/*!
1453 * Used to hold diverse child handles and ensure orderly destruction.
1454 *
1455 * Each object referenced by an OpenXR handle should have one of these as its
1456 * first element, thus "extending" this class.
1457 */
1459{
1460 //! Magic (per-handle-type) value for debugging.
1461 uint64_t debug;
1462
1463 /*!
1464 * Pointer to this object's parent handle holder, if any.
1465 */
1467
1468 /*!
1469 * Array of children, if any.
1470 */
1471 struct oxr_handle_base *children[XRT_MAX_HANDLE_CHILDREN];
1472
1473 /*!
1474 * Current handle state.
1475 */
1477
1478 /*!
1479 * Destroy the object this handle refers to.
1480 */
1482};
1483
1484/*!
1485 * Holds the properties that a system supports for a view configuration type.
1486 *
1487 * @relates oxr_system
1488 */
1490{
1491 XrViewConfigurationType view_config_type;
1492
1493 uint32_t view_count;
1494 XrViewConfigurationView views[XRT_MAX_COMPOSITOR_VIEW_CONFIGS_VIEW_COUNT];
1495
1496 uint32_t blend_mode_count;
1497 XrEnvironmentBlendMode blend_modes[3];
1498};
1499
1500/*!
1501 * Single or multiple devices grouped together to form a system that sessions
1502 * can be created from. Might need to open devices to get all
1503 * properties from it, but shouldn't.
1504 *
1505 * Not strictly an object, but an atom.
1506 *
1507 * Valid only within an XrInstance (@ref oxr_instance)
1508 *
1509 * @obj{XrSystemId}
1510 */
1512{
1513 struct oxr_instance *inst;
1514
1515 //! The @ref xrt_iface level system.
1517
1518 //! System devices used in all session types.
1520
1521 //! Space overseer used in all session types.
1523
1524 //! System compositor, used to create session compositors.
1526
1527 XrSystemId systemId;
1528
1529 //! Have the client application called the gfx api requirements func?
1531
1532 uint32_t view_config_count;
1533 struct oxr_view_config_properties view_configs[XRT_MAX_COMPOSITOR_VIEW_CONFIGS_COUNT];
1534
1535 XrReferenceSpaceType reference_spaces[5];
1536 uint32_t reference_space_count;
1537
1538 //! Cache of the last known system roles, see @ref xrt_system_roles::generation_id
1540 struct os_mutex sync_actions_mutex;
1541
1542 struct xrt_visibility_mask *visibility_mask[2];
1543
1544#ifdef OXR_HAVE_MNDX_xdev_space
1545 bool supports_xdev_space;
1546#endif
1547
1548#ifdef XR_USE_GRAPHICS_API_VULKAN
1549 //! The instance/device we create when vulkan_enable2 is used
1551 //! The device returned with the last xrGetVulkanGraphicsDeviceKHR or xrGetVulkanGraphicsDevice2KHR call.
1552 //! XR_NULL_HANDLE if neither has been called.
1554
1555 /*!
1556 * Stores the vkGetInstanceProcAddr passed to xrCreateVulkanInstanceKHR to be
1557 * used when looking up Vulkan functions used by xrGetVulkanGraphicsDevice2KHR.
1558 */
1559 PFN_vkGetInstanceProcAddr vk_get_instance_proc_addr;
1560
1561 struct
1562 {
1563 // No better place to keep this state.
1564 bool external_fence_fd_enabled;
1565 bool external_semaphore_fd_enabled;
1566 bool timeline_semaphore_enabled;
1567 bool debug_utils_enabled;
1568 bool image_format_list_enabled;
1569 } vk;
1570
1571#endif
1572
1573#if defined(XR_USE_GRAPHICS_API_D3D11) || defined(XR_USE_GRAPHICS_API_D3D12)
1574 LUID suggested_d3d_luid;
1575 bool suggested_d3d_luid_valid;
1576#endif
1577};
1578
1579
1580/*
1581 * Device roles helpers.
1582 */
1583
1584// static roles
1585// clang-format off
1586static inline struct xrt_device *get_role_head(struct oxr_system *sys) {return sys->xsysd->static_roles.head; }
1587static inline struct xrt_device *get_role_eyes(struct oxr_system *sys) {return sys->xsysd->static_roles.eyes; }
1588static inline struct xrt_device *get_role_face(struct oxr_system* sys) { return sys->xsysd->static_roles.face; }
1589static inline struct xrt_device *get_role_body(struct oxr_system* sys) { return sys->xsysd->static_roles.body; }
1590static inline struct xrt_device *get_role_hand_tracking_unobstructed_left(struct oxr_system* sys) { return sys->xsysd->static_roles.hand_tracking.unobstructed.left; }
1591static inline struct xrt_device *get_role_hand_tracking_unobstructed_right(struct oxr_system* sys) { return sys->xsysd->static_roles.hand_tracking.unobstructed.right; }
1592static inline struct xrt_device *get_role_hand_tracking_conforming_left(struct oxr_system* sys) { return sys->xsysd->static_roles.hand_tracking.conforming.left; }
1593static inline struct xrt_device *get_role_hand_tracking_conforming_right(struct oxr_system* sys) { return sys->xsysd->static_roles.hand_tracking.conforming.right; }
1594
1595// clang-format on
1596
1597// dynamic roles
1598#define MAKE_GET_DYN_ROLES_FN(ROLE) \
1599 static inline struct xrt_device *get_role_##ROLE(struct oxr_system *sys) \
1600 { \
1601 const bool is_locked = 0 == os_mutex_trylock(&sys->sync_actions_mutex); \
1602 const int32_t xdev_idx = sys->dynamic_roles_cache.ROLE; \
1603 if (is_locked) { \
1604 os_mutex_unlock(&sys->sync_actions_mutex); \
1605 } \
1606 if (xdev_idx < 0 || xdev_idx >= (int32_t)ARRAY_SIZE(sys->xsysd->xdevs)) \
1607 return NULL; \
1608 return sys->xsysd->xdevs[xdev_idx]; \
1609 }
1610MAKE_GET_DYN_ROLES_FN(left)
1611MAKE_GET_DYN_ROLES_FN(right)
1612MAKE_GET_DYN_ROLES_FN(gamepad)
1613#undef MAKE_GET_DYN_ROLES_FN
1614
1615#define GET_XDEV_BY_ROLE(SYS, ROLE) (get_role_##ROLE((SYS)))
1616
1617
1618static inline enum xrt_device_name
1619get_role_profile_head(struct oxr_system *sys)
1620{
1621 return XRT_DEVICE_INVALID;
1622}
1623static inline enum xrt_device_name
1624get_role_profile_eyes(struct oxr_system *sys)
1625{
1626 return XRT_DEVICE_INVALID;
1627}
1628static inline enum xrt_device_name
1629get_role_profile_face(struct oxr_system *sys)
1630{
1631 return XRT_DEVICE_INVALID;
1632}
1633static inline enum xrt_device_name
1634get_role_profile_body(struct oxr_system *sys)
1635{
1636 return XRT_DEVICE_INVALID;
1637}
1638static inline enum xrt_device_name
1639get_role_profile_hand_tracking_unobstructed_left(struct oxr_system *sys)
1640{
1641 return XRT_DEVICE_INVALID;
1642}
1643static inline enum xrt_device_name
1644get_role_profile_hand_tracking_unobstructed_right(struct oxr_system *sys)
1645{
1646 return XRT_DEVICE_INVALID;
1647}
1648
1649static inline enum xrt_device_name
1650get_role_profile_hand_tracking_conforming_left(struct oxr_system *sys)
1651{
1652 return XRT_DEVICE_INVALID;
1653}
1654static inline enum xrt_device_name
1655get_role_profile_hand_tracking_conforming_right(struct oxr_system *sys)
1656{
1657 return XRT_DEVICE_INVALID;
1658}
1659
1660#define MAKE_GET_DYN_ROLE_PROFILE_FN(ROLE) \
1661 static inline enum xrt_device_name get_role_profile_##ROLE(struct oxr_system *sys) \
1662 { \
1663 const bool is_locked = 0 == os_mutex_trylock(&sys->sync_actions_mutex); \
1664 const enum xrt_device_name profile_name = sys->dynamic_roles_cache.ROLE##_profile; \
1665 if (is_locked) { \
1666 os_mutex_unlock(&sys->sync_actions_mutex); \
1667 } \
1668 return profile_name; \
1669 }
1670MAKE_GET_DYN_ROLE_PROFILE_FN(left)
1671MAKE_GET_DYN_ROLE_PROFILE_FN(right)
1672MAKE_GET_DYN_ROLE_PROFILE_FN(gamepad)
1673#undef MAKE_GET_DYN_ROLES_FN
1674
1675#define GET_PROFILE_NAME_BY_ROLE(SYS, ROLE) (get_role_profile_##ROLE((SYS)))
1676
1677/*
1678 * Extensions helpers.
1679 */
1680
1681#define MAKE_EXT_STATUS(mixed_case, all_caps) bool mixed_case;
1682/*!
1683 * Structure tracking which extensions are enabled for a given instance.
1684 *
1685 * Names are systematic: the extension name with the XR_ prefix removed.
1686 */
1688{
1689 OXR_EXTENSION_SUPPORT_GENERATE(MAKE_EXT_STATUS)
1690};
1691#undef MAKE_EXT_STATUS
1692
1693/*!
1694 * Main object that ties everything together.
1695 *
1696 * No parent type/handle: this is the root handle.
1697 *
1698 * @obj{XrInstance}
1699 * @extends oxr_handle_base
1701struct oxr_instance
1702{
1703 //! Common structure for things referred to by OpenXR handles.
1704 struct oxr_handle_base handle;
1705
1706 struct u_debug_gui *debug_ui;
1707
1708 struct xrt_instance *xinst;
1709
1710 //! Enabled extensions
1712
1713 //! The OpenXR version requested in the app info. It determines the instance's OpenXR version.
1714 struct
1715 {
1716 //! Stores only major.minor version. Simplifies comparisons for e.g. "at least OpenXR 1.1".
1717 XrVersion major_minor;
1719
1720 // Protects the function oxr_instance_init_system_locked.
1721 struct os_mutex system_init_lock;
1722
1723 // Hardcoded single system.
1724 struct oxr_system system;
1725
1726 struct time_state *timekeeping;
1727
1728 struct
1729 {
1730 struct u_hashset *name_store;
1731 struct u_hashset *loc_store;
1732 } action_sets;
1733
1734 //! Path store, for looking up paths.
1735 struct u_hashset *path_store;
1736 //! Mapping from ID to path.
1737 struct oxr_path **path_array;
1738 //! Total length of path array.
1739 size_t path_array_length;
1740 //! Number of paths in the array (0 is always null).
1741 size_t path_num;
1742
1743 // Event queue.
1744 struct
1745 {
1746 struct os_mutex mutex;
1747 struct oxr_event *last;
1748 struct oxr_event *next;
1749 } event;
1750
1751 //! Interaction profile bindings that have been suggested by the client.
1753 size_t profile_count;
1754
1755 struct oxr_session *sessions;
1756
1757 struct
1758 {
1759
1760#define SUBACTION_PATH_MEMBER(X) XrPath X;
1761 OXR_FOR_EACH_SUBACTION_PATH(SUBACTION_PATH_MEMBER)
1762
1763#undef SUBACTION_PATH_MEMBER
1764 } path_cache;
1765
1766 struct
1767 {
1768 struct
1769 {
1770 struct
1771 {
1772 uint32_t major;
1773 uint32_t minor;
1774 uint32_t patch;
1775 const char *name; //< Engine name, not freed.
1776 } engine;
1777 } detected;
1778 } appinfo;
1779
1780 struct
1781 {
1782 /*!
1783 * Some applications can't handle depth formats, or they trigger
1784 * a bug in a specific version of the application or engine.
1785 * This flag only disables depth formats
1786 * @see disable_vulkan_format_depth_stencil for depth-stencil formats.
1787 */
1789
1790 /*!
1791 * Some applications can't handle depth stencil formats, or they
1792 * trigger a bug in a specific version of the application or
1793 * engine.
1794 *
1795 * This flag only disables depth-stencil formats,
1796 * @see disable_vulkan_format_depth flag for depth only formats.
1797 *
1798 * In the past it was used to work around a bug in Unreal's
1799 * VulkanRHI backend.
1800 */
1802
1803 //! Unreal 4 has a bug calling xrEndSession; the function should just exit
1804 bool skip_end_session;
1805
1806 /*!
1807 * Return XR_ERROR_REFERENCE_SPACE_UNSUPPORTED instead of
1808 * XR_ERROR_VALIDATION_FAILURE in xrCreateReferenceSpace.
1809 */
1811
1812 //! For applications that rely on views being parallel, notably some OpenVR games with OpenComposite.
1814
1815 //! For applications that use stage and don't offer recentering.
1817 } quirks;
1818
1819 //! Debug messengers
1820 struct oxr_debug_messenger *messengers[XRT_MAX_HANDLE_CHILDREN];
1821
1822 bool lifecycle_verbose;
1823 bool debug_views;
1824 bool debug_spaces;
1825 bool debug_bindings;
1826
1827#ifdef XRT_FEATURE_RENDERDOC
1828 RENDERDOC_API_1_4_1 *rdoc_api;
1829#endif
1830
1831#ifdef XRT_OS_ANDROID
1832 enum xrt_android_lifecycle_event activity_state;
1833#endif // XRT_OS_ANDROID
1834};
1835
1836/*!
1837 * Object that client program interact with.
1838 *
1839 * Parent type/handle is @ref oxr_instance
1840 *
1841 * @obj{XrSession}
1842 * @extends oxr_handle_base
1843 */
1845{
1846 //! Common structure for things referred to by OpenXR handles.
1847 struct oxr_handle_base handle;
1848 struct oxr_system *sys;
1849
1850 //! What graphics type was this session created with.
1852
1853 //! The @ref xrt_session backing this session.
1855
1856 //! Native compositor that is wrapped by client compositors.
1857 struct xrt_compositor_native *xcn;
1858
1859 struct xrt_compositor *compositor;
1860
1861 struct oxr_session *next;
1862
1863 XrSessionState state;
1864
1865 /*!
1866 * This is set in xrBeginSession and is the primaryViewConfiguration
1867 * argument, this is then used in xrEndFrame to know which view
1868 * configuration the application is submitting it's frame in.
1869 */
1870 XrViewConfigurationType current_view_config_type;
1871
1872 /*!
1873 * There is a extra state between xrBeginSession has been called and
1874 * the first xrEndFrame has been called. These are to track this.
1875 */
1876 bool has_ended_once;
1877
1878 bool compositor_visible;
1879 bool compositor_focused;
1880
1881 // the number of xrWaitFrame calls that did not yet have a corresponding
1882 // xrEndFrame or xrBeginFrame (discarded frame) call
1883 int active_wait_frames;
1884 struct os_mutex active_wait_frames_lock;
1885
1886 bool frame_started;
1887 bool exiting;
1888
1889 struct
1890 {
1891 int64_t waited;
1892 int64_t begun;
1893 } frame_id;
1894
1895 struct oxr_frame_sync frame_sync;
1896
1897 /*!
1898 * Used to implement precise extra sleeping in wait frame.
1899 */
1901
1902 /*!
1903 * An array of action set attachments that this session owns.
1904 *
1905 * If non-null, this means action sets have been attached to this
1906 * session.
1907 */
1909
1910 /*!
1911 * Length of @ref oxr_session::act_set_attachments.
1912 */
1914
1915 /*!
1916 * A map of action set key to action set attachments.
1917 *
1918 * If non-null, this means action sets have been attached to this
1919 * session, since this map points to elements of
1920 * oxr_session::act_set_attachments
1921 */
1923
1924 /*!
1925 * A map of action key to action attachment.
1926 *
1927 * The action attachments are actually owned by the action set
1928 * attachments, but we own the action set attachments, so this is OK.
1929 *
1930 * If non-null, this means action sets have been attached to this
1931 * session, since this map points to @p oxr_action_attachment members of
1932 * @ref oxr_session::act_set_attachments elements.
1933 */
1935
1936 /*!
1937 * Clone of all suggested binding profiles at the point of action set/session attachment.
1938 * @ref oxr_session_attach_action_sets
1939 */
1941 struct oxr_interaction_profile **profiles_on_attachment;
1942
1943 /*!
1944 * Currently bound interaction profile.
1945 * @{
1946 */
1947
1948#define OXR_PATH_MEMBER(X) XrPath X;
1949
1951#undef OXR_PATH_MEMBER
1952 /*!
1953 * @}
1954 */
1956 /*!
1957 * IPD, to be expanded to a proper 3D relation.
1958 */
1959 float ipd_meters;
1961 /*!
1962 * Frame timing debug output.
1964 bool frame_timing_spew;
1965
1966 //! Extra sleep in wait frame.
1969 /*!
1970 * To pipe swapchain creation to right code.
1971 */
1972 XrResult (*create_swapchain)(struct oxr_logger *,
1973 struct oxr_session *sess,
1974 const XrSwapchainCreateInfo *,
1975 struct oxr_swapchain **);
1976
1977 /*! initial relation of head in "global" space.
1978 * Used as reference for local space. */
1980
1981 bool has_lost;
1982};
1983
1984/*!
1985 * Returns XR_SUCCESS or XR_SESSION_LOSS_PENDING as appropriate.
1987 * @public @memberof oxr_session
1988 */
1989static inline XrResult
1991{
1992 switch (session->state) {
1993 case XR_SESSION_STATE_LOSS_PENDING: return XR_SESSION_LOSS_PENDING;
1994 default: return XR_SUCCESS;
1995 }
1996}
1997
1998/*!
1999 * Returns XR_SUCCESS, XR_SESSION_LOSS_PENDING, or XR_SESSION_NOT_FOCUSED, as
2000 * appropriate.
2002 * @public @memberof oxr_session
2003 */
2004static inline XrResult
2006{
2007 switch (session->state) {
2008 case XR_SESSION_STATE_LOSS_PENDING: return XR_SESSION_LOSS_PENDING;
2009 case XR_SESSION_STATE_FOCUSED: return XR_SUCCESS;
2010 default: return XR_SESSION_NOT_FOCUSED;
2011 }
2012}
2013
2014#ifdef OXR_HAVE_FB_display_refresh_rate
2015XrResult
2016oxr_session_get_display_refresh_rate(struct oxr_logger *log, struct oxr_session *sess, float *displayRefreshRate);
2017
2018XrResult
2019oxr_session_request_display_refresh_rate(struct oxr_logger *log, struct oxr_session *sess, float displayRefreshRate);
2020#endif // OXR_HAVE_FB_display_refresh_rate
2021
2022/*!
2023 * dpad settings we need extracted from XrInteractionProfileDpadBindingEXT
2024 *
2025 * @ingroup oxr_input
2026 */
2027struct oxr_dpad_settings
2028{
2029 float forceThreshold;
2030 float forceThresholdReleased;
2031 float centerRegion;
2032 float wedgeAngle;
2033 bool isSticky;
2034};
2036/*!
2037 * dpad binding extracted from XrInteractionProfileDpadBindingEXT
2038 */
2040{
2041 XrPath binding;
2042 struct oxr_dpad_settings settings;
2043};
2044
2045/*!
2046 * A entry in the dpad state for one action set.
2047 *
2048 * @ingroup oxr_input
2049 */
2050struct oxr_dpad_entry
2051{
2052#ifdef XR_EXT_dpad_binding
2053 struct oxr_dpad_binding_modification dpads[4];
2054 uint32_t dpad_count;
2055#endif
2056
2057 uint64_t key;
2058};
2059
2060/*!
2061 * Holds dpad binding state for a single interaction profile.
2062 *
2063 * @ingroup oxr_input
2064 */
2065struct oxr_dpad_state
2066{
2067 struct u_hashmap_int *uhi;
2068};
2070/*!
2071 * dpad emulation settings from oxr_interaction_profile
2072 */
2073struct oxr_dpad_emulation
2074{
2075 enum oxr_subaction_path subaction_path;
2076 XrPath *paths;
2077 uint32_t path_count;
2078 enum xrt_input_name position;
2079 enum xrt_input_name activate; // Can be zero
2080};
2082/*!
2083 * A single interaction profile.
2084 */
2087 XrPath path;
2088
2089 //! Used to lookup @ref xrt_binding_profile for fallback.
2091
2092 //! Name presented to the user.
2093 const char *localized_name;
2094
2095 struct oxr_binding *bindings;
2096 size_t binding_count;
2097
2098 struct oxr_dpad_emulation *dpads;
2099 size_t dpad_count;
2100
2101 struct oxr_dpad_state dpad_state;
2102};
2104/*!
2105 * Interaction profile binding state.
2106 */
2107struct oxr_binding
2108{
2109 XrPath *paths;
2110 uint32_t path_count;
2111
2112 //! Name presented to the user.
2113 const char *localized_name;
2114
2115 enum oxr_subaction_path subaction_path;
2117 uint32_t act_key_count;
2118 uint32_t *act_keys;
2119 //! store which entry in paths was suggested, for each action key
2121
2122 enum xrt_input_name input;
2123 enum xrt_input_name dpad_activate;
2124
2125 enum xrt_output_name output;
2126};
2127
2128/*!
2129 * @defgroup oxr_input OpenXR input
2130 * @ingroup oxr_main
2131 *
2132 * @brief The action-set/action-based input subsystem of OpenXR.
2133 *
2134 *
2135 * Action sets are created as children of the Instance, but are primarily used
2136 * with one or more Sessions. They may be used with multiple sessions at a time,
2137 * so we can't just put the per-session information directly in the action set
2138 * or action. Instead, we have the `_attachment `structures, which mirror the
2139 * action sets and actions but are rooted under the Session:
2140 *
2141 * - For every action set attached to a session, that session owns a @ref
2142 * oxr_action_set_attachment.
2143 * - For each action in those attached action sets, the action set attachment
2144 * owns an @ref oxr_action_attachment.
2145 *
2146 * We go from the public handle to the `_attachment` structure by using a `key`
2147 * value and a hash map: specifically, we look up the
2148 * oxr_action_set::act_set_key and oxr_action::act_key in the session.
2149 *
2150 * ![](monado-input-class-relationships.drawio.svg)
2151 */
2152
2153/*!
2154 * A parsed equivalent of a list of sub-action paths.
2155 *
2156 * If @p any is true, then no paths were provided, which typically means any
2157 * input is acceptable.
2159 * @ingroup oxr_main
2160 * @ingroup oxr_input
2161 */
2163{
2164 bool any;
2165#define OXR_SUBPATH_MEMBER(X) bool X;
2166 OXR_FOR_EACH_SUBACTION_PATH(OXR_SUBPATH_MEMBER)
2167#undef OXR_SUBPATH_MEMBER
2168};
2169
2170/*!
2171 * Helper function to determine if the set of paths in @p a is a subset of the
2172 * paths in @p b.
2173 *
2174 * @public @memberof oxr_subaction_paths
2175 */
2176static inline bool
2178{
2179#define OXR_CHECK_SUBACTION_PATHS(X) \
2180 if (a->X && !b->X) { \
2181 return false; \
2182 }
2183 OXR_FOR_EACH_SUBACTION_PATH(OXR_CHECK_SUBACTION_PATHS)
2184#undef OXR_CHECK_SUBACTION_PATHS
2185 return true;
2186}
2187
2188/*!
2189 * The data associated with the attachment of an Action Set (@ref
2190 * oxr_action_set) to as Session (@ref oxr_session).
2191 *
2192 * This structure has no pointer to the @ref oxr_action_set that created it
2193 * because the application is allowed to destroy an action before the session,
2194 * which should change nothing except not allow the application to use the
2195 * corresponding data anymore.
2196 *
2197 * @ingroup oxr_input
2199 * @see oxr_action_set
2200 */
2202{
2203 //! Owning session.
2205
2206 //! Action set refcounted data
2208
2209 //! Unique key for the session hashmap.
2210 uint32_t act_set_key;
2211
2212 //! Which sub-action paths are requested on the latest sync.
2214
2215 //! An array of action attachments we own.
2217
2218 /*!
2219 * Length of @ref oxr_action_set_attachment::act_attachments.
2220 */
2222};
2223
2224/*!
2225 * De-initialize an action set attachment and its action attachments.
2226 *
2227 * Frees the action attachments, but does not de-allocate the action set
2228 * attachment.
2229 *
2230 * @public @memberof oxr_action_set_attachment
2231 */
2232void
2234
2235
2236/*!
2237 * The state of a action input.
2238 *
2239 * @ingroup oxr_input
2240 *
2241 * @see oxr_action_attachment
2243struct oxr_action_state
2244{
2245 /*!
2246 * The actual value - must interpret using action type
2247 */
2248 union xrt_input_value value;
2249
2250 //! Is this active (bound and providing input)?
2252
2253 // Was this changed.
2254 bool changed;
2255
2256 //! When was this last changed.
2257 XrTime timestamp;
2258};
2259
2260/*!
2261 * A input action pair of a @ref xrt_input and a @ref xrt_device, along with the
2262 * required transform.
2264 * @ingroup oxr_input
2265 *
2266 * @see xrt_device
2267 * @see xrt_input
2268 */
2269struct oxr_action_input
2270{
2271 struct xrt_device *xdev; // Used for poses and transform is null.
2272 struct xrt_input *input; // Ditto
2273 enum xrt_input_name dpad_activate_name; // used to activate dpad emulation if present
2274 struct xrt_input *dpad_activate; // used to activate dpad emulation if present
2275 struct oxr_input_transform *transforms;
2276 size_t transform_count;
2277 XrPath bound_path;
2278};
2279
2280/*!
2281 * A output action pair of a @ref xrt_output_name and a @ref xrt_device.
2283 * @ingroup oxr_input
2284 *
2285 * @see xrt_device
2286 * @see xrt_output_name
2287 */
2288struct oxr_action_output
2289{
2290 struct xrt_device *xdev;
2291 enum xrt_output_name name;
2292 XrPath bound_path;
2293};
2294
2295
2296/*!
2297 * The set of inputs/outputs for a single sub-action path for an action.
2298 *
2299 * Each @ref oxr_action_attachment has one of these for every known sub-action
2300 * path in the spec. Many, or even most, will be "empty".
2301 *
2302 * A single action will either be input or output, not both.
2303 *
2304 * @ingroup oxr_input
2305 *
2306 * @see oxr_action_attachment
2307 */
2308struct oxr_action_cache
2309{
2310 struct oxr_action_state current;
2311
2312 size_t input_count;
2313 struct oxr_action_input *inputs;
2314
2315 int64_t stop_output_time;
2316 size_t output_count;
2317 struct oxr_action_output *outputs;
2318};
2319
2320/*!
2321 * Data associated with an Action that has been attached to a Session.
2322 *
2323 * More information on the action vs action attachment and action set vs action
2324 * set attachment parallel is in the docs for @ref oxr_input
2325 *
2326 * @ingroup oxr_input
2328 * @see oxr_action
2329 */
2331{
2332 //! The owning action set attachment
2334
2335 //! This action's refcounted data
2336 struct oxr_action_ref *act_ref;
2337
2338 /*!
2339 * The corresponding session.
2340 *
2341 * This will always be valid: the session outlives this object because
2342 * it owns act_set_attached.
2343 */
2344 struct oxr_session *sess;
2345
2346 //! Unique key for the session hashmap.
2347 uint32_t act_key;
2348
2350 /*!
2351 * For pose actions any subaction paths are special treated, at bind
2352 * time we pick one subaction path and stick to it as long as the action
2353 * lives.
2354 */
2356
2357 struct oxr_action_state any_state;
2358
2359#define OXR_CACHE_MEMBER(X) struct oxr_action_cache X;
2360 OXR_FOR_EACH_SUBACTION_PATH(OXR_CACHE_MEMBER)
2361#undef OXR_CACHE_MEMBER
2362};
2363
2364/*!
2365 * @}
2366 */
2367
2368
2369static inline bool
2370oxr_space_type_is_reference(enum oxr_space_type space_type)
2371{
2372 switch (space_type) {
2373 case OXR_SPACE_TYPE_REFERENCE_VIEW:
2374 case OXR_SPACE_TYPE_REFERENCE_LOCAL:
2375 case OXR_SPACE_TYPE_REFERENCE_LOCAL_FLOOR:
2376 case OXR_SPACE_TYPE_REFERENCE_STAGE:
2377 case OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_MSFT:
2378 case OXR_SPACE_TYPE_REFERENCE_COMBINED_EYE_VARJO:
2379 case OXR_SPACE_TYPE_REFERENCE_LOCALIZATION_MAP_ML:
2380 // These are reference spaces.
2381 return true;
2382
2383 case OXR_SPACE_TYPE_ACTION:
2384 case OXR_SPACE_TYPE_XDEV_POSE:
2385 // These are not reference spaces.
2386 return false;
2387 }
2388
2389 // Handles invalid value.
2390 return false;
2391}
2392
2393
2394/*!
2395 * Can be one of several reference space types, or a space that is bound to an
2396 * action.
2397 *
2398 * Parent type/handle is @ref oxr_session
2400 * @obj{XrSpace}
2401 * @extends oxr_handle_base
2403struct oxr_space
2404{
2405 //! Common structure for things referred to by OpenXR handles.
2406 struct oxr_handle_base handle;
2407
2408 //! Owner of this space.
2409 struct oxr_session *sess;
2410
2411 //! Pose that was given during creation.
2412 struct xrt_pose pose;
2413
2414 //! Action key from which action this space was created from.
2415 uint32_t act_key;
2416
2417 //! What kind of space is this?
2419
2420 //! Which sub action path is this?
2422
2423 struct
2424 {
2425 struct xrt_space *xs;
2426 struct xrt_device *xdev;
2427 enum xrt_input_name name;
2428 } action;
2429
2430 struct
2431 {
2432 struct xrt_space *xs;
2433 } xdev_pose;
2434};
2435
2436/*!
2437 * A set of images used for rendering.
2438 *
2439 * Parent type/handle is @ref oxr_session
2441 * @obj{XrSwapchain}
2442 * @extends oxr_handle_base
2444struct oxr_swapchain
2445{
2446 //! Common structure for things referred to by OpenXR handles.
2447 struct oxr_handle_base handle;
2448
2449 //! Owner of this swapchain.
2450 struct oxr_session *sess;
2451
2452 //! Compositor swapchain.
2453 struct xrt_swapchain *swapchain;
2454
2455 //! Swapchain size.
2456 uint32_t width, height;
2457
2458 //! For 1 is 2D texture, greater then 1 2D array texture.
2459 uint32_t array_layer_count;
2460
2461 //! The number of cubemap faces. 6 for cubemaps, 1 otherwise.
2462 uint32_t face_count;
2463
2464 struct
2465 {
2466 enum oxr_image_state state;
2467 } images[XRT_MAX_SWAPCHAIN_IMAGES];
2468
2469 struct
2470 {
2471 size_t num;
2472 struct u_index_fifo fifo;
2473 } acquired;
2474
2475 struct
2476 {
2477 bool yes;
2478 int index;
2479 } inflight; // This is the image that the app is working on.
2480
2481 struct
2482 {
2483 bool yes;
2484 int index;
2485 } released;
2486
2487 // Is this a static swapchain, needed for acquire semantics.
2488 bool is_static;
2489
2490
2491 XrResult (*destroy)(struct oxr_logger *, struct oxr_swapchain *);
2492
2493 XrResult (*enumerate_images)(struct oxr_logger *,
2494 struct oxr_swapchain *,
2495 uint32_t,
2496 XrSwapchainImageBaseHeader *);
2497
2498 XrResult (*acquire_image)(struct oxr_logger *,
2499 struct oxr_swapchain *,
2500 const XrSwapchainImageAcquireInfo *,
2501 uint32_t *);
2502
2503 XrResult (*wait_image)(struct oxr_logger *, struct oxr_swapchain *, const XrSwapchainImageWaitInfo *);
2504
2505 XrResult (*release_image)(struct oxr_logger *, struct oxr_swapchain *, const XrSwapchainImageReleaseInfo *);
2506};
2507
2508struct oxr_refcounted
2509{
2510 struct xrt_reference base;
2511 //! Destruction callback
2512 void (*destroy)(struct oxr_refcounted *);
2513};
2514
2515/*!
2516 * Increase the reference count of @p orc.
2517 */
2518static inline void
2520{
2522}
2523
2524/*!
2525 * Decrease the reference count of @p orc, destroying it if it reaches 0.
2526 */
2527static inline void
2529{
2530 if (xrt_reference_dec_and_is_zero(&orc->base)) {
2531 orc->destroy(orc);
2532 }
2533}
2534
2535/*!
2536 * The reference-counted data of an action set.
2537 *
2538 * One or more sessions may still need this data after the application destroys
2539 * its XrActionSet handle, so this data is refcounted.
2540 *
2541 * @ingroup oxr_input
2542 *
2543 * @see oxr_action_set
2544 * @extends oxr_refcounted
2545 */
2546struct oxr_action_set_ref
2547{
2548 struct oxr_refcounted base;
2549
2550 //! Application supplied name of this action.
2551 char name[XR_MAX_ACTION_SET_NAME_SIZE];
2552
2553 /*!
2554 * Has this action set even been attached to any session, marking it as
2555 * immutable.
2557 bool ever_attached;
2558
2559 //! Unique key for the session hashmap.
2560 uint32_t act_set_key;
2561
2562 //! Application supplied action set priority.
2563 uint32_t priority;
2564
2565 struct
2566 {
2567 struct u_hashset *name_store;
2568 struct u_hashset *loc_store;
2569 } actions;
2570
2571 struct oxr_subaction_paths permitted_subaction_paths;
2572};
2573
2574/*!
2575 * A group of actions.
2576 *
2577 * Parent type/handle is @ref oxr_instance
2578 *
2579 * Note, however, that an action set must be "attached" to a session
2580 * ( @ref oxr_session ) to be used and not just configured.
2581 * The corresponding data is in @ref oxr_action_set_attachment.
2582 *
2583 * @ingroup oxr_input
2585 * @obj{XrActionSet}
2586 * @extends oxr_handle_base
2588struct oxr_action_set
2589{
2590 //! Common structure for things referred to by OpenXR handles.
2591 struct oxr_handle_base handle;
2592
2593 //! Owner of this action set.
2594 struct oxr_instance *inst;
2595
2596 /*!
2597 * The data for this action set that must live as long as any session we
2598 * are attached to.
2599 */
2600 struct oxr_action_set_ref *data;
2602
2603 /*!
2604 * Unique key for the session hashmap.
2605 *
2606 * Duplicated from oxr_action_set_ref::act_set_key for efficiency.
2608 uint32_t act_set_key;
2609
2610 //! The item in the name hashset.
2611 struct u_hashset_item *name_item;
2612
2613 //! The item in the localized hashset.
2614 struct u_hashset_item *loc_item;
2615};
2616
2617/*!
2618 * The reference-counted data of an action.
2619 *
2620 * One or more sessions may still need this data after the application destroys
2621 * its XrAction handle, so this data is refcounted.
2622 *
2623 * @ingroup oxr_input
2624 *
2625 * @see oxr_action
2626 * @extends oxr_refcounted
2627 */
2628struct oxr_action_ref
2630 struct oxr_refcounted base;
2631
2632 //! Application supplied name of this action.
2633 char name[XR_MAX_ACTION_NAME_SIZE];
2634
2635 //! Unique key for the session hashmap.
2636 uint32_t act_key;
2637
2638 //! Type this action was created with.
2639 XrActionType action_type;
2640
2641 //! Which sub action paths that this action was created with.
2643};
2644
2645/*!
2646 * A single action.
2647 *
2648 * Parent type/handle is @ref oxr_action_set
2649 *
2650 * For actual usage, an action is attached to a session: the corresponding data
2651 * is in @ref oxr_action_attachment
2652 *
2653 * @ingroup oxr_input
2655 * @obj{XrAction}
2656 * @extends oxr_handle_base
2658struct oxr_action
2659{
2660 //! Common structure for things referred to by OpenXR handles.
2662
2663 //! Owner of this action.
2664 struct oxr_action_set *act_set;
2665
2666 //! The data for this action that must live as long as any session we
2667 //! are attached to.
2669
2670 /*!
2671 * Unique key for the session hashmap.
2672 *
2673 * Duplicated from oxr_action_ref::act_key for efficiency.
2675 uint32_t act_key;
2676
2677 //! The item in the name hashset.
2678 struct u_hashset_item *name_item;
2679
2680 //! The item in the localized hashset.
2681 struct u_hashset_item *loc_item;
2682};
2683
2685 * Debug object created by the client program.
2686 *
2687 * Parent type/handle is @ref oxr_instance
2688 *
2689 * @obj{XrDebugUtilsMessengerEXT}
2692{
2693 //! Common structure for things referred to by OpenXR handles.
2694 struct oxr_handle_base handle;
2695
2696 //! Owner of this messenger.
2697 struct oxr_instance *inst;
2698
2699 //! Severities to submit to this messenger
2700 XrDebugUtilsMessageSeverityFlagsEXT message_severities;
2701
2702 //! Types to submit to this messenger
2703 XrDebugUtilsMessageTypeFlagsEXT message_types;
2704
2705 //! Callback function
2706 PFN_xrDebugUtilsMessengerCallbackEXT user_callback;
2707
2708 //! Opaque user data
2709 void *XR_MAY_ALIAS user_data;
2710};
2713{
2714 //! xrt_device backing this hand tracker
2715 struct xrt_device *xdev;
2716
2717 //! the input name associated with this hand tracker
2719};
2720
2721static inline int
2722oxr_hand_tracking_data_source_cmp(const void *p1, const void *p2)
2723{
2724 const struct oxr_hand_tracking_data_source *lhs = (const struct oxr_hand_tracking_data_source *)p1;
2725 const struct oxr_hand_tracking_data_source *rhs = (const struct oxr_hand_tracking_data_source *)p2;
2726 assert(lhs && rhs);
2727 if (rhs->input_name < lhs->input_name)
2728 return -1;
2729 if (rhs->input_name > lhs->input_name)
2730 return 1;
2731 return 0;
2732}
2733
2734/*!
2735 * A hand tracker.
2737 * Parent type/handle is @ref oxr_instance
2738 *
2740 * @obj{XrHandTrackerEXT}
2741 * @extends oxr_handle_base
2743struct oxr_hand_tracker
2744{
2745 //! Common structure for things referred to by OpenXR handles.
2746 struct oxr_handle_base handle;
2747
2748 //! Owner of this hand tracker.
2749 struct oxr_session *sess;
2750
2751 struct oxr_hand_tracking_data_source unobstructed;
2752 struct oxr_hand_tracking_data_source conforming;
2753
2754 /*!
2755 * An ordered list of requested data-source from above options (@ref
2756 * oxr_hand_tracker::[unobstructed|conforming]), ordered by
2757 * @ref oxr_hand_tracker::input_name (see @ref oxr_hand_tracking_data_source_cmp)
2758 *
2759 * if OXR_HAVE_EXT_hand_tracking_data_source is not defined the list
2760 * will contain refs to all the above options.
2761 */
2763 uint32_t requested_sources_count;
2764
2765 XrHandEXT hand;
2766 XrHandJointSetEXT hand_joint_set;
2767};
2768
2769#ifdef OXR_HAVE_FB_passthrough
2770
2771struct oxr_passthrough
2772{
2773 struct oxr_handle_base handle;
2774
2775 struct oxr_session *sess;
2776
2777 XrPassthroughFlagsFB flags;
2778
2779 bool paused;
2780};
2781
2782struct oxr_passthrough_layer
2783{
2784 struct oxr_handle_base handle;
2785
2786 struct oxr_session *sess;
2787
2788 XrPassthroughFB passthrough;
2789
2790 XrPassthroughFlagsFB flags;
2791
2792 XrPassthroughLayerPurposeFB purpose;
2793
2794 bool paused;
2795
2796 XrPassthroughStyleFB style;
2797 XrPassthroughColorMapMonoToRgbaFB monoToRgba;
2798 XrPassthroughColorMapMonoToMonoFB monoToMono;
2799 XrPassthroughBrightnessContrastSaturationFB brightnessContrastSaturation;
2800};
2801
2802XrResult
2803oxr_passthrough_create(struct oxr_logger *log,
2804 struct oxr_session *sess,
2805 const XrPassthroughCreateInfoFB *createInfo,
2806 struct oxr_passthrough **out_passthrough);
2807
2808XrResult
2809oxr_passthrough_layer_create(struct oxr_logger *log,
2810 struct oxr_session *sess,
2811 const XrPassthroughLayerCreateInfoFB *createInfo,
2812 struct oxr_passthrough_layer **out_layer);
2813
2814static inline XrPassthroughFB
2815oxr_passthrough_to_openxr(struct oxr_passthrough *passthrough)
2816{
2817 return XRT_CAST_PTR_TO_OXR_HANDLE(XrPassthroughFB, passthrough);
2818}
2819
2820static inline XrPassthroughLayerFB
2821oxr_passthrough_layer_to_openxr(struct oxr_passthrough_layer *passthroughLayer)
2822{
2823 return XRT_CAST_PTR_TO_OXR_HANDLE(XrPassthroughLayerFB, passthroughLayer);
2824}
2825
2826XrResult
2827oxr_event_push_XrEventDataPassthroughStateChangedFB(struct oxr_logger *log,
2828 struct oxr_session *sess,
2829 XrPassthroughStateChangedFlagsFB flags);
2830
2831#endif // OXR_HAVE_FB_passthrough
2832
2833#ifdef OXR_HAVE_HTC_facial_tracking
2834/*!
2835 * HTC specific Facial tracker.
2836 *
2837 * Parent type/handle is @ref oxr_instance
2838 *
2839 *
2840 * @obj{XrFacialTrackerHTC}
2841 * @extends oxr_handle_base
2842 */
2843struct oxr_facial_tracker_htc
2844{
2845 //! Common structure for things referred to by OpenXR handles.
2846 struct oxr_handle_base handle;
2847
2848 //! Owner of this face tracker.
2849 struct oxr_session *sess;
2850
2851 //! xrt_device backing this face tracker
2852 struct xrt_device *xdev;
2853
2854 //! Type of facial tracking, eyes or lips
2855 enum xrt_facial_tracking_type_htc facial_tracking_type;
2856};
2857
2858XrResult
2859oxr_facial_tracker_htc_create(struct oxr_logger *log,
2860 struct oxr_session *sess,
2861 const XrFacialTrackerCreateInfoHTC *createInfo,
2862 struct oxr_facial_tracker_htc **out_face_tracker_htc);
2863
2864XrResult
2865oxr_get_facial_expressions_htc(struct oxr_logger *log,
2866 struct oxr_facial_tracker_htc *facial_tracker_htc,
2867 XrFacialExpressionsHTC *facialExpressions);
2868#endif
2869
2870#ifdef OXR_HAVE_FB_body_tracking
2871/*!
2872 * FB specific Body tracker.
2873 *
2874 * Parent type/handle is @ref oxr_instance
2875 *
2876 * @obj{XrBodyTrackerFB}
2877 * @extends oxr_handle_base
2878 */
2879struct oxr_body_tracker_fb
2880{
2881 //! Common structure for things referred to by OpenXR handles.
2882 struct oxr_handle_base handle;
2883
2884 //! Owner of this face tracker.
2885 struct oxr_session *sess;
2886
2887 //! xrt_device backing this face tracker
2888 struct xrt_device *xdev;
2889
2890 //! Type of the body joint set e.g. XR_FB_body_tracking or XR_META_body_tracking_full_body
2891 enum xrt_body_joint_set_type_fb joint_set_type;
2892};
2893
2894XrResult
2895oxr_create_body_tracker_fb(struct oxr_logger *log,
2896 struct oxr_session *sess,
2897 const XrBodyTrackerCreateInfoFB *createInfo,
2898 struct oxr_body_tracker_fb **out_body_tracker_fb);
2899
2900XrResult
2901oxr_get_body_skeleton_fb(struct oxr_logger *log,
2902 struct oxr_body_tracker_fb *body_tracker_fb,
2903 XrBodySkeletonFB *skeleton);
2904
2905XrResult
2906oxr_locate_body_joints_fb(struct oxr_logger *log,
2907 struct oxr_body_tracker_fb *body_tracker_fb,
2908 struct oxr_space *base_spc,
2909 const XrBodyJointsLocateInfoFB *locateInfo,
2910 XrBodyJointLocationsFB *locations);
2911#endif
2912
2913#ifdef OXR_HAVE_FB_face_tracking2
2914/*!
2915 * FB specific Face tracker2.
2916 *
2917 * Parent type/handle is @ref oxr_instance
2918 *
2919 * @obj{XrFaceTracker2FB}
2920 * @extends oxr_handle_base
2921 */
2922struct oxr_face_tracker2_fb
2923{
2924 //! Common structure for things referred to by OpenXR handles.
2925 struct oxr_handle_base handle;
2926
2927 //! Owner of this face tracker.
2928 struct oxr_session *sess;
2929
2930 //! xrt_device backing this face tracker
2931 struct xrt_device *xdev;
2932
2933 bool audio_enabled;
2934 bool visual_enabled;
2935};
2936
2937XrResult
2938oxr_face_tracker2_fb_create(struct oxr_logger *log,
2939 struct oxr_session *sess,
2940 const XrFaceTrackerCreateInfo2FB *createInfo,
2941 struct oxr_face_tracker2_fb **out_face_tracker2_fb);
2942
2943XrResult
2944oxr_get_face_expression_weights2_fb(struct oxr_logger *log,
2945 struct oxr_face_tracker2_fb *face_tracker2_fb,
2946 const XrFaceExpressionInfo2FB *expression_info,
2947 XrFaceExpressionWeights2FB *expression_weights);
2948#endif
2949
2950#ifdef OXR_HAVE_MNDX_xdev_space
2951/*!
2952 * Object that holds a list of the current @ref xrt_devices.
2953 *
2954 * Parent type/handle is @ref oxr_session
2955 *
2956 * @obj{XrXDevList}
2957 * @extends oxr_handle_base
2958 */
2959struct oxr_xdev_list
2960{
2961 //! Common structure for things referred to by OpenXR handles.
2962 struct oxr_handle_base handle;
2963
2964 //! Owner of this @ref xrt_device list.
2965 struct oxr_session *sess;
2966
2967 //! Monotonically increasing number.
2968 uint64_t generation_number;
2969
2970 uint64_t ids[XRT_SYSTEM_MAX_DEVICES];
2971 struct xrt_device *xdevs[XRT_SYSTEM_MAX_DEVICES];
2973
2974 //! Counts ids, names and xdevs.
2975 uint32_t device_count;
2976};
2977#endif // OXR_HAVE_MNDX_xdev_space
2978
2979#ifdef OXR_HAVE_EXT_plane_detection
2980/*!
2981 * A Plane Detector.
2982 *
2983 * Parent type/handle is @ref oxr_session
2984 *
2985 *
2986 * @obj{XrPlaneDetectorEXT}
2987 * @extends oxr_handle_base
2988 */
2989struct oxr_plane_detector_ext
2990{
2991 //! Common structure for things referred to by OpenXR handles.
2992 struct oxr_handle_base handle;
2993
2994 //! Owner of this anchor.
2995 struct oxr_session *sess;
2996
2997 //! Plane detector flags.
2999
3000 //! The last known state of this plane detector.
3001 XrPlaneDetectionStateEXT state;
3002
3003 //! Whether the last DONE plane detection has been retrieved from the xdev.
3004 bool retrieved;
3005
3006 //! The device that this plane detector belongs to.
3007 struct xrt_device *xdev;
3008
3009 //! Detected planes. xrt_plane_detector_locations_ext::relation is kept in xdev space and not updated.
3010 struct xrt_plane_detections_ext detections;
3011
3012 //! Corresponds to xrt_plane_detections_ext::locations, but with OpenXR types and transformed into target space.
3013 //! Enables two call idiom.
3014 XrPlaneDetectorLocationEXT *xr_locations;
3015
3016 //! A globally unique id for the current plane detection or 0, generated by the xrt_device.
3017 uint64_t detection_id;
3018};
3019#endif // OXR_HAVE_EXT_plane_detection
3020
3021#ifdef OXR_HAVE_EXT_future
3022/*!
3023 * EXT futures.
3024 *
3025 * Parent type/handle is @ref oxr_instance
3026 *
3027 * @obj{XrFutureEXT}
3028 * @extends oxr_handle_base
3029 */
3030struct oxr_future_ext
3031{
3032 //! Common structure for things referred to by OpenXR handles.
3033 struct oxr_handle_base handle;
3034
3035 //! (weak) reference to instance (may or not be a direct parent handle")
3036 struct oxr_instance *inst;
3037
3038 //! Owning session.
3039 struct oxr_session *sess;
3040
3041 //! xrt_future backing this future
3042 struct xrt_future *xft;
3043};
3044
3045/*!
3046 * To go back to a OpenXR object.
3047 *
3048 * @relates oxr_future_ext
3049 */
3050static inline XrFutureEXT
3051oxr_future_ext_to_openxr(struct oxr_future_ext *future_ext)
3052{
3053 return XRT_CAST_PTR_TO_OXR_HANDLE(XrFutureEXT, future_ext);
3054}
3055
3056XrResult
3057oxr_future_create(struct oxr_logger *log,
3058 struct oxr_session *sess,
3059 struct xrt_future *xft,
3060 struct oxr_handle_base *parent_handle,
3061 struct oxr_future_ext **out_oxr_future_ext);
3062
3063XrResult
3064oxr_future_invalidate(struct oxr_logger *log, struct oxr_future_ext *oxr_future);
3065
3066XrResult
3067oxr_future_ext_poll(struct oxr_logger *log, const struct oxr_future_ext *oxr_future, XrFuturePollResultEXT *pollResult);
3068
3069XrResult
3070oxr_future_ext_cancel(struct oxr_logger *log, struct oxr_future_ext *oxr_future);
3071
3072XrResult
3073oxr_future_ext_complete(struct oxr_logger *log,
3074 struct oxr_future_ext *oxr_future,
3075 struct xrt_future_result *out_ft_result);
3076
3077#endif
3078
3079#ifdef OXR_HAVE_EXT_user_presence
3080XrResult
3081oxr_event_push_XrEventDataUserPresenceChangedEXT(struct oxr_logger *log, struct oxr_session *sess, bool isUserPresent);
3082#endif // OXR_HAVE_EXT_user_presence
3083
3084/*!
3085 * @}
3086 */
3087
3088
3089#ifdef __cplusplus
3090}
3091#endif
void oxr_action_set_attachment_teardown(struct oxr_action_set_attachment *act_set_attached)
De-initialize an action set attachment and its action attachments.
Definition: oxr_input.c:224
static void oxr_refcounted_unref(struct oxr_refcounted *orc)
Decrease the reference count of orc, destroying it if it reaches 0.
Definition: oxr_objects.h:2521
XrResult oxr_poll_event(struct oxr_logger *log, struct oxr_instance *inst, XrEventDataBuffer *eventData)
Will return one event if available, also drain the sessions event queues.
Definition: oxr_event.c:400
XrResult oxr_spaces_locate(struct oxr_logger *log, struct oxr_space **spcs, uint32_t spc_count, struct oxr_space *baseSpc, XrTime time, XrSpaceLocations *locations)
Definition: oxr_space.c:295
static XrSwapchain oxr_swapchain_to_openxr(struct oxr_swapchain *sc)
To go back to a OpenXR object.
Definition: oxr_objects.h:998
oxr_image_state
Tracks the state of a image that belongs to a oxr_swapchain.
Definition: oxr_defines.h:94
XrResult oxr_path_get_or_create(struct oxr_logger *log, struct oxr_instance *inst, const char *str, size_t length, XrPath *out_path)
Get the path for the given string if it exists, or create it if it does not.
Definition: oxr_path.c:172
XrResult oxr_d3d_check_luid(struct oxr_logger *log, struct oxr_system *sys, LUID *adapter_luid)
Verify the provided LUID matches the expected one in sys.
Definition: oxr_d3d.cpp:80
XrResult oxr_session_hand_joints(struct oxr_logger *log, struct oxr_hand_tracker *hand_tracker, const XrHandJointsLocateInfoEXT *locateInfo, XrHandJointLocationsEXT *locations)
Definition: oxr_session.c:1387
void oxr_binding_find_bindings_from_act_key(struct oxr_logger *log, struct oxr_interaction_profile *profile, uint32_t key, size_t max_binding_count, struct oxr_binding **out_bindings, size_t *out_binding_count)
Find all bindings that is the given action key is bound to.
Definition: oxr_binding.c:512
XrResult oxr_handle_destroy(struct oxr_logger *log, struct oxr_handle_base *hb)
Destroy the handle's object, as well as all child handles recursively.
Definition: oxr_handle_base.c:197
XrResult oxr_event_remove_session_events(struct oxr_logger *log, struct oxr_session *sess)
This clears all pending events refers to the given session.
Definition: oxr_event.c:368
static XrResult oxr_session_success_result(struct oxr_session *session)
Returns XR_SUCCESS or XR_SESSION_LOSS_PENDING as appropriate.
Definition: oxr_objects.h:1986
XrResult oxr_action_get_pose_input(struct oxr_session *sess, uint32_t act_key, const struct oxr_subaction_paths *subaction_paths_ptr, struct oxr_action_input **out_input)
Find the pose input for the set of subaction_paths.
Definition: oxr_input.c:475
static XrResult oxr_session_success_focused_result(struct oxr_session *session)
Returns XR_SUCCESS, XR_SESSION_LOSS_PENDING, or XR_SESSION_NOT_FOCUSED, as appropriate.
Definition: oxr_objects.h:2001
XrResult oxr_path_only_get(struct oxr_logger *log, struct oxr_instance *inst, const char *str, size_t length, XrPath *out_path)
Only get the path for the given string if it exists.
Definition: oxr_path.c:199
XrResult oxr_space_xdev_pose_create(struct oxr_logger *log, struct oxr_session *sess, struct xrt_device *xdev, enum xrt_input_name name, const struct xrt_pose *pose, struct oxr_space **out_space)
Monado special space that always points to a specific xrt_device and pose, useful when you want to by...
Definition: oxr_space.c:242
void oxr_find_profile_for_device(struct oxr_logger *log, struct oxr_session *sess, struct xrt_device *xdev, struct oxr_interaction_profile **out_p)
Find the best matching profile for the given xrt_device.
Definition: oxr_binding.c:486
XrResult oxr_session_attach_action_sets(struct oxr_logger *log, struct oxr_session *sess, const XrSessionActionSetsAttachInfo *bindInfo)
Definition: oxr_input.c:1752
XRT_CHECK_RESULT XrResult oxr_space_locate_device(struct oxr_logger *log, struct xrt_device *xdev, struct oxr_space *baseSpc, XrTime time, struct xrt_space_relation *out_relation)
Locate the xrt_device in the given base space, useful for implementing hand tracking location look up...
Definition: oxr_space.c:585
static XrDebugUtilsMessengerEXT oxr_messenger_to_openxr(struct oxr_debug_messenger *mssngr)
To go back to a OpenXR object.
Definition: oxr_objects.h:1014
XrResult oxr_space_locate(struct oxr_logger *log, struct oxr_space *spc, struct oxr_space *baseSpc, XrTime time, XrSpaceLocation *location)
Definition: oxr_space.c:452
XrResult oxr_session_frame_end(struct oxr_logger *log, struct oxr_session *sess, const XrFrameEndInfo *frameEndInfo)
Definition: oxr_session_frame_end.c:1645
static XrInstance oxr_instance_to_openxr(struct oxr_instance *inst)
To go back to a OpenXR object.
Definition: oxr_objects.h:232
static XrHandTrackerEXT oxr_hand_tracker_to_openxr(struct oxr_hand_tracker *hand_tracker)
To go back to a OpenXR object.
Definition: oxr_objects.h:403
static XrActionSet oxr_action_set_to_openxr(struct oxr_action_set *act_set)
To go back to a OpenXR object.
Definition: oxr_objects.h:392
bool oxr_classify_subaction_paths(struct oxr_logger *log, const struct oxr_instance *inst, uint32_t subaction_path_count, const XrPath *subaction_paths, struct oxr_subaction_paths *subaction_paths_out)
Helper function to classify subaction_paths.
Definition: oxr_input.c:431
static bool oxr_subaction_paths_is_subset_of(const struct oxr_subaction_paths *a, const struct oxr_subaction_paths *b)
Helper function to determine if the set of paths in a is a subset of the paths in b.
Definition: oxr_objects.h:2172
static XrSession oxr_session_to_openxr(struct oxr_session *sess)
To go back to a OpenXR object.
Definition: oxr_objects.h:803
oxr_session_graphics_ext
What graphics API was this session created with.
Definition: oxr_defines.h:125
static XrAction oxr_action_to_openxr(struct oxr_action *act)
To go back to a OpenXR object.
Definition: oxr_objects.h:427
XrResult oxr_d3d_get_requirements(struct oxr_logger *log, struct oxr_system *sys, LUID *adapter_luid, D3D_FEATURE_LEVEL *min_feature_level)
Common GetRequirements call for D3D11 and D3D12.
Definition: oxr_d3d.cpp:42
bool oxr_xdev_find_input(struct xrt_device *xdev, enum xrt_input_name name, struct xrt_input **out_input)
Return true if it finds an input of that name on this device.
Definition: oxr_xdev.c:90
oxr_space_type
Internal enum for the type of space, lets us reason about action spaces.
Definition: oxr_defines.h:106
XrResult oxr_vk_create_vulkan_instance(struct oxr_logger *log, struct oxr_system *sys, const XrVulkanInstanceCreateInfoKHR *createInfo, VkInstance *vulkanInstance, VkResult *vulkanResult)
Definition: oxr_vulkan.c:230
static void oxr_refcounted_ref(struct oxr_refcounted *orc)
Increase the reference count of orc.
Definition: oxr_objects.h:2512
void oxr_binding_destroy_all(struct oxr_logger *log, struct oxr_instance *inst)
Free all memory allocated by the binding system.
Definition: oxr_binding.c:675
XrResult oxr_session_request_exit(struct oxr_logger *log, struct oxr_session *sess)
Definition: oxr_session.c:426
XrResult(* oxr_handle_destroyer)(struct oxr_logger *log, struct oxr_handle_base *hb)
Function pointer type for a handle destruction function.
Definition: oxr_objects.h:146
void oxr_session_change_state(struct oxr_logger *log, struct oxr_session *sess, XrSessionState state, XrTime time)
Change the state of the session, queues a event.
Definition: oxr_session.c:225
XrResult oxr_system_fill_in(struct oxr_logger *log, struct oxr_instance *inst, XrSystemId systemId, uint32_t view_count, struct oxr_system *sys)
Definition: oxr_system.c:247
XrResult oxr_create_messenger(struct oxr_logger *, struct oxr_instance *inst, const XrDebugUtilsMessengerCreateInfoEXT *, struct oxr_debug_messenger **out_mssngr)
Definition: oxr_messenger.c:41
void oxr_session_binding_destroy_all(struct oxr_logger *log, struct oxr_session *sess)
Free all memory allocated by the binding system.
Definition: oxr_binding.c:683
XrResult oxr_instance_init_system_locked(struct oxr_logger *log, struct oxr_instance *inst)
Must be called with oxr_instance::system_init_lock held.
Definition: oxr_instance.c:470
XrResult oxr_path_get_string(struct oxr_logger *log, const struct oxr_instance *inst, XrPath path, const char **out_str, size_t *out_length)
Get a pointer and length of the internal string.
Definition: oxr_path.c:216
XrResult oxr_session_frame_wait(struct oxr_logger *log, struct oxr_session *sess, XrFrameState *frameState)
Definition: oxr_session.c:878
oxr_handle_state
State of a handle base, to reduce likelihood of going "boom" on out-of-order destruction or other uns...
Definition: oxr_defines.h:48
XrResult oxr_instance_create(struct oxr_logger *log, const XrInstanceCreateInfo *createInfo, XrVersion major_minor, const struct oxr_extension_status *extensions, struct oxr_instance **out_inst)
Creates a instance, does minimal validation of createInfo.
Definition: oxr_instance.c:230
static XrSpace oxr_space_to_openxr(struct oxr_space *spc)
To go back to a OpenXR object.
Definition: oxr_objects.h:920
oxr_subaction_path
Sub action paths.
Definition: oxr_defines.h:65
XrResult oxr_vk_create_vulkan_device(struct oxr_logger *log, struct oxr_system *sys, const XrVulkanDeviceCreateInfoKHR *createInfo, VkDevice *vulkanDevice, VkResult *vulkanResult)
Definition: oxr_vulkan.c:386
const char * oxr_handle_state_to_string(enum oxr_handle_state state)
Returns a human-readable label for a handle state.
Definition: oxr_handle_base.c:42
bool oxr_xdev_find_output(struct xrt_device *xdev, enum xrt_output_name name, struct xrt_output **out_output)
Return true if it finds an output of that name on this device.
Definition: oxr_xdev.c:109
#define XRT_CAST_PTR_TO_OXR_HANDLE(HANDLE_TYPE, PTR)
Cast a pointer to an OpenXR handle in such a way as to avoid warnings.
Definition: oxr_objects.h:76
static XRT_CHECK_RESULT bool xrt_reference_dec_and_is_zero(struct xrt_reference *xref)
Decrement the reference and return true if the value is now zero.
Definition: xrt_defines.h:2251
#define XRT_SYSTEM_MAX_DEVICES
Maximum number of devices simultaneously usable by an implementation of xrt_system_devices.
Definition: xrt_system.h:141
#define XRT_MAX_SWAPCHAIN_IMAGES
Max swapchain images, artificial limit.
Definition: xrt_limits.h:45
xrt_input_name
Every internal input source known to monado with a baked in type.
Definition: xrt_defines.h:1344
static void xrt_reference_inc(struct xrt_reference *xref)
Increment the reference, probably want xrt_reference_inc_and_was_zero.
Definition: xrt_defines.h:2207
xrt_output_name
Name of a output with a baked in type.
Definition: xrt_defines.h:1974
xrt_plane_detector_flags_ext
Flags used when running plane detection.
Definition: xrt_plane_detector.h:46
Wrapper around OS threading native functions.
XrResult oxr_action_get_input_source_localized_name(struct oxr_logger *log, struct oxr_session *sess, const XrInputSourceLocalizedNameGetInfo *getInfo, uint32_t bufferCapacityInput, uint32_t *bufferCountOutput, char *buffer)
Definition: oxr_binding.c:763
Shared internal defines and enums in the state tracker.
Macros for generating extension-related tables and code and inspecting Monado's extension support.
#define OXR_EXTENSION_SUPPORT_GENERATE(_)
Call this, passing a macro taking two parameters, to generate tables, code, etc.
Definition: oxr_extension_support.h:898
The objects that handle session running status and blocking of xrWaitFrame.
XrResult oxr_action_sync_data(struct oxr_logger *log, struct oxr_session *sess, uint32_t countActionSets, const XrActiveActionSet *actionSets, const XrActiveActionSetPrioritiesEXT *activePriorities)
Definition: oxr_input.c:1834
#define OXR_PATH_MEMBER(X)
Currently bound interaction profile.
Definition: oxr_objects.h:1945
Provides a utility macro for dealing with subaction paths.
#define OXR_FOR_EACH_SUBACTION_PATH(_)
Expansion macro (x-macro) that calls the macro you pass with the shorthand name of each subaction pat...
Definition: oxr_subaction.h:39
#define OXR_FOR_EACH_VALID_SUBACTION_PATH(_)
Expansion macro (x-macro) that calls the macro you pass with the shorthand name of each valid subacti...
Definition: oxr_subaction.h:23
Definition: m_space.cpp:87
A wrapper around a native mutex.
Definition: os_threading.h:55
Definition: os_time.h:208
Data associated with an Action that has been attached to a Session.
Definition: oxr_objects.h:2325
struct oxr_subaction_paths any_pose_subaction_path
For pose actions any subaction paths are special treated, at bind time we pick one subaction path and...
Definition: oxr_objects.h:2349
struct oxr_action_ref * act_ref
This action's refcounted data.
Definition: oxr_objects.h:2330
struct oxr_action_set_attachment * act_set_attached
The owning action set attachment.
Definition: oxr_objects.h:2327
uint32_t act_key
Unique key for the session hashmap.
Definition: oxr_objects.h:2341
struct oxr_session * sess
The corresponding session.
Definition: oxr_objects.h:2338
The set of inputs/outputs for a single sub-action path for an action.
Definition: oxr_objects.h:2303
A input action pair of a xrt_input and a xrt_device, along with the required transform.
Definition: oxr_objects.h:2264
A output action pair of a xrt_output_name and a xrt_device.
Definition: oxr_objects.h:2283
The reference-counted data of an action.
Definition: oxr_objects.h:2622
char name[XR_MAX_ACTION_NAME_SIZE]
Application supplied name of this action.
Definition: oxr_objects.h:2626
struct oxr_subaction_paths subaction_paths
Which sub action paths that this action was created with.
Definition: oxr_objects.h:2635
XrActionType action_type
Type this action was created with.
Definition: oxr_objects.h:2632
uint32_t act_key
Unique key for the session hashmap.
Definition: oxr_objects.h:2629
The data associated with the attachment of an Action Set (oxr_action_set) to as Session (oxr_session)...
Definition: oxr_objects.h:2196
struct oxr_action_attachment * act_attachments
An array of action attachments we own.
Definition: oxr_objects.h:2210
struct oxr_session * sess
Owning session.
Definition: oxr_objects.h:2198
struct oxr_action_set_ref * act_set_ref
Action set refcounted data.
Definition: oxr_objects.h:2201
uint32_t act_set_key
Unique key for the session hashmap.
Definition: oxr_objects.h:2204
size_t action_attachment_count
Length of oxr_action_set_attachment::act_attachments.
Definition: oxr_objects.h:2215
struct oxr_subaction_paths requested_subaction_paths
Which sub-action paths are requested on the latest sync.
Definition: oxr_objects.h:2207
The reference-counted data of an action set.
Definition: oxr_objects.h:2540
uint32_t act_set_key
Unique key for the session hashmap.
Definition: oxr_objects.h:2553
char name[XR_MAX_ACTION_SET_NAME_SIZE]
Application supplied name of this action.
Definition: oxr_objects.h:2544
bool ever_attached
Has this action set even been attached to any session, marking it as immutable.
Definition: oxr_objects.h:2550
uint32_t priority
Application supplied action set priority.
Definition: oxr_objects.h:2556
A group of actions.
Definition: oxr_objects.h:2582
struct u_hashset_item * name_item
The item in the name hashset.
Definition: oxr_objects.h:2604
struct u_hashset_item * loc_item
The item in the localized hashset.
Definition: oxr_objects.h:2607
struct oxr_action_set_ref * data
The data for this action set that must live as long as any session we are attached to.
Definition: oxr_objects.h:2593
uint32_t act_set_key
Unique key for the session hashmap.
Definition: oxr_objects.h:2601
struct oxr_handle_base handle
Common structure for things referred to by OpenXR handles.
Definition: oxr_objects.h:2584
struct oxr_instance * inst
Owner of this action set.
Definition: oxr_objects.h:2587
The state of a action input.
Definition: oxr_objects.h:2238
bool active
Is this active (bound and providing input)?
Definition: oxr_objects.h:2245
XrTime timestamp
When was this last changed.
Definition: oxr_objects.h:2251
A single action.
Definition: oxr_objects.h:2652
struct oxr_action_set * act_set
Owner of this action.
Definition: oxr_objects.h:2657
struct oxr_handle_base handle
Common structure for things referred to by OpenXR handles.
Definition: oxr_objects.h:2654
struct u_hashset_item * loc_item
The item in the localized hashset.
Definition: oxr_objects.h:2674
uint32_t act_key
Unique key for the session hashmap.
Definition: oxr_objects.h:2668
struct u_hashset_item * name_item
The item in the name hashset.
Definition: oxr_objects.h:2671
struct oxr_action_ref * data
The data for this action that must live as long as any session we are attached to.
Definition: oxr_objects.h:2661
Interaction profile binding state.
Definition: oxr_objects.h:2104
uint32_t * preferred_binding_path_index
store which entry in paths was suggested, for each action key
Definition: oxr_objects.h:2116
const char * localized_name
Name presented to the user.
Definition: oxr_objects.h:2109
Debug object created by the client program.
Definition: oxr_objects.h:2685
struct oxr_handle_base handle
Common structure for things referred to by OpenXR handles.
Definition: oxr_objects.h:2687
XrDebugUtilsMessageTypeFlagsEXT message_types
Types to submit to this messenger.
Definition: oxr_objects.h:2696
PFN_xrDebugUtilsMessengerCallbackEXT user_callback
Callback function.
Definition: oxr_objects.h:2699
struct oxr_instance * inst
Owner of this messenger.
Definition: oxr_objects.h:2690
void *XR_MAY_ALIAS user_data
Opaque user data.
Definition: oxr_objects.h:2702
XrDebugUtilsMessageSeverityFlagsEXT message_severities
Severities to submit to this messenger.
Definition: oxr_objects.h:2693
dpad binding extracted from XrInteractionProfileDpadBindingEXT
Definition: oxr_objects.h:2036
dpad emulation settings from oxr_interaction_profile
Definition: oxr_objects.h:2070
A entry in the dpad state for one action set.
Definition: oxr_objects.h:2047
dpad settings we need extracted from XrInteractionProfileDpadBindingEXT
Definition: oxr_objects.h:2024
Holds dpad binding state for a single interaction profile.
Definition: oxr_objects.h:2062
Definition: oxr_event.c:30
Structure tracking which extensions are enabled for a given instance.
Definition: oxr_objects.h:1688
Helper that handles synchronizing the xr{Wait,Begin,End}Frame calls.
Definition: oxr_frame_sync.h:36
A hand tracker.
Definition: oxr_objects.h:2737
struct oxr_session * sess
Owner of this hand tracker.
Definition: oxr_objects.h:2742
const struct oxr_hand_tracking_data_source * requested_sources[2]
An ordered list of requested data-source from above options (oxr_hand_tracker::[unobstructed|conformi...
Definition: oxr_objects.h:2755
struct oxr_handle_base handle
Common structure for things referred to by OpenXR handles.
Definition: oxr_objects.h:2739
Definition: oxr_objects.h:2706
enum xrt_input_name input_name
the input name associated with this hand tracker
Definition: oxr_objects.h:2711
struct xrt_device * xdev
xrt_device backing this hand tracker
Definition: oxr_objects.h:2708
Used to hold diverse child handles and ensure orderly destruction.
Definition: oxr_objects.h:1459
struct oxr_handle_base * parent
Pointer to this object's parent handle holder, if any.
Definition: oxr_objects.h:1466
uint64_t debug
Magic (per-handle-type) value for debugging.
Definition: oxr_objects.h:1461
struct oxr_handle_base * children[256]
Array of children, if any.
Definition: oxr_objects.h:1471
enum oxr_handle_state state
Current handle state.
Definition: oxr_objects.h:1476
oxr_handle_destroyer destroy
Destroy the object this handle refers to.
Definition: oxr_objects.h:1481
Variant type for input transforms.
Definition: oxr_input_transform.h:144
Main object that ties everything together.
Definition: oxr_objects.h:1701
bool disable_vulkan_format_depth
Some applications can't handle depth formats, or they trigger a bug in a specific version of the appl...
Definition: oxr_objects.h:1785
bool parallel_views
For applications that rely on views being parallel, notably some OpenVR games with OpenComposite.
Definition: oxr_objects.h:1810
size_t path_num
Number of paths in the array (0 is always null).
Definition: oxr_objects.h:1740
bool disable_vulkan_format_depth_stencil
Some applications can't handle depth stencil formats, or they trigger a bug in a specific version of ...
Definition: oxr_objects.h:1798
XrVersion major_minor
Stores only major.minor version. Simplifies comparisons for e.g. "at least OpenXR 1....
Definition: oxr_objects.h:1716
bool skip_end_session
Unreal 4 has a bug calling xrEndSession; the function should just exit.
Definition: oxr_objects.h:1801
struct oxr_path ** path_array
Mapping from ID to path.
Definition: oxr_objects.h:1736
bool no_validation_error_in_create_ref_space
Return XR_ERROR_REFERENCE_SPACE_UNSUPPORTED instead of XR_ERROR_VALIDATION_FAILURE in xrCreateReferen...
Definition: oxr_objects.h:1807
size_t path_array_length
Total length of path array.
Definition: oxr_objects.h:1738
struct oxr_extension_status extensions
Enabled extensions.
Definition: oxr_objects.h:1710
struct oxr_debug_messenger * messengers[256]
Debug messengers.
Definition: oxr_objects.h:1817
struct u_hashset * path_store
Path store, for looking up paths.
Definition: oxr_objects.h:1734
struct oxr_instance::@282 openxr_version
The OpenXR version requested in the app info. It determines the instance's OpenXR version.
bool map_stage_to_local_floor
For applications that use stage and don't offer recentering.
Definition: oxr_objects.h:1813
struct oxr_interaction_profile ** profiles
Interaction profile bindings that have been suggested by the client.
Definition: oxr_objects.h:1751
struct oxr_handle_base handle
Common structure for things referred to by OpenXR handles.
Definition: oxr_objects.h:1703
A single interaction profile.
Definition: oxr_objects.h:2082
enum xrt_device_name xname
Used to lookup xrt_binding_profile for fallback.
Definition: oxr_objects.h:2086
const char * localized_name
Name presented to the user.
Definition: oxr_objects.h:2089
Logger struct that lives on the stack, one for each call client call.
Definition: oxr_logger.h:40
Internal representation of a path, item follows this struct in memory and that in turn is followed by...
Definition: oxr_path.c:28
Definition: oxr_objects.h:2502
void(* destroy)(struct oxr_refcounted *)
Destruction callback.
Definition: oxr_objects.h:2505
Object that client program interact with.
Definition: oxr_objects.h:1842
struct u_hashmap_int * act_attachments_by_key
A map of action key to action attachment.
Definition: oxr_objects.h:1931
XrResult(* create_swapchain)(struct oxr_logger *, struct oxr_session *sess, const XrSwapchainCreateInfo *, struct oxr_swapchain **)
To pipe swapchain creation to right code.
Definition: oxr_objects.h:1968
struct xrt_compositor_native * xcn
Native compositor that is wrapped by client compositors.
Definition: oxr_objects.h:1854
struct xrt_space_relation local_space_pure_relation
initial relation of head in "global" space.
Definition: oxr_objects.h:1975
struct xrt_session * xs
The xrt_session backing this session.
Definition: oxr_objects.h:1851
XrViewConfigurationType current_view_config_type
This is set in xrBeginSession and is the primaryViewConfiguration argument, this is then used in xrEn...
Definition: oxr_objects.h:1867
struct oxr_action_set_attachment * act_set_attachments
An array of action set attachments that this session owns.
Definition: oxr_objects.h:1905
uint32_t frame_timing_wait_sleep_ms
Extra sleep in wait frame.
Definition: oxr_objects.h:1963
struct os_precise_sleeper sleeper
Used to implement precise extra sleeping in wait frame.
Definition: oxr_objects.h:1897
enum oxr_session_graphics_ext gfx_ext
What graphics type was this session created with.
Definition: oxr_objects.h:1848
size_t profiles_on_attachment_size
Clone of all suggested binding profiles at the point of action set/session attachment.
Definition: oxr_objects.h:1937
bool has_ended_once
There is a extra state between xrBeginSession has been called and the first xrEndFrame has been calle...
Definition: oxr_objects.h:1873
struct u_hashmap_int * act_sets_attachments_by_key
A map of action set key to action set attachments.
Definition: oxr_objects.h:1919
struct oxr_handle_base handle
Common structure for things referred to by OpenXR handles.
Definition: oxr_objects.h:1844
float ipd_meters
IPD, to be expanded to a proper 3D relation.
Definition: oxr_objects.h:1955
size_t action_set_attachment_count
Length of oxr_session::act_set_attachments.
Definition: oxr_objects.h:1910
bool frame_timing_spew
Frame timing debug output.
Definition: oxr_objects.h:1960
Can be one of several reference space types, or a space that is bound to an action.
Definition: oxr_objects.h:2397
struct oxr_subaction_paths subaction_paths
Which sub action path is this?
Definition: oxr_objects.h:2414
enum oxr_space_type space_type
What kind of space is this?
Definition: oxr_objects.h:2411
uint32_t act_key
Action key from which action this space was created from.
Definition: oxr_objects.h:2408
struct xrt_pose pose
Pose that was given during creation.
Definition: oxr_objects.h:2405
struct oxr_session * sess
Owner of this space.
Definition: oxr_objects.h:2402
struct oxr_handle_base handle
Common structure for things referred to by OpenXR handles.
Definition: oxr_objects.h:2399
A parsed equivalent of a list of sub-action paths.
Definition: oxr_objects.h:2159
A set of images used for rendering.
Definition: oxr_objects.h:2438
struct oxr_session * sess
Owner of this swapchain.
Definition: oxr_objects.h:2443
uint32_t face_count
The number of cubemap faces. 6 for cubemaps, 1 otherwise.
Definition: oxr_objects.h:2455
struct xrt_swapchain * swapchain
Compositor swapchain.
Definition: oxr_objects.h:2446
struct oxr_handle_base handle
Common structure for things referred to by OpenXR handles.
Definition: oxr_objects.h:2440
uint32_t width
Swapchain size.
Definition: oxr_objects.h:2449
uint32_t array_layer_count
For 1 is 2D texture, greater then 1 2D array texture.
Definition: oxr_objects.h:2452
Single or multiple devices grouped together to form a system that sessions can be created from.
Definition: oxr_objects.h:1512
struct xrt_system * xsys
The XRT interfaces level system.
Definition: oxr_objects.h:1516
VkPhysicalDevice suggested_vulkan_physical_device
The device returned with the last xrGetVulkanGraphicsDeviceKHR or xrGetVulkanGraphicsDevice2KHR call.
Definition: oxr_objects.h:1553
PFN_vkGetInstanceProcAddr vk_get_instance_proc_addr
Stores the vkGetInstanceProcAddr passed to xrCreateVulkanInstanceKHR to be used when looking up Vulka...
Definition: oxr_objects.h:1559
struct xrt_system_devices * xsysd
System devices used in all session types.
Definition: oxr_objects.h:1519
struct xrt_space_overseer * xso
Space overseer used in all session types.
Definition: oxr_objects.h:1522
VkInstance vulkan_enable2_instance
The instance/device we create when vulkan_enable2 is used.
Definition: oxr_objects.h:1550
bool gotten_requirements
Have the client application called the gfx api requirements func?
Definition: oxr_objects.h:1530
struct xrt_system_compositor * xsysc
System compositor, used to create session compositors.
Definition: oxr_objects.h:1525
struct xrt_system_roles dynamic_roles_cache
Cache of the last known system roles, see xrt_system_roles::generation_id.
Definition: oxr_objects.h:1539
Holds the properties that a system supports for a view configuration type.
Definition: oxr_objects.h:1490
Time-keeping state structure.
Definition: u_time.cpp:30
A simple uint64_t key to a void pointer hashmap.
Definition: u_hashmap.cpp:24
A embeddable hashset item, note that the string directly follows the u_hashset_item.
Definition: u_hashset.h:37
Kind of bespoke hashset implementation, where the user is responsible for allocating and freeing the ...
Definition: u_hashset.cpp:26
Definition: u_index_fifo.h:21
Definition: xrt_defines.h:1957
Main compositor server interface.
Definition: xrt_compositor.h:2227
Common compositor client interface/base.
Definition: xrt_compositor.h:991
A single HMD or input device.
Definition: xrt_device.h:284
enum xrt_device_name name
Enum identifier of the device.
Definition: xrt_device.h:286
The (future) result of an asynchronous operation.
Definition: xrt_future.h:38
A future is a concurrency primitive that provides a mechanism to access results of asynchronous opera...
Definition: xrt_future.h:74
A single named input, that sits on a xrt_device.
Definition: xrt_device.h:165
This interface acts as a root object for Monado.
Definition: xrt_instance.h:119
A single named output, that sits on a xrt_device.
Definition: xrt_device.h:183
Each plane has n polygons; ultimately plane metadata from locations and vetices is reconstructed.
Definition: xrt_plane_detector.h:171
A pose composed of a position and orientation.
Definition: xrt_defines.h:479
A base class for reference counted objects.
Definition: xrt_defines.h:99
The XRT representation of XrSession, this object does not have all of the functionality of a session,...
Definition: xrt_session.h:259
Object that oversees and manages spaces, one created for each XR system.
Definition: xrt_space.h:96
A relation with two spaces, includes velocity and acceleration.
Definition: xrt_defines.h:670
A space very similar to a OpenXR XrSpace but not a full one-to-one mapping, but used to power XrSpace...
Definition: xrt_space.h:31
Common swapchain interface/base.
Definition: xrt_compositor.h:540
The system compositor handles composition for a system.
Definition: xrt_compositor.h:2438
A collection of xrt_device, and an interface for identifying the roles they have been assigned.
Definition: xrt_system.h:221
struct xrt_system_devices::@257::@258 hand_tracking
Devices providing optical (or otherwise more directly measured than from controller estimation) hand ...
struct xrt_device * head
An observing pointer to the device serving as the "head" (and HMD).
Definition: xrt_system.h:250
struct xrt_device * face
An observing pointer to the device providing face tracking (optional).
Definition: xrt_system.h:262
struct xrt_device * eyes
An observing pointer to the device providing eye tracking (optional).
Definition: xrt_system.h:256
struct xrt_device * left
An observing pointer to the device providing unobstructed hand-tracking for the left hand (optional).
Definition: xrt_system.h:285
struct xrt_system_devices::@257 static_roles
Observing pointers for devices in some static (unchangeable) roles.
struct xrt_device * right
An observing pointer to the device providing unobstructed hand-tracking for the right hand (optional)...
Definition: xrt_system.h:294
struct xrt_device * body
An observing pointer to the device providing body tracking (optional).
Definition: xrt_system.h:268
Data associating a device index (in xrt_system_devices::xdevs) with a given "role" for dynamic role s...
Definition: xrt_system.h:161
A system is a collection of devices, policies and optionally a compositor that is organised into a ch...
Definition: xrt_system.h:62
Visibility mask helper, the indices and vertices are tightly packed after this struct.
Definition: xrt_visibility_mask.h:25
Misc helpers for device drivers.
Hashmap for integer values header.
Hashset struct header.
A FIFO for indices.
A union of all input types.
Definition: xrt_defines.h:1459
Header holding Android-specific details.
xrt_android_lifecycle_event
Distinguishes the possible Android lifecycle events from each other.
Definition: xrt_android.h:32
Header declaring XRT graphics interfaces.
Auto detect OS and certain features.
xrt_perf_notify_level
Performance level.
Definition: xrt_defines.h:2161
xrt_device_name
A enum that is used to name devices so that the state trackers can reason about the devices easier.
Definition: xrt_defines.h:724
xrt_perf_domain
Domain type.
Definition: xrt_defines.h:2134
Header defining an xrt display or controller device.
Interface for creating futures.
Header for limits of the XRT interfaces.
Include all of the openxr headers in one place.
Header defining xrt space and space overseer.
Header for system objects.
Header defining the tracking system integration in Monado.
Include all of the Vulkan headers in one place, and cope with any "messy" includes implied by it.