Monado OpenXR Runtime
oxr_conversions.h
Go to the documentation of this file.
1// Copyright 2018-2024, Collabora, Ltd.
2// Copyright 2024-2025, NVIDIA CORPORATION.
3// SPDX-License-Identifier: BSL-1.0
4/*!
5 * @file
6 * @brief Smaller helper functions to convert between xrt and OpenXR things.
7 * @author Christoph Haag <christoph.haag@collabora.com>
8 * @author Jakob Bornecrantz <jakob@collabora.com>
9 * @ingroup oxr_main
10 */
11
12#pragma once
13
14#include "xrt/xrt_defines.h"
15#include "xrt/xrt_space.h"
18
19
20/*
21 *
22 * Space things.
23 *
24 */
25
26static inline XrSpaceLocationFlags
27xrt_to_xr_space_location_flags(enum xrt_space_relation_flags relation_flags)
28{
29 // clang-format off
30 bool valid_ori = (relation_flags & XRT_SPACE_RELATION_ORIENTATION_VALID_BIT) != 0;
31 bool tracked_ori = (relation_flags & XRT_SPACE_RELATION_ORIENTATION_TRACKED_BIT) != 0;
32 bool valid_pos = (relation_flags & XRT_SPACE_RELATION_POSITION_VALID_BIT) != 0;
33 bool tracked_pos = (relation_flags & XRT_SPACE_RELATION_POSITION_TRACKED_BIT) != 0;
34
35 bool linear_vel = (relation_flags & XRT_SPACE_RELATION_LINEAR_VELOCITY_VALID_BIT) != 0;
36 bool angular_vel = (relation_flags & XRT_SPACE_RELATION_ANGULAR_VELOCITY_VALID_BIT) != 0;
37 // clang-format on
38
39 XrSpaceLocationFlags location_flags = (XrSpaceLocationFlags)0;
40 if (valid_ori) {
41 location_flags |= XR_SPACE_LOCATION_ORIENTATION_VALID_BIT;
42 }
43 if (tracked_ori) {
44 location_flags |= XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT;
45 }
46 if (valid_pos) {
47 location_flags |= XR_SPACE_LOCATION_POSITION_VALID_BIT;
48 }
49 if (tracked_pos) {
50 location_flags |= XR_SPACE_LOCATION_POSITION_TRACKED_BIT;
51 }
52 if (linear_vel) {
53 location_flags |= XR_SPACE_VELOCITY_LINEAR_VALID_BIT;
54 }
55 if (angular_vel) {
56 location_flags |= XR_SPACE_VELOCITY_ANGULAR_VALID_BIT;
57 }
58
59 return location_flags;
60}
61
62static inline XrReferenceSpaceType
63oxr_ref_space_to_xr(enum oxr_space_type space_type)
64{
65 switch (space_type) {
66 case OXR_SPACE_TYPE_REFERENCE_VIEW: return XR_REFERENCE_SPACE_TYPE_VIEW;
67 case OXR_SPACE_TYPE_REFERENCE_LOCAL: return XR_REFERENCE_SPACE_TYPE_LOCAL;
68 case OXR_SPACE_TYPE_REFERENCE_LOCAL_FLOOR: return XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT;
69 case OXR_SPACE_TYPE_REFERENCE_STAGE: return XR_REFERENCE_SPACE_TYPE_STAGE;
70 case OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_MSFT: return XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT;
71 case OXR_SPACE_TYPE_REFERENCE_COMBINED_EYE_VARJO: return XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO;
72 case OXR_SPACE_TYPE_REFERENCE_LOCALIZATION_MAP_ML: return XR_REFERENCE_SPACE_TYPE_LOCALIZATION_MAP_ML;
73
74 case OXR_SPACE_TYPE_ACTION: return XR_REFERENCE_SPACE_TYPE_MAX_ENUM;
75 case OXR_SPACE_TYPE_XDEV_POSE: return XR_REFERENCE_SPACE_TYPE_MAX_ENUM;
76 }
77
78 return XR_REFERENCE_SPACE_TYPE_MAX_ENUM;
79}
80
81static inline enum oxr_space_type
82xr_ref_space_to_oxr(XrReferenceSpaceType space_type)
83{
84 switch (space_type) {
85 case XR_REFERENCE_SPACE_TYPE_VIEW: return OXR_SPACE_TYPE_REFERENCE_VIEW;
86 case XR_REFERENCE_SPACE_TYPE_LOCAL: return OXR_SPACE_TYPE_REFERENCE_LOCAL;
87 case XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT: return OXR_SPACE_TYPE_REFERENCE_LOCAL_FLOOR;
88 case XR_REFERENCE_SPACE_TYPE_STAGE: return OXR_SPACE_TYPE_REFERENCE_STAGE;
89 case XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT: return OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_MSFT;
90 case XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO: return OXR_SPACE_TYPE_REFERENCE_COMBINED_EYE_VARJO;
91 case XR_REFERENCE_SPACE_TYPE_LOCALIZATION_MAP_ML: return OXR_SPACE_TYPE_REFERENCE_LOCALIZATION_MAP_ML;
92
93 case XR_REFERENCE_SPACE_TYPE_MAX_ENUM: return (enum oxr_space_type) - 1;
94 }
95
96 // wrap around or negative depending on enum data type, invalid value either way.
97 return (enum oxr_space_type) - 1;
98}
99
100static inline const char *
101xr_ref_space_to_string(XrReferenceSpaceType space_type)
102{
103 switch (space_type) {
104 case XR_REFERENCE_SPACE_TYPE_VIEW: return "XR_REFERENCE_SPACE_TYPE_VIEW";
105 case XR_REFERENCE_SPACE_TYPE_LOCAL: return "XR_REFERENCE_SPACE_TYPE_LOCAL";
106 case XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT: return "XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT";
107 case XR_REFERENCE_SPACE_TYPE_STAGE: return "XR_REFERENCE_SPACE_TYPE_STAGE";
108 case XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT: return "XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT";
109 case XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO: return "XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO";
110 case XR_REFERENCE_SPACE_TYPE_MAX_ENUM: return "XR_REFERENCE_SPACE_TYPE_MAX_ENUM";
111 default: return "UNKNOWN REFERENCE SPACE";
112 }
113}
114
115static inline enum xrt_reference_space_type
116oxr_ref_space_to_xrt(enum oxr_space_type space_type)
117{
118 switch (space_type) {
119 case OXR_SPACE_TYPE_REFERENCE_VIEW: return XRT_SPACE_REFERENCE_TYPE_VIEW;
120 case OXR_SPACE_TYPE_REFERENCE_LOCAL: return XRT_SPACE_REFERENCE_TYPE_LOCAL;
121 case OXR_SPACE_TYPE_REFERENCE_LOCAL_FLOOR: return XRT_SPACE_REFERENCE_TYPE_LOCAL_FLOOR;
122 case OXR_SPACE_TYPE_REFERENCE_STAGE: return XRT_SPACE_REFERENCE_TYPE_STAGE;
123 case OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_MSFT: return XRT_SPACE_REFERENCE_TYPE_UNBOUNDED;
124
125 // Has no mapping to a Monado semantic space.
126 case OXR_SPACE_TYPE_REFERENCE_COMBINED_EYE_VARJO: return XRT_SPACE_REFERENCE_TYPE_INVALID;
127 case OXR_SPACE_TYPE_REFERENCE_LOCALIZATION_MAP_ML: return XRT_SPACE_REFERENCE_TYPE_INVALID;
128 case OXR_SPACE_TYPE_ACTION: return XRT_SPACE_REFERENCE_TYPE_INVALID;
129 case OXR_SPACE_TYPE_XDEV_POSE: return XRT_SPACE_REFERENCE_TYPE_INVALID;
130 }
131
132 /*
133 * This is the default case, we do not have a explicit default case
134 * so that we get warnings for unhandled enum members. This is fine
135 * because the C specification says if there is no default case and
136 * and a non-matching value is given no case is executed.
137 */
138
140}
141
142static inline enum xrt_reference_space_type
143xr_ref_space_to_xrt(XrReferenceSpaceType space_type)
144{
145 switch (space_type) {
146 case XR_REFERENCE_SPACE_TYPE_VIEW: return XRT_SPACE_REFERENCE_TYPE_VIEW;
147 case XR_REFERENCE_SPACE_TYPE_LOCAL: return XRT_SPACE_REFERENCE_TYPE_LOCAL;
148 case XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT: return XRT_SPACE_REFERENCE_TYPE_LOCAL_FLOOR;
149 case XR_REFERENCE_SPACE_TYPE_STAGE: return XRT_SPACE_REFERENCE_TYPE_STAGE;
150 case XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT: return XRT_SPACE_REFERENCE_TYPE_UNBOUNDED;
151
152 case XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO: return XRT_SPACE_REFERENCE_TYPE_INVALID;
153 case XR_REFERENCE_SPACE_TYPE_LOCALIZATION_MAP_ML: return XRT_SPACE_REFERENCE_TYPE_INVALID;
154 case XR_REFERENCE_SPACE_TYPE_MAX_ENUM: return XRT_SPACE_REFERENCE_TYPE_INVALID;
155 }
156
158}
159
160
161/*
162 *
163 * Form factor things.
164 *
165 */
166
167static inline enum xrt_form_factor
168xr_form_factor_to_xrt(XrFormFactor form_factor)
169{
170 switch (form_factor) {
171 case XR_FORM_FACTOR_HANDHELD_DISPLAY: return XRT_FORM_FACTOR_HANDHELD;
172 case XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY: return XRT_FORM_FACTOR_HMD;
173 case XR_FORM_FACTOR_MAX_ENUM: assert(false); return 0; // As good as any.
174 }
175
176 // Used as default, to get warnings.
177 return XRT_FORM_FACTOR_HMD;
178}
179
180static inline enum XrFormFactor
181xrt_form_factor_to_xr(enum xrt_form_factor form_factor)
182{
183 switch (form_factor) {
184 case XRT_FORM_FACTOR_HANDHELD: return XR_FORM_FACTOR_HANDHELD_DISPLAY;
185 case XRT_FORM_FACTOR_HMD: return XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY;
186 }
187
188 // Used as default, to get warnings.
189 return XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY;
190}
191
192
193/*
194 *
195 * IO things.
196 *
197 */
198
199static inline const char *
200xrt_input_type_to_str(enum xrt_input_type type)
201{
202 // clang-format off
203 switch (type) {
204 case XRT_INPUT_TYPE_VEC1_ZERO_TO_ONE: return "XRT_INPUT_TYPE_VEC1_ZERO_TO_ONE";
205 case XRT_INPUT_TYPE_VEC1_MINUS_ONE_TO_ONE: return "XRT_INPUT_TYPE_VEC1_MINUS_ONE_TO_ONE";
206 case XRT_INPUT_TYPE_VEC2_MINUS_ONE_TO_ONE: return "XRT_INPUT_TYPE_VEC2_MINUS_ONE_TO_ONE";
207 case XRT_INPUT_TYPE_VEC3_MINUS_ONE_TO_ONE: return "XRT_INPUT_TYPE_VEC3_MINUS_ONE_TO_ONE";
208 case XRT_INPUT_TYPE_BOOLEAN: return "XRT_INPUT_TYPE_BOOLEAN";
209 case XRT_INPUT_TYPE_POSE: return "XRT_INPUT_TYPE_POSE";
210 default: return "XRT_INPUT_UNKNOWN";
211 }
212 // clang-format on
213}
214
215static inline enum xrt_perf_set_level
216xr_perf_level_to_xrt(XrPerfSettingsLevelEXT level)
217{
218 switch (level) {
219 case XR_PERF_SETTINGS_LEVEL_POWER_SAVINGS_EXT: return XRT_PERF_SET_LEVEL_POWER_SAVINGS;
220 case XR_PERF_SETTINGS_LEVEL_SUSTAINED_LOW_EXT: return XRT_PERF_SET_LEVEL_SUSTAINED_LOW;
221 case XR_PERF_SETTINGS_LEVEL_SUSTAINED_HIGH_EXT: return XRT_PERF_SET_LEVEL_SUSTAINED_HIGH;
222 case XR_PERF_SETTINGS_LEVEL_BOOST_EXT: return XRT_PERF_SET_LEVEL_BOOST;
223 default: assert(false); return 0;
224 }
225}
226
227static inline enum xrt_perf_domain
228xr_perf_domain_to_xrt(XrPerfSettingsDomainEXT domain)
229{
230 switch (domain) {
231 case XR_PERF_SETTINGS_DOMAIN_CPU_EXT: return XRT_PERF_DOMAIN_CPU;
232 case XR_PERF_SETTINGS_DOMAIN_GPU_EXT: return XRT_PERF_DOMAIN_GPU;
233 default: assert(false); return 0;
234 }
235}
236
237static inline XrPerfSettingsDomainEXT
238xrt_perf_domain_to_xr(enum xrt_perf_domain domain)
239{
240 switch (domain) {
241 case XRT_PERF_DOMAIN_CPU: return XR_PERF_SETTINGS_DOMAIN_CPU_EXT;
242 case XRT_PERF_DOMAIN_GPU: return XR_PERF_SETTINGS_DOMAIN_GPU_EXT;
243 default: assert(false); return 0;
244 }
245}
246
247static inline XrPerfSettingsSubDomainEXT
248xrt_perf_sub_domain_to_xr(enum xrt_perf_sub_domain subDomain)
249{
250 switch (subDomain) {
251 case XRT_PERF_SUB_DOMAIN_COMPOSITING: return XR_PERF_SETTINGS_SUB_DOMAIN_COMPOSITING_EXT;
252 case XRT_PERF_SUB_DOMAIN_RENDERING: return XR_PERF_SETTINGS_SUB_DOMAIN_RENDERING_EXT;
253 case XRT_PERF_SUB_DOMAIN_THERMAL: return XR_PERF_SETTINGS_SUB_DOMAIN_THERMAL_EXT;
254 default: assert(false); return 0;
255 }
256}
257
258static inline XrPerfSettingsNotificationLevelEXT
259xrt_perf_notify_level_to_xr(enum xrt_perf_notify_level level)
260{
261 switch (level) {
262 case XRT_PERF_NOTIFY_LEVEL_NORMAL: return XR_PERF_SETTINGS_NOTIF_LEVEL_NORMAL_EXT;
263 case XRT_PERF_NOTIFY_LEVEL_WARNING: return XR_PERF_SETTINGS_NOTIF_LEVEL_WARNING_EXT;
264 case XRT_PERF_NOTIFY_LEVEL_IMPAIRED: return XR_PERF_SETTINGS_NOTIF_LEVEL_IMPAIRED_EXT;
265 default: assert(false); return 0;
266 }
267}
oxr_space_type
Internal enum for the type of space, lets us reason about action spaces.
Definition: oxr_defines.h:104
xrt_input_type
Base type of this inputs.
Definition: xrt_defines.h:803
xrt_form_factor
What form factor is this device, mostly maps onto OpenXR's XrFormFactor.
Definition: xrt_defines.h:2063
xrt_reference_space_type
Type of a OpenXR mapped reference space, maps to the semantic spaces on the xrt_space_overseer struct...
Definition: xrt_defines.h:596
#define XRT_SPACE_REFERENCE_TYPE_INVALID
An invalid xrt_reference_space_type, since it's invalid it's not listed in the enum.
Definition: xrt_defines.h:617
xrt_space_relation_flags
Flags of which components of a xrt_space_relation is valid.
Definition: xrt_defines.h:626
@ XRT_INPUT_TYPE_POSE
A tracked pose.
Definition: xrt_defines.h:816
@ XRT_INPUT_TYPE_VEC2_MINUS_ONE_TO_ONE
Vec2 input, components in [-1, 1].
Definition: xrt_defines.h:810
@ XRT_INPUT_TYPE_VEC3_MINUS_ONE_TO_ONE
Vec3 input, components in [-1, 1].
Definition: xrt_defines.h:812
@ XRT_INPUT_TYPE_VEC1_MINUS_ONE_TO_ONE
Float input in [-1, 1].
Definition: xrt_defines.h:808
@ XRT_INPUT_TYPE_BOOLEAN
Boolean (digital, binary) input.
Definition: xrt_defines.h:814
@ XRT_INPUT_TYPE_VEC1_ZERO_TO_ONE
Float input in [0, 1].
Definition: xrt_defines.h:806
@ XRT_FORM_FACTOR_HANDHELD
Handheld display.
Definition: xrt_defines.h:2065
@ XRT_FORM_FACTOR_HMD
Head mounted display.
Definition: xrt_defines.h:2064
Common defines and enums for XRT.
xrt_perf_notify_level
Performance level.
Definition: xrt_defines.h:2101
xrt_perf_domain
Domain type.
Definition: xrt_defines.h:2074
xrt_perf_set_level
Performance level.
Definition: xrt_defines.h:2090
Include all of the openxr headers in one place.
Header defining xrt space and space overseer.
Include all of the Vulkan headers in one place, and cope with any "messy" includes implied by it.