Monado OpenXR Runtime
oxr_conversions.h
Go to the documentation of this file.
1 // Copyright 2018-2023, Collabora, Ltd.
2 // SPDX-License-Identifier: BSL-1.0
3 /*!
4  * @file
5  * @brief Smaller helper functions to convert between xrt and OpenXR things.
6  * @author Christoph Haag <christoph.haag@collabora.com>
7  * @author Jakob Bornecrantz <jakob@collabora.com>
8  * @ingroup oxr_main
9  */
10 
11 #pragma once
12 
13 #include "xrt/xrt_defines.h"
14 #include "xrt/xrt_space.h"
17 
18 
19 /*
20  *
21  * Space things.
22  *
23  */
24 
25 static inline XrSpaceLocationFlags
26 xrt_to_xr_space_location_flags(enum xrt_space_relation_flags relation_flags)
27 {
28  // clang-format off
29  bool valid_ori = (relation_flags & XRT_SPACE_RELATION_ORIENTATION_VALID_BIT) != 0;
30  bool tracked_ori = (relation_flags & XRT_SPACE_RELATION_ORIENTATION_TRACKED_BIT) != 0;
31  bool valid_pos = (relation_flags & XRT_SPACE_RELATION_POSITION_VALID_BIT) != 0;
32  bool tracked_pos = (relation_flags & XRT_SPACE_RELATION_POSITION_TRACKED_BIT) != 0;
33 
34  bool linear_vel = (relation_flags & XRT_SPACE_RELATION_LINEAR_VELOCITY_VALID_BIT) != 0;
35  bool angular_vel = (relation_flags & XRT_SPACE_RELATION_ANGULAR_VELOCITY_VALID_BIT) != 0;
36  // clang-format on
37 
38  XrSpaceLocationFlags location_flags = (XrSpaceLocationFlags)0;
39  if (valid_ori) {
40  location_flags |= XR_SPACE_LOCATION_ORIENTATION_VALID_BIT;
41  }
42  if (tracked_ori) {
43  location_flags |= XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT;
44  }
45  if (valid_pos) {
46  location_flags |= XR_SPACE_LOCATION_POSITION_VALID_BIT;
47  }
48  if (tracked_pos) {
49  location_flags |= XR_SPACE_LOCATION_POSITION_TRACKED_BIT;
50  }
51  if (linear_vel) {
52  location_flags |= XR_SPACE_VELOCITY_LINEAR_VALID_BIT;
53  }
54  if (angular_vel) {
55  location_flags |= XR_SPACE_VELOCITY_ANGULAR_VALID_BIT;
56  }
57 
58  return location_flags;
59 }
60 
61 static inline XrReferenceSpaceType
62 oxr_ref_space_to_xr(enum oxr_space_type space_type)
63 {
64  switch (space_type) {
65  case OXR_SPACE_TYPE_REFERENCE_VIEW: return XR_REFERENCE_SPACE_TYPE_VIEW;
66  case OXR_SPACE_TYPE_REFERENCE_LOCAL: return XR_REFERENCE_SPACE_TYPE_LOCAL;
67  case OXR_SPACE_TYPE_REFERENCE_LOCAL_FLOOR: return XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT;
68  case OXR_SPACE_TYPE_REFERENCE_STAGE: return XR_REFERENCE_SPACE_TYPE_STAGE;
69  case OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_MSFT: return XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT;
70  case OXR_SPACE_TYPE_REFERENCE_COMBINED_EYE_VARJO: return XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO;
71  case OXR_SPACE_TYPE_REFERENCE_LOCALIZATION_MAP_ML: return XR_REFERENCE_SPACE_TYPE_LOCALIZATION_MAP_ML;
72 
73  case OXR_SPACE_TYPE_ACTION: return XR_REFERENCE_SPACE_TYPE_MAX_ENUM;
74  }
75 
76  return XR_REFERENCE_SPACE_TYPE_MAX_ENUM;
77 }
78 
79 static inline enum oxr_space_type
80 xr_ref_space_to_oxr(XrReferenceSpaceType space_type)
81 {
82  switch (space_type) {
83  case XR_REFERENCE_SPACE_TYPE_VIEW: return OXR_SPACE_TYPE_REFERENCE_VIEW;
84  case XR_REFERENCE_SPACE_TYPE_LOCAL: return OXR_SPACE_TYPE_REFERENCE_LOCAL;
85  case XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT: return OXR_SPACE_TYPE_REFERENCE_LOCAL_FLOOR;
86  case XR_REFERENCE_SPACE_TYPE_STAGE: return OXR_SPACE_TYPE_REFERENCE_STAGE;
87  case XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT: return OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_MSFT;
88  case XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO: return OXR_SPACE_TYPE_REFERENCE_COMBINED_EYE_VARJO;
89  case XR_REFERENCE_SPACE_TYPE_LOCALIZATION_MAP_ML: return OXR_SPACE_TYPE_REFERENCE_LOCALIZATION_MAP_ML;
90 
91  case XR_REFERENCE_SPACE_TYPE_MAX_ENUM: return (enum oxr_space_type) - 1;
92  }
93 
94  // wrap around or negative depending on enum data type, invalid value either way.
95  return (enum oxr_space_type) - 1;
96 }
97 
98 static inline const char *
99 xr_ref_space_to_string(XrReferenceSpaceType space_type)
100 {
101  switch (space_type) {
102  case XR_REFERENCE_SPACE_TYPE_VIEW: return "XR_REFERENCE_SPACE_TYPE_VIEW";
103  case XR_REFERENCE_SPACE_TYPE_LOCAL: return "XR_REFERENCE_SPACE_TYPE_LOCAL";
104  case XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT: return "XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT";
105  case XR_REFERENCE_SPACE_TYPE_STAGE: return "XR_REFERENCE_SPACE_TYPE_STAGE";
106  case XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT: return "XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT";
107  case XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO: return "XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO";
108  case XR_REFERENCE_SPACE_TYPE_MAX_ENUM: return "XR_REFERENCE_SPACE_TYPE_MAX_ENUM";
109  default: return "UNKNOWN REFERENCE SPACE";
110  }
111 }
112 
113 static inline enum xrt_reference_space_type
114 oxr_ref_space_to_xrt(enum oxr_space_type space_type)
115 {
116  switch (space_type) {
117  case OXR_SPACE_TYPE_REFERENCE_VIEW: return XRT_SPACE_REFERENCE_TYPE_VIEW;
118  case OXR_SPACE_TYPE_REFERENCE_LOCAL: return XRT_SPACE_REFERENCE_TYPE_LOCAL;
119  case OXR_SPACE_TYPE_REFERENCE_LOCAL_FLOOR: return XRT_SPACE_REFERENCE_TYPE_LOCAL_FLOOR;
120  case OXR_SPACE_TYPE_REFERENCE_STAGE: return XRT_SPACE_REFERENCE_TYPE_STAGE;
121  case OXR_SPACE_TYPE_REFERENCE_UNBOUNDED_MSFT: return XRT_SPACE_REFERENCE_TYPE_UNBOUNDED;
122 
123  // Has no mapping to a Monado semantic space.
124  case OXR_SPACE_TYPE_REFERENCE_COMBINED_EYE_VARJO: return XRT_SPACE_REFERENCE_TYPE_INVALID;
125  case OXR_SPACE_TYPE_REFERENCE_LOCALIZATION_MAP_ML: return XRT_SPACE_REFERENCE_TYPE_INVALID;
126  case OXR_SPACE_TYPE_ACTION: return XRT_SPACE_REFERENCE_TYPE_INVALID;
127  }
128 
129  /*
130  * This is the default case, we do not have a explicit default case
131  * so that we get warnings for unhandled enum members. This is fine
132  * because the C specification says if there is no default case and
133  * and a non-matching value is given no case is executed.
134  */
135 
137 }
138 
139 
140 /*
141  *
142  * IO things.
143  *
144  */
145 
146 static inline const char *
147 xrt_input_type_to_str(enum xrt_input_type type)
148 {
149  // clang-format off
150  switch (type) {
151  case XRT_INPUT_TYPE_VEC1_ZERO_TO_ONE: return "XRT_INPUT_TYPE_VEC1_ZERO_TO_ONE";
152  case XRT_INPUT_TYPE_VEC1_MINUS_ONE_TO_ONE: return "XRT_INPUT_TYPE_VEC1_MINUS_ONE_TO_ONE";
153  case XRT_INPUT_TYPE_VEC2_MINUS_ONE_TO_ONE: return "XRT_INPUT_TYPE_VEC2_MINUS_ONE_TO_ONE";
154  case XRT_INPUT_TYPE_VEC3_MINUS_ONE_TO_ONE: return "XRT_INPUT_TYPE_VEC3_MINUS_ONE_TO_ONE";
155  case XRT_INPUT_TYPE_BOOLEAN: return "XRT_INPUT_TYPE_BOOLEAN";
156  case XRT_INPUT_TYPE_POSE: return "XRT_INPUT_TYPE_POSE";
157  default: return "XRT_INPUT_UNKNOWN";
158  }
159  // clang-format on
160 }
161 
162 static inline enum xrt_perf_set_level
163 xr_perf_level_to_xrt(XrPerfSettingsLevelEXT level)
164 {
165  switch (level) {
166  case XR_PERF_SETTINGS_LEVEL_POWER_SAVINGS_EXT: return XRT_PERF_SET_LEVEL_POWER_SAVINGS;
167  case XR_PERF_SETTINGS_LEVEL_SUSTAINED_LOW_EXT: return XRT_PERF_SET_LEVEL_SUSTAINED_LOW;
168  case XR_PERF_SETTINGS_LEVEL_SUSTAINED_HIGH_EXT: return XRT_PERF_SET_LEVEL_SUSTAINED_HIGH;
169  case XR_PERF_SETTINGS_LEVEL_BOOST_EXT: return XRT_PERF_SET_LEVEL_BOOST;
170  default: assert(false); return 0;
171  }
172 }
173 
174 static inline enum xrt_perf_domain
175 xr_perf_domain_to_xrt(XrPerfSettingsDomainEXT domain)
176 {
177  switch (domain) {
178  case XR_PERF_SETTINGS_DOMAIN_CPU_EXT: return XRT_PERF_DOMAIN_CPU;
179  case XR_PERF_SETTINGS_DOMAIN_GPU_EXT: return XRT_PERF_DOMAIN_GPU;
180  default: assert(false); return 0;
181  }
182 }
183 
184 static inline XrPerfSettingsDomainEXT
185 xrt_perf_domain_to_xr(enum xrt_perf_domain domain)
186 {
187  switch (domain) {
188  case XRT_PERF_DOMAIN_CPU: return XR_PERF_SETTINGS_DOMAIN_CPU_EXT;
189  case XRT_PERF_DOMAIN_GPU: return XR_PERF_SETTINGS_DOMAIN_GPU_EXT;
190  default: assert(false); return 0;
191  }
192 }
193 
194 static inline XrPerfSettingsSubDomainEXT
195 xrt_perf_sub_domain_to_xr(enum xrt_perf_sub_domain subDomain)
196 {
197  switch (subDomain) {
198  case XRT_PERF_SUB_DOMAIN_COMPOSITING: return XR_PERF_SETTINGS_SUB_DOMAIN_COMPOSITING_EXT;
199  case XRT_PERF_SUB_DOMAIN_RENDERING: return XR_PERF_SETTINGS_SUB_DOMAIN_RENDERING_EXT;
200  case XRT_PERF_SUB_DOMAIN_THERMAL: return XR_PERF_SETTINGS_SUB_DOMAIN_THERMAL_EXT;
201  default: assert(false); return 0;
202  }
203 }
204 
205 static inline XrPerfSettingsNotificationLevelEXT
206 xrt_perf_notify_level_to_xr(enum xrt_perf_notify_level level)
207 {
208  switch (level) {
209  case XRT_PERF_NOTIFY_LEVEL_NORMAL: return XR_PERF_SETTINGS_NOTIF_LEVEL_NORMAL_EXT;
210  case XRT_PERF_NOTIFY_LEVEL_WARNING: return XR_PERF_SETTINGS_NOTIF_LEVEL_WARNING_EXT;
211  case XRT_PERF_NOTIFY_LEVEL_IMPAIRED: return XR_PERF_SETTINGS_NOTIF_LEVEL_IMPAIRED_EXT;
212  default: assert(false); return 0;
213  }
214 }
oxr_space_type
Internal enum for the type of space, lets us reason about action spaces.
Definition: oxr_defines.h:99
xrt_input_type
Base type of this inputs.
Definition: xrt_defines.h:784
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:599
#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:620
xrt_space_relation_flags
Flags of which components of a xrt_space_relation is valid.
Definition: xrt_defines.h:629
@ XRT_INPUT_TYPE_POSE
A tracked pose.
Definition: xrt_defines.h:797
@ XRT_INPUT_TYPE_VEC2_MINUS_ONE_TO_ONE
Vec2 input, components in [-1, 1].
Definition: xrt_defines.h:791
@ XRT_INPUT_TYPE_VEC3_MINUS_ONE_TO_ONE
Vec3 input, components in [-1, 1].
Definition: xrt_defines.h:793
@ XRT_INPUT_TYPE_VEC1_MINUS_ONE_TO_ONE
Float input in [-1, 1].
Definition: xrt_defines.h:789
@ XRT_INPUT_TYPE_BOOLEAN
Boolean (digital, binary) input.
Definition: xrt_defines.h:795
@ XRT_INPUT_TYPE_VEC1_ZERO_TO_ONE
Float input in [0, 1].
Definition: xrt_defines.h:787
Common defines and enums for XRT.
xrt_perf_notify_level
Performance level.
Definition: xrt_defines.h:1529
xrt_perf_domain
Domain type.
Definition: xrt_defines.h:1502
xrt_perf_set_level
Performance level.
Definition: xrt_defines.h:1518
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.