Monado OpenXR Runtime
Loading...
Searching...
No Matches
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#include "oxr_defines.h"
20
21
22/*
23 *
24 * Space things.
25 *
26 */
27
28static inline XrSpaceLocationFlags
29xrt_to_xr_space_location_flags(enum xrt_space_relation_flags relation_flags)
30{
31 // clang-format off
32 bool valid_ori = (relation_flags & XRT_SPACE_RELATION_ORIENTATION_VALID_BIT) != 0;
33 bool tracked_ori = (relation_flags & XRT_SPACE_RELATION_ORIENTATION_TRACKED_BIT) != 0;
34 bool valid_pos = (relation_flags & XRT_SPACE_RELATION_POSITION_VALID_BIT) != 0;
35 bool tracked_pos = (relation_flags & XRT_SPACE_RELATION_POSITION_TRACKED_BIT) != 0;
36
37 bool linear_vel = (relation_flags & XRT_SPACE_RELATION_LINEAR_VELOCITY_VALID_BIT) != 0;
38 bool angular_vel = (relation_flags & XRT_SPACE_RELATION_ANGULAR_VELOCITY_VALID_BIT) != 0;
39 // clang-format on
40
41 XrSpaceLocationFlags location_flags = (XrSpaceLocationFlags)0;
42 if (valid_ori) {
43 location_flags |= XR_SPACE_LOCATION_ORIENTATION_VALID_BIT;
44 }
45 if (tracked_ori) {
46 location_flags |= XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT;
47 }
48 if (valid_pos) {
49 location_flags |= XR_SPACE_LOCATION_POSITION_VALID_BIT;
50 }
51 if (tracked_pos) {
52 location_flags |= XR_SPACE_LOCATION_POSITION_TRACKED_BIT;
53 }
54 if (linear_vel) {
55 location_flags |= XR_SPACE_VELOCITY_LINEAR_VALID_BIT;
56 }
57 if (angular_vel) {
58 location_flags |= XR_SPACE_VELOCITY_ANGULAR_VALID_BIT;
59 }
60
61 return location_flags;
62}
63
64static inline XrReferenceSpaceType
65oxr_ref_space_to_xr(enum oxr_space_type space_type)
66{
67 switch (space_type) {
68 case OXR_SPACE_TYPE_REFERENCE_VIEW: return XR_REFERENCE_SPACE_TYPE_VIEW;
69 case OXR_SPACE_TYPE_REFERENCE_LOCAL: return XR_REFERENCE_SPACE_TYPE_LOCAL;
70 case OXR_SPACE_TYPE_REFERENCE_LOCAL_FLOOR: return XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT;
71 case OXR_SPACE_TYPE_REFERENCE_STAGE: return XR_REFERENCE_SPACE_TYPE_STAGE;
72 case OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_MSFT: return XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT;
73 case OXR_SPACE_TYPE_REFERENCE_COMBINED_EYE_VARJO: return XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO;
74 case OXR_SPACE_TYPE_REFERENCE_LOCALIZATION_MAP_ML: return XR_REFERENCE_SPACE_TYPE_LOCALIZATION_MAP_ML;
75 case OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_ANDROID: return XR_REFERENCE_SPACE_TYPE_UNBOUNDED_ANDROID;
76
77 case OXR_SPACE_TYPE_ACTION: return XR_REFERENCE_SPACE_TYPE_MAX_ENUM;
78 case OXR_SPACE_TYPE_XDEV_POSE: return XR_REFERENCE_SPACE_TYPE_MAX_ENUM;
79 }
80
81 return XR_REFERENCE_SPACE_TYPE_MAX_ENUM;
82}
83
84static inline enum oxr_space_type
85xr_ref_space_to_oxr(XrReferenceSpaceType space_type)
86{
87 switch (space_type) {
88 case XR_REFERENCE_SPACE_TYPE_VIEW: return OXR_SPACE_TYPE_REFERENCE_VIEW;
89 case XR_REFERENCE_SPACE_TYPE_LOCAL: return OXR_SPACE_TYPE_REFERENCE_LOCAL;
90 case XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT: return OXR_SPACE_TYPE_REFERENCE_LOCAL_FLOOR;
91 case XR_REFERENCE_SPACE_TYPE_STAGE: return OXR_SPACE_TYPE_REFERENCE_STAGE;
92 case XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT: return OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_MSFT;
93 case XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO: return OXR_SPACE_TYPE_REFERENCE_COMBINED_EYE_VARJO;
94 case XR_REFERENCE_SPACE_TYPE_LOCALIZATION_MAP_ML: return OXR_SPACE_TYPE_REFERENCE_LOCALIZATION_MAP_ML;
95 case XR_REFERENCE_SPACE_TYPE_UNBOUNDED_ANDROID: return OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_ANDROID;
96
97 case XR_REFERENCE_SPACE_TYPE_MAX_ENUM: return (enum oxr_space_type) - 1;
98 }
99
100 // wrap around or negative depending on enum data type, invalid value either way.
101 return (enum oxr_space_type) - 1;
102}
103
104static inline const char *
105xr_ref_space_to_string(XrReferenceSpaceType space_type)
106{
107 switch (space_type) {
108 case XR_REFERENCE_SPACE_TYPE_VIEW: return "XR_REFERENCE_SPACE_TYPE_VIEW";
109 case XR_REFERENCE_SPACE_TYPE_LOCAL: return "XR_REFERENCE_SPACE_TYPE_LOCAL";
110 case XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT: return "XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT";
111 case XR_REFERENCE_SPACE_TYPE_STAGE: return "XR_REFERENCE_SPACE_TYPE_STAGE";
112 case XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT: return "XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT";
113 case XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO: return "XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO";
114 case XR_REFERENCE_SPACE_TYPE_UNBOUNDED_ANDROID: return "XR_REFERENCE_SPACE_TYPE_UNBOUNDED_ANDROID";
115 case XR_REFERENCE_SPACE_TYPE_MAX_ENUM: return "XR_REFERENCE_SPACE_TYPE_MAX_ENUM";
116 default: return "UNKNOWN REFERENCE SPACE";
117 }
118}
119
120static inline enum xrt_reference_space_type
121oxr_ref_space_to_xrt(enum oxr_space_type space_type)
122{
123 switch (space_type) {
124 case OXR_SPACE_TYPE_REFERENCE_VIEW: return XRT_SPACE_REFERENCE_TYPE_VIEW;
125 case OXR_SPACE_TYPE_REFERENCE_LOCAL: return XRT_SPACE_REFERENCE_TYPE_LOCAL;
126 case OXR_SPACE_TYPE_REFERENCE_LOCAL_FLOOR: return XRT_SPACE_REFERENCE_TYPE_LOCAL_FLOOR;
127 case OXR_SPACE_TYPE_REFERENCE_STAGE: return XRT_SPACE_REFERENCE_TYPE_STAGE;
128 case OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_MSFT: return XRT_SPACE_REFERENCE_TYPE_UNBOUNDED;
129
130 // Has no mapping to a Monado semantic space.
131 case OXR_SPACE_TYPE_REFERENCE_COMBINED_EYE_VARJO: return XRT_SPACE_REFERENCE_TYPE_INVALID;
132 case OXR_SPACE_TYPE_REFERENCE_LOCALIZATION_MAP_ML: return XRT_SPACE_REFERENCE_TYPE_INVALID;
133 case OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_ANDROID: return XRT_SPACE_REFERENCE_TYPE_INVALID;
134 case OXR_SPACE_TYPE_ACTION: return XRT_SPACE_REFERENCE_TYPE_INVALID;
135 case OXR_SPACE_TYPE_XDEV_POSE: return XRT_SPACE_REFERENCE_TYPE_INVALID;
136 }
137
138 /*
139 * This is the default case, we do not have a explicit default case
140 * so that we get warnings for unhandled enum members. This is fine
141 * because the C specification says if there is no default case and
142 * and a non-matching value is given no case is executed.
143 */
144
146}
147
148static inline enum xrt_reference_space_type
149xr_ref_space_to_xrt(XrReferenceSpaceType space_type)
150{
151 switch (space_type) {
152 case XR_REFERENCE_SPACE_TYPE_VIEW: return XRT_SPACE_REFERENCE_TYPE_VIEW;
153 case XR_REFERENCE_SPACE_TYPE_LOCAL: return XRT_SPACE_REFERENCE_TYPE_LOCAL;
154 case XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT: return XRT_SPACE_REFERENCE_TYPE_LOCAL_FLOOR;
155 case XR_REFERENCE_SPACE_TYPE_STAGE: return XRT_SPACE_REFERENCE_TYPE_STAGE;
156 case XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT: return XRT_SPACE_REFERENCE_TYPE_UNBOUNDED;
157
158 case XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO: return XRT_SPACE_REFERENCE_TYPE_INVALID;
159 case XR_REFERENCE_SPACE_TYPE_LOCALIZATION_MAP_ML: return XRT_SPACE_REFERENCE_TYPE_INVALID;
160 case XR_REFERENCE_SPACE_TYPE_UNBOUNDED_ANDROID: return XRT_SPACE_REFERENCE_TYPE_INVALID;
161 case XR_REFERENCE_SPACE_TYPE_MAX_ENUM: return XRT_SPACE_REFERENCE_TYPE_INVALID;
162 }
163
165}
166
167
168/*
169 *
170 * Form factor things.
171 *
172 */
173
174static inline enum xrt_form_factor
175xr_form_factor_to_xrt(XrFormFactor form_factor)
176{
177 switch (form_factor) {
178 case XR_FORM_FACTOR_HANDHELD_DISPLAY: return XRT_FORM_FACTOR_HANDHELD;
179 case XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY: return XRT_FORM_FACTOR_HMD;
180 case XR_FORM_FACTOR_MAX_ENUM: assert(false); return 0; // As good as any.
181 }
182
183 // Used as default, to get warnings.
184 return XRT_FORM_FACTOR_HMD;
185}
186
187static inline enum XrFormFactor
188xrt_form_factor_to_xr(enum xrt_form_factor form_factor)
189{
190 switch (form_factor) {
191 case XRT_FORM_FACTOR_HANDHELD: return XR_FORM_FACTOR_HANDHELD_DISPLAY;
192 case XRT_FORM_FACTOR_HMD: return XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY;
193 }
194
195 // Used as default, to get warnings.
196 return XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY;
197}
198
199
200/*
201 *
202 * IO things.
203 *
204 */
205
206static inline const char *
207xrt_input_type_to_str(enum xrt_input_type type)
208{
209 // clang-format off
210 switch (type) {
211 case XRT_INPUT_TYPE_VEC1_ZERO_TO_ONE: return "XRT_INPUT_TYPE_VEC1_ZERO_TO_ONE";
212 case XRT_INPUT_TYPE_VEC1_MINUS_ONE_TO_ONE: return "XRT_INPUT_TYPE_VEC1_MINUS_ONE_TO_ONE";
213 case XRT_INPUT_TYPE_VEC2_MINUS_ONE_TO_ONE: return "XRT_INPUT_TYPE_VEC2_MINUS_ONE_TO_ONE";
214 case XRT_INPUT_TYPE_VEC3_MINUS_ONE_TO_ONE: return "XRT_INPUT_TYPE_VEC3_MINUS_ONE_TO_ONE";
215 case XRT_INPUT_TYPE_BOOLEAN: return "XRT_INPUT_TYPE_BOOLEAN";
216 case XRT_INPUT_TYPE_POSE: return "XRT_INPUT_TYPE_POSE";
217 default: return "XRT_INPUT_UNKNOWN";
218 }
219 // clang-format on
220}
221
222static inline enum xrt_perf_set_level
223xr_perf_level_to_xrt(XrPerfSettingsLevelEXT level)
224{
225 switch (level) {
226 case XR_PERF_SETTINGS_LEVEL_POWER_SAVINGS_EXT: return XRT_PERF_SET_LEVEL_POWER_SAVINGS;
227 case XR_PERF_SETTINGS_LEVEL_SUSTAINED_LOW_EXT: return XRT_PERF_SET_LEVEL_SUSTAINED_LOW;
228 case XR_PERF_SETTINGS_LEVEL_SUSTAINED_HIGH_EXT: return XRT_PERF_SET_LEVEL_SUSTAINED_HIGH;
229 case XR_PERF_SETTINGS_LEVEL_BOOST_EXT: return XRT_PERF_SET_LEVEL_BOOST;
230 default: assert(false); return 0;
231 }
232}
233
234static inline enum xrt_perf_domain
235xr_perf_domain_to_xrt(XrPerfSettingsDomainEXT domain)
236{
237 switch (domain) {
238 case XR_PERF_SETTINGS_DOMAIN_CPU_EXT: return XRT_PERF_DOMAIN_CPU;
239 case XR_PERF_SETTINGS_DOMAIN_GPU_EXT: return XRT_PERF_DOMAIN_GPU;
240 default: assert(false); return 0;
241 }
242}
243
244static inline XrPerfSettingsDomainEXT
245xrt_perf_domain_to_xr(enum xrt_perf_domain domain)
246{
247 switch (domain) {
248 case XRT_PERF_DOMAIN_CPU: return XR_PERF_SETTINGS_DOMAIN_CPU_EXT;
249 case XRT_PERF_DOMAIN_GPU: return XR_PERF_SETTINGS_DOMAIN_GPU_EXT;
250 default: assert(false); return 0;
251 }
252}
253
254static inline XrPerfSettingsSubDomainEXT
255xrt_perf_sub_domain_to_xr(enum xrt_perf_sub_domain subDomain)
256{
257 switch (subDomain) {
258 case XRT_PERF_SUB_DOMAIN_COMPOSITING: return XR_PERF_SETTINGS_SUB_DOMAIN_COMPOSITING_EXT;
259 case XRT_PERF_SUB_DOMAIN_RENDERING: return XR_PERF_SETTINGS_SUB_DOMAIN_RENDERING_EXT;
260 case XRT_PERF_SUB_DOMAIN_THERMAL: return XR_PERF_SETTINGS_SUB_DOMAIN_THERMAL_EXT;
261 default: assert(false); return 0;
262 }
263}
264
265static inline XrPerfSettingsNotificationLevelEXT
266xrt_perf_notify_level_to_xr(enum xrt_perf_notify_level level)
267{
268 switch (level) {
269 case XRT_PERF_NOTIFY_LEVEL_NORMAL: return XR_PERF_SETTINGS_NOTIF_LEVEL_NORMAL_EXT;
270 case XRT_PERF_NOTIFY_LEVEL_WARNING: return XR_PERF_SETTINGS_NOTIF_LEVEL_WARNING_EXT;
271 case XRT_PERF_NOTIFY_LEVEL_IMPAIRED: return XR_PERF_SETTINGS_NOTIF_LEVEL_IMPAIRED_EXT;
272 default: assert(false); return 0;
273 }
274}
275
276static inline enum xrt_input_name
277xr_hand_tracking_data_source_to_xrt(XrHandTrackingDataSourceEXT data_source, enum XrHandEXT hand)
278{
279 switch (data_source) {
280 case XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_EXT:
281 return (hand == XR_HAND_LEFT_EXT) ? XRT_INPUT_HT_UNOBSTRUCTED_LEFT : XRT_INPUT_HT_UNOBSTRUCTED_RIGHT;
282 case XR_HAND_TRACKING_DATA_SOURCE_CONTROLLER_EXT:
283 return (hand == XR_HAND_LEFT_EXT) ? XRT_INPUT_HT_CONFORMING_LEFT : XRT_INPUT_HT_CONFORMING_RIGHT;
284 default: assert(false); return (enum xrt_input_name)(-1);
285 }
286}
287
288static inline XrHandTrackingDataSourceEXT
289xrt_hand_tracking_data_source_to_xr(enum xrt_input_name ht_input_name)
290{
291 switch (ht_input_name) {
292 case XRT_INPUT_HT_UNOBSTRUCTED_LEFT:
293 case XRT_INPUT_HT_UNOBSTRUCTED_RIGHT: return XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_EXT;
294 case XRT_INPUT_HT_CONFORMING_LEFT:
295 case XRT_INPUT_HT_CONFORMING_RIGHT: return XR_HAND_TRACKING_DATA_SOURCE_CONTROLLER_EXT;
296 default: assert(false); return XR_HAND_TRACKING_DATA_SOURCE_MAX_ENUM_EXT;
297 }
298}
299
300
301/*
302 *
303 * Basic types
304 *
305 */
306
307static inline XrExtent2Di
308xrt_size_to_xr(const struct xrt_size *x)
309{
310 return (XrExtent2Di){
311 .width = x->w,
312 .height = x->h,
313 };
314}
315
316static inline XrVector2f
317xrt_vec2_to_xr(const struct xrt_vec2 *v)
318{
319 return (XrVector2f){
320 .x = v->x,
321 .y = v->y,
322 };
323}
324
325static inline XrVector3f
326xrt_vec3_to_xr(const struct xrt_vec3 *v)
327{
328 return (XrVector3f){
329 .x = v->x,
330 .y = v->y,
331 .z = v->z,
332 };
333}
334
335static inline XrQuaternionf
336xrt_quat_to_xr(const struct xrt_quat *q)
337{
338 return (XrQuaternionf){
339 .x = q->x,
340 .y = q->y,
341 .z = q->z,
342 .w = q->w,
343 };
344}
345
346static inline XrPosef
347xrt_pose_to_xr(const struct xrt_pose *q)
348{
349 return (XrPosef){
350 .orientation = xrt_quat_to_xr(&q->orientation),
351 .position = xrt_vec3_to_xr(&q->position),
352 };
353}
354
355
356/*
357 *
358 * View things
359 *
360 */
361
362static inline XrViewConfigurationType
363xrt_view_type_to_xr(enum xrt_view_type view_type)
364{
365 switch (view_type) {
366 case XRT_VIEW_TYPE_MONO: return XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO;
367 case XRT_VIEW_TYPE_STEREO: return XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
368 }
369
370 // Used as default, to get warnings.
371 assert(false && "Invalid view type");
372 return XR_VIEW_CONFIGURATION_TYPE_MAX_ENUM;
373}
oxr_space_type
Internal enum for the type of space, lets us reason about action spaces.
Definition oxr_defines.h:113
xrt_input_type
Base type of this inputs.
Definition xrt_defines.h:847
xrt_form_factor
What form factor is this device, mostly maps onto OpenXR's XrFormFactor.
Definition xrt_defines.h:2398
xrt_input_name
Every internal input source known to monado with a baked in type.
Definition xrt_defines.h:930
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:625
#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:646
xrt_space_relation_flags
Flags of which components of a xrt_space_relation is valid.
Definition xrt_defines.h:655
@ XRT_INPUT_TYPE_POSE
A tracked pose.
Definition xrt_defines.h:860
@ XRT_INPUT_TYPE_VEC2_MINUS_ONE_TO_ONE
Vec2 input, components in [-1, 1].
Definition xrt_defines.h:854
@ XRT_INPUT_TYPE_VEC3_MINUS_ONE_TO_ONE
Vec3 input, components in [-1, 1].
Definition xrt_defines.h:856
@ XRT_INPUT_TYPE_VEC1_MINUS_ONE_TO_ONE
Float input in [-1, 1].
Definition xrt_defines.h:852
@ XRT_INPUT_TYPE_BOOLEAN
Boolean (digital, binary) input.
Definition xrt_defines.h:858
@ XRT_INPUT_TYPE_VEC1_ZERO_TO_ONE
Float input in [0, 1].
Definition xrt_defines.h:850
@ XRT_FORM_FACTOR_HANDHELD
Handheld display.
Definition xrt_defines.h:2400
@ XRT_FORM_FACTOR_HMD
Head mounted display.
Definition xrt_defines.h:2399
Shared internal defines and enums in the state tracker.
A pose composed of a position and orientation.
Definition xrt_defines.h:492
A quaternion with single floats.
Definition xrt_defines.h:235
Image size.
Definition xrt_defines.h:436
A 2 element vector with single floats.
Definition xrt_defines.h:268
A 3 element vector with single floats.
Definition xrt_defines.h:289
Common defines and enums for XRT.
xrt_perf_notify_level
Performance level.
Definition xrt_defines.h:2445
xrt_perf_domain
Domain type.
Definition xrt_defines.h:2418
xrt_view_type
View type to be rendered to by the compositor.
Definition xrt_defines.h:2407
xrt_perf_set_level
Performance level.
Definition xrt_defines.h:2434
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.