The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

st/oxr: Make reference space type support per system

Let's systems support different sets of references spaces.

+81 -8
+49 -8
src/xrt/state_trackers/oxr/oxr_api_space.c
··· 27 27 #include <inttypes.h> 28 28 29 29 30 + /* 31 + * 32 + * Helpers. 33 + * 34 + */ 35 + 36 + static XrResult 37 + is_reference_space_type_supported(struct oxr_logger *log, 38 + struct oxr_system *sys, 39 + const char *field_name, 40 + XrReferenceSpaceType referenceSpaceType) 41 + { 42 + for (uint32_t i = 0; i < sys->reference_space_count; i++) { 43 + if (sys->reference_spaces[i] == referenceSpaceType) { 44 + return XR_SUCCESS; 45 + } 46 + } 47 + 48 + return oxr_error(log, XR_ERROR_REFERENCE_SPACE_UNSUPPORTED, 49 + "(%s == 0x%08x) is not a supported XrReferenceSpaceType", field_name, referenceSpaceType); 50 + } 51 + 52 + 53 + /* 54 + * 55 + * API functions. 56 + * 57 + */ 58 + 30 59 XRAPI_ATTR XrResult XRAPI_CALL 31 60 oxr_xrCreateActionSpace(XrSession session, const XrActionSpaceCreateInfo *createInfo, XrSpace *space) 32 61 { ··· 52 81 return oxr_session_success_result(sess); 53 82 } 54 83 55 - static const XrReferenceSpaceType session_spaces[] = { 56 - XR_REFERENCE_SPACE_TYPE_VIEW, 57 - XR_REFERENCE_SPACE_TYPE_LOCAL, 58 - XR_REFERENCE_SPACE_TYPE_STAGE, 59 - }; 60 - 61 84 XRAPI_ATTR XrResult XRAPI_CALL 62 85 oxr_xrEnumerateReferenceSpaces(XrSession session, 63 86 uint32_t spaceCapacityInput, ··· 70 93 struct oxr_logger log; 71 94 OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess, "xrEnumerateReferenceSpaces"); 72 95 73 - OXR_TWO_CALL_HELPER(&log, spaceCapacityInput, spaceCountOutput, spaces, ARRAY_SIZE(session_spaces), 74 - session_spaces, oxr_session_success_result(sess)); 96 + OXR_TWO_CALL_HELPER( // 97 + &log, // 98 + spaceCapacityInput, // 99 + spaceCountOutput, // 100 + spaces, // 101 + sess->sys->reference_space_count, // 102 + sess->sys->reference_spaces, // 103 + oxr_session_success_result(sess)); // 75 104 } 76 105 77 106 XRAPI_ATTR XrResult XRAPI_CALL ··· 79 108 { 80 109 OXR_TRACE_MARKER(); 81 110 111 + XrResult ret; 82 112 struct oxr_session *sess; 83 113 struct oxr_logger log; 84 114 OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess, "xrGetReferenceSpaceBoundsRect"); ··· 96 126 referenceSpaceType); 97 127 } 98 128 129 + ret = is_reference_space_type_supported(&log, sess->sys, "referenceSpaceType", referenceSpaceType); 130 + if (ret != XR_SUCCESS) { 131 + return ret; 132 + } 133 + 99 134 bounds->width = 0.0; 100 135 bounds->height = 0.0; 101 136 ··· 116 151 OXR_VERIFY_SESSION_NOT_LOST(&log, sess); 117 152 OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, createInfo, XR_TYPE_REFERENCE_SPACE_CREATE_INFO); 118 153 OXR_VERIFY_POSE(&log, createInfo->poseInReferenceSpace); 154 + 155 + ret = is_reference_space_type_supported(&log, sess->sys, "createInfo->referenceSpaceType", 156 + createInfo->referenceSpaceType); 157 + if (ret != XR_SUCCESS) { 158 + return ret; 159 + } 119 160 120 161 ret = oxr_space_reference_create(&log, sess, createInfo, &spc); 121 162 if (ret != XR_SUCCESS) {
+3
src/xrt/state_trackers/oxr/oxr_objects.h
··· 1276 1276 uint32_t blend_mode_count; 1277 1277 XrEnvironmentBlendMode blend_modes[3]; 1278 1278 1279 + XrReferenceSpaceType reference_spaces[3]; 1280 + uint32_t reference_space_count; 1281 + 1279 1282 //! Cache of the last known system roles, see @xrt_system_roles::generation_id 1280 1283 struct xrt_system_roles dynamic_roles_cache; 1281 1284 struct os_mutex sync_actions_mutex;
+29
src/xrt/state_trackers/oxr/oxr_system.c
··· 175 175 sys->views[1].maxSwapchainSampleCount = info->views[1].max.sample_count; 176 176 // clang-format on 177 177 178 + 179 + /* 180 + * Blend mode support. 181 + */ 182 + 178 183 assert(info->supported_blend_mode_count <= ARRAY_SIZE(sys->blend_modes)); 179 184 assert(info->supported_blend_mode_count != 0); 180 185 ··· 183 188 sys->blend_modes[i] = (XrEnvironmentBlendMode)info->supported_blend_modes[i]; 184 189 } 185 190 sys->blend_mode_count = (uint32_t)info->supported_blend_mode_count; 191 + 192 + 193 + /* 194 + * Reference space support. 195 + */ 196 + 197 + static_assert(3 <= ARRAY_SIZE(sys->reference_spaces), "Not enough space in array"); 198 + 199 + if (sys->xso->semantic.view != NULL) { 200 + sys->reference_spaces[sys->reference_space_count++] = XR_REFERENCE_SPACE_TYPE_VIEW; 201 + } 202 + 203 + if (sys->xso->semantic.local != NULL) { 204 + sys->reference_spaces[sys->reference_space_count++] = XR_REFERENCE_SPACE_TYPE_LOCAL; 205 + } 206 + 207 + if (sys->xso->semantic.stage != NULL) { 208 + sys->reference_spaces[sys->reference_space_count++] = XR_REFERENCE_SPACE_TYPE_STAGE; 209 + } 210 + 211 + 212 + /* 213 + * Done. 214 + */ 186 215 187 216 return XR_SUCCESS; 188 217 }