The open source OpenXR runtime
0
fork

Configure Feed

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

st/oxr: Add XR_MNDX_xdev_space support

authored by

Jakob Bornecrantz and committed by
Christoph Haag
717c3e2a 18fc4737

+499 -5
+4
CMakeLists.txt
··· 370 370 if(NOT DEFINED XRT_FEATURE_OPENXR_BODY_TRACKING_FB) 371 371 set(XRT_FEATURE_OPENXR_BODY_TRACKING_FB OFF) 372 372 endif() 373 + if(NOT DEFINED XRT_FEATURE_OPENXR_XDEV_SPACE) 374 + set(XRT_FEATURE_OPENXR_XDEV_SPACE ON) 375 + endif() 373 376 374 377 # Interaction extension support. 375 378 if(NOT DEFINED XRT_FEATURE_OPENXR_INTERACTION_EXT_EYE_GAZE) ··· 653 656 message(STATUS "# FEATURE_OPENXR_SPACE_UNBOUNDED: ${XRT_FEATURE_OPENXR_SPACE_UNBOUNDED}") 654 657 message(STATUS "# FEATURE_OPENXR_VISIBILITY_MASK ${XRT_FEATURE_OPENXR_VISIBILITY_MASK}") 655 658 message(STATUS "# FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST ${XRT_FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST}") 659 + message(STATUS "# FEATURE_OPENXR_XDEV_SPACE: ${XRT_FEATURE_OPENXR_XDEV_SPACE}") 656 660 message(STATUS "# FEATURE_RENDERDOC: ${XRT_FEATURE_RENDERDOC}") 657 661 message(STATUS "# FEATURE_SERVICE: ${XRT_FEATURE_SERVICE}") 658 662 message(STATUS "# FEATURE_SERVICE_SYSTEMD: ${XRT_FEATURE_SERVICE_SYSTEMD}")
+2 -1
scripts/generate_oxr_ext_support.py
··· 1 1 #!/usr/bin/env python3 2 - # Copyright 2019-2022, Collabora, Ltd. 2 + # Copyright 2019-2024, Collabora, Ltd. 3 3 # SPDX-License-Identifier: BSL-1.0 4 4 """Simple script to update oxr_extension_support.h.""" 5 5 ··· 86 86 ['XR_MNDX_force_feedback_curl', 'XRT_FEATURE_OPENXR_FORCE_FEEDBACK_CURL'], 87 87 ['XR_MNDX_hydra', 'XRT_FEATURE_OPENXR_INTERACTION_MNDX'], 88 88 ['XR_MNDX_system_buttons', 'XRT_FEATURE_OPENXR_INTERACTION_MNDX'], 89 + ['XR_MNDX_xdev_space', 'XRT_FEATURE_OPENXR_XDEV_SPACE'], 89 90 ) 90 91 91 92
+1
src/xrt/include/xrt/xrt_config_build.h.cmake_in
··· 59 59 #cmakedefine XRT_FEATURE_OPENXR_SPACE_UNBOUNDED 60 60 #cmakedefine XRT_FEATURE_OPENXR_VISIBILITY_MASK 61 61 #cmakedefine XRT_FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST 62 + #cmakedefine XRT_FEATURE_OPENXR_XDEV_SPACE 62 63 #cmakedefine XRT_FEATURE_RENDERDOC 63 64 #cmakedefine XRT_FEATURE_SERVICE 64 65 #cmakedefine XRT_FEATURE_SERVICE_SYSTEMD
+2 -1
src/xrt/state_trackers/oxr/CMakeLists.txt
··· 1 - # Copyright 2019-2022, Collabora, Ltd. 1 + # Copyright 2019-2024, Collabora, Ltd. 2 2 # SPDX-License-Identifier: BSL-1.0 3 3 4 4 ### ··· 16 16 oxr_api_swapchain.c 17 17 oxr_api_system.c 18 18 oxr_api_verify.h 19 + oxr_api_xdev.c 19 20 oxr_binding.c 20 21 oxr_chain.h 21 22 oxr_dpad.c
+37
src/xrt/state_trackers/oxr/oxr_api_funcs.h
··· 646 646 XrBodyJointLocationsFB *locations); 647 647 #endif 648 648 649 + 650 + /* 651 + * 652 + * oxr_api_xdev.c 653 + * 654 + */ 655 + 656 + #ifdef OXR_HAVE_MNDX_xdev_space 657 + //! OpenXR API function @ep{xrCreateXDevListMNDX} 658 + XRAPI_ATTR XrResult XRAPI_CALL 659 + oxr_xrCreateXDevListMNDX(XrSession session, const XrCreateXDevListInfoMNDX *info, XrXDevListMNDX *xdevList); 660 + 661 + //! OpenXR API function @ep{xrGetXDevListGenerationNumberMNDX} 662 + XRAPI_ATTR XrResult XRAPI_CALL 663 + oxr_xrGetXDevListGenerationNumberMNDX(XrXDevListMNDX session, uint64_t *outGeneration); 664 + 665 + //! OpenXR API function @ep{xrEnumerateXDevsMNDX} 666 + XRAPI_ATTR XrResult XRAPI_CALL 667 + oxr_xrEnumerateXDevsMNDX(XrXDevListMNDX xdevList, 668 + uint32_t xdevCapacityInput, 669 + uint32_t *xdevCountOutput, 670 + XrXDevIdMNDX *xdevs); 671 + 672 + //! OpenXR API function @ep{xrGetXDevProperty} 673 + XRAPI_ATTR XrResult XRAPI_CALL 674 + oxr_xrGetXDevPropertiesMNDX(XrXDevListMNDX xdevList, const XrGetXDevInfoMNDX *info, XrXDevPropertiesMNDX *properties); 675 + 676 + //! OpenXR API function @ep{xrDestroyXDevListMNDX} 677 + XRAPI_ATTR XrResult XRAPI_CALL 678 + oxr_xrDestroyXDevListMNDX(XrXDevListMNDX xdevList); 679 + 680 + //! OpenXR API function @ep{xrCreateXDevSpace} 681 + XRAPI_ATTR XrResult XRAPI_CALL 682 + oxr_xrCreateXDevSpaceMNDX(XrSession session, const XrCreateXDevSpaceInfoMNDX *createInfo, XrSpace *space); 683 + #endif 684 + 685 + 649 686 /*! 650 687 * @} 651 688 */
+9
src/xrt/state_trackers/oxr/oxr_api_negotiate.c
··· 319 319 ENTRY_IF_EXT(xrLocateBodyJointsFB, FB_body_tracking); 320 320 #endif 321 321 322 + #ifdef OXR_HAVE_MNDX_xdev_space 323 + ENTRY_IF_EXT(xrCreateXDevListMNDX, MNDX_xdev_space); 324 + ENTRY_IF_EXT(xrGetXDevListGenerationNumberMNDX, MNDX_xdev_space); 325 + ENTRY_IF_EXT(xrEnumerateXDevsMNDX, MNDX_xdev_space); 326 + ENTRY_IF_EXT(xrGetXDevPropertiesMNDX, MNDX_xdev_space); 327 + ENTRY_IF_EXT(xrDestroyXDevListMNDX, MNDX_xdev_space); 328 + ENTRY_IF_EXT(xrCreateXDevSpaceMNDX, MNDX_xdev_space); 329 + #endif // OXR_HAVE_MNDX_xdev_space 330 + 322 331 /* 323 332 * Not logging here because there's no need to loudly advertise 324 333 * which extensions the loader knows about (it calls this on
+3
src/xrt/state_trackers/oxr/oxr_api_verify.h
··· 76 76 OXR_VERIFY_AND_SET_AND_INIT(log, thing, new_thing, oxr_facial_tracker_htc, FTRACKER, name, new_thing->sess->sys->inst) 77 77 #define OXR_VERIFY_BODY_TRACKER_FB_AND_INIT_LOG(log, thing, new_thing, name) \ 78 78 OXR_VERIFY_AND_SET_AND_INIT(log, thing, new_thing, oxr_body_tracker_fb, BTRACKER, name, new_thing->sess->sys->inst) 79 + #define OXR_VERIFY_XDEVLIST_AND_INIT_LOG(log, thing, new_thing, name) \ 80 + OXR_VERIFY_AND_SET_AND_INIT(log, thing, new_thing, oxr_xdev_list, XDEVLIST, name, new_thing->sess->sys->inst) 79 81 // clang-format on 80 82 81 83 #define OXR_VERIFY_INSTANCE_NOT_NULL(log, arg, new_arg) OXR_VERIFY_SET(log, arg, new_arg, oxr_instance, INSTANCE); ··· 85 87 #define OXR_VERIFY_ACTION_NOT_NULL(log, arg, new_arg) OXR_VERIFY_SET(log, arg, new_arg, oxr_action, ACTION); 86 88 #define OXR_VERIFY_SWAPCHAIN_NOT_NULL(log, arg, new_arg) OXR_VERIFY_SET(log, arg, new_arg, oxr_swapchain, SWAPCHAIN); 87 89 #define OXR_VERIFY_ACTIONSET_NOT_NULL(log, arg, new_arg) OXR_VERIFY_SET(log, arg, new_arg, oxr_action_set, ACTIONSET); 90 + #define OXR_VERIFY_XDEVLIST_NOT_NULL(log, arg, new_arg) OXR_VERIFY_SET(log, arg, new_arg, oxr_xdev_list, XDEVLIST); 88 91 89 92 /*! 90 93 * Checks if a required extension is enabled.
+193
src/xrt/state_trackers/oxr/oxr_api_xdev.c
··· 1 + // Copyright 2019-2024, Collabora, Ltd. 2 + // SPDX-License-Identifier: BSL-1.0 3 + /*! 4 + * @file 5 + * @brief Monado @ref xrt_device API functions. 6 + * @author Jakob Bornecrantz <jakob@collabora.com> 7 + * @ingroup oxr_api 8 + */ 9 + 10 + #include "openxr/openxr.h" 11 + #include "xrt/xrt_compiler.h" 12 + 13 + #include "math/m_api.h" 14 + 15 + #include "util/u_debug.h" 16 + #include "util/u_trace_marker.h" 17 + 18 + #include "oxr_objects.h" 19 + #include "oxr_logger.h" 20 + #include "oxr_two_call.h" 21 + 22 + #include "oxr_api_funcs.h" 23 + #include "oxr_api_verify.h" 24 + 25 + #include <inttypes.h> 26 + 27 + 28 + #ifdef OXR_HAVE_MNDX_xdev_space 29 + 30 + /* 31 + * 32 + * Helper functions. 33 + * 34 + */ 35 + 36 + #define OXR_VERIFY_XDEV_SPACE_SUPPORT(log, sys) \ 37 + do { \ 38 + if (!sys->supports_xdev_space) { \ 39 + return oxr_error(log, XR_ERROR_FEATURE_UNSUPPORTED, " system doesn't support xdev space"); \ 40 + } \ 41 + } while (0) 42 + 43 + static bool 44 + find_index(const struct oxr_xdev_list *xdl, uint64_t id, uint32_t *out_index) 45 + { 46 + uint32_t index = 0; 47 + for (; index < xdl->device_count; index++) { 48 + if (id != xdl->ids[index]) { 49 + continue; 50 + } 51 + break; 52 + } 53 + 54 + if (index >= xdl->device_count) { 55 + return false; 56 + } 57 + 58 + *out_index = index; 59 + 60 + return true; 61 + } 62 + 63 + 64 + /* 65 + * 66 + * API functions. 67 + * 68 + */ 69 + 70 + XRAPI_ATTR XrResult XRAPI_CALL 71 + oxr_xrCreateXDevListMNDX(XrSession session, const XrCreateXDevListInfoMNDX *info, XrXDevListMNDX *xdevList) 72 + { 73 + OXR_TRACE_MARKER(); 74 + 75 + struct oxr_session *sess; 76 + struct oxr_logger log; 77 + OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess, "xrCreateXDevListMNDX"); 78 + OXR_VERIFY_XDEV_SPACE_SUPPORT(&log, sess->sys); 79 + OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, info, XR_TYPE_CREATE_XDEV_LIST_INFO_MNDX); 80 + struct oxr_xdev_list *xdl = NULL; 81 + XrResult ret = oxr_xdev_list_create(&log, sess, info, &xdl); 82 + if (ret != XR_SUCCESS) { 83 + return ret; 84 + } 85 + 86 + *xdevList = oxr_xdev_list_to_openxr(xdl); 87 + 88 + return XR_SUCCESS; 89 + } 90 + 91 + XRAPI_ATTR XrResult XRAPI_CALL 92 + oxr_xrGetXDevListGenerationNumberMNDX(XrXDevListMNDX xdevList, uint64_t *outGeneration) 93 + { 94 + struct oxr_xdev_list *xdl; 95 + struct oxr_logger log; 96 + 97 + OXR_VERIFY_XDEVLIST_AND_INIT_LOG(&log, xdevList, xdl, "xrGetXDevListGenerationNumberMNDX"); 98 + *outGeneration = xdl->generation_number; 99 + 100 + return XR_SUCCESS; 101 + } 102 + 103 + XRAPI_ATTR XrResult XRAPI_CALL 104 + oxr_xrEnumerateXDevsMNDX(XrXDevListMNDX xdevList, 105 + uint32_t xdevCapacityInput, 106 + uint32_t *xdevCountOutput, 107 + XrXDevIdMNDX *xdevs) 108 + { 109 + struct oxr_xdev_list *xdl; 110 + struct oxr_logger log; 111 + 112 + OXR_VERIFY_XDEVLIST_AND_INIT_LOG(&log, xdevList, xdl, "xrEnumerateXDevsMNDX"); 113 + 114 + OXR_TWO_CALL_HELPER(&log, xdevCapacityInput, xdevCountOutput, xdevs, xdl->device_count, xdl->ids, 115 + oxr_session_success_result(xdl->sess)); 116 + } 117 + 118 + XRAPI_ATTR XrResult XRAPI_CALL 119 + oxr_xrGetXDevPropertiesMNDX(XrXDevListMNDX xdevList, const XrGetXDevInfoMNDX *info, XrXDevPropertiesMNDX *properties) 120 + { 121 + struct oxr_xdev_list *xdl; 122 + struct oxr_logger log; 123 + OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, info, XR_TYPE_GET_XDEV_INFO_MNDX); 124 + OXR_VERIFY_XDEVLIST_AND_INIT_LOG(&log, xdevList, xdl, "xrGetXDevPropertiesMNDX"); 125 + 126 + uint32_t index = 0; 127 + if (!find_index(xdl, info->id, &index)) { 128 + return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE, "(info->id == %" PRIu64 ") Not a valid id", 129 + info->id); 130 + } 131 + 132 + XrResult ret = oxr_xdev_list_get_properties(&log, xdl, index, properties); 133 + if (ret != XR_SUCCESS) { 134 + return ret; 135 + } 136 + 137 + return oxr_session_success_result(xdl->sess); 138 + } 139 + 140 + XRAPI_ATTR XrResult XRAPI_CALL 141 + oxr_xrDestroyXDevListMNDX(XrXDevListMNDX xdevList) 142 + { 143 + struct oxr_xdev_list *xdl; 144 + struct oxr_logger log; 145 + 146 + OXR_VERIFY_XDEVLIST_AND_INIT_LOG(&log, xdevList, xdl, "xrDestroyXDevListMNDX"); 147 + 148 + return oxr_handle_destroy(&log, &xdl->handle); 149 + } 150 + 151 + XRAPI_ATTR XrResult XRAPI_CALL 152 + oxr_xrCreateXDevSpaceMNDX(XrSession session, const XrCreateXDevSpaceInfoMNDX *createInfo, XrSpace *space) 153 + { 154 + struct oxr_session *sess; 155 + struct oxr_xdev_list *xdl; 156 + struct oxr_logger log; 157 + OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, createInfo, XR_TYPE_CREATE_XDEV_SPACE_INFO_MNDX); 158 + OXR_VERIFY_ARG_NOT_NULL(&log, space); 159 + OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess, "xrCreateXDevSpaceMNDX"); 160 + OXR_VERIFY_XDEV_SPACE_SUPPORT(&log, sess->sys); 161 + OXR_VERIFY_XDEVLIST_NOT_NULL(&log, createInfo->xdevList, xdl); 162 + OXR_VERIFY_POSE(&log, createInfo->offset); 163 + 164 + if (sess != xdl->sess) { 165 + return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE, 166 + "XDevSpace XrSpace must be created on the same session as XDevList"); 167 + } 168 + 169 + uint32_t index = 0; 170 + if (!find_index(xdl, createInfo->id, &index)) { 171 + return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE, "(createInfo->id == %" PRIu64 ") Not a valid id", 172 + createInfo->id); 173 + } 174 + 175 + if (xdl->names[index] == 0) { 176 + return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE, 177 + "(createInfo->id == %" PRIu64 178 + ") Can not create a space. Is XrXDevPropertiesMNDX::canCreateSpace true?", 179 + createInfo->id); 180 + } 181 + 182 + struct oxr_space *spc = NULL; 183 + XrResult ret = oxr_xdev_list_space_create(&log, xdl, createInfo, index, &spc); 184 + if (ret != XR_SUCCESS) { 185 + return ret; 186 + } 187 + 188 + *space = oxr_space_to_openxr(spc); 189 + 190 + return oxr_session_success_result(sess); 191 + } 192 + 193 + #endif
+1
src/xrt/state_trackers/oxr/oxr_defines.h
··· 31 31 #define OXR_XR_DEBUG_FTRACKER (*(uint64_t *)"oxrftra\0") 32 32 // body tracker 33 33 #define OXR_XR_DEBUG_BTRACKER (*(uint64_t *)"oxrbtra\0") 34 + #define OXR_XR_DEBUG_XDEVLIST (*(uint64_t *)"oxrxdli\0") 34 35 // clang-format on 35 36 36 37 /*!
+13 -1
src/xrt/state_trackers/oxr/oxr_extension_support.h
··· 622 622 #define OXR_EXTENSION_SUPPORT_MNDX_system_buttons(_) 623 623 #endif 624 624 625 + 626 + /* 627 + * XR_MNDX_xdev_space 628 + */ 629 + #if defined(XR_MNDX_xdev_space) && defined(XRT_FEATURE_OPENXR_XDEV_SPACE) 630 + #define OXR_HAVE_MNDX_xdev_space 631 + #define OXR_EXTENSION_SUPPORT_MNDX_xdev_space(_) _(MNDX_xdev_space, MNDX_XDEV_SPACE) 632 + #else 633 + #define OXR_EXTENSION_SUPPORT_MNDX_xdev_space(_) 634 + #endif 635 + 625 636 // end of GENERATED per-extension defines - do not modify - used by scripts 626 637 627 638 /*! ··· 698 709 OXR_EXTENSION_SUPPORT_MNDX_egl_enable(_) \ 699 710 OXR_EXTENSION_SUPPORT_MNDX_force_feedback_curl(_) \ 700 711 OXR_EXTENSION_SUPPORT_MNDX_hydra(_) \ 701 - OXR_EXTENSION_SUPPORT_MNDX_system_buttons(_) 712 + OXR_EXTENSION_SUPPORT_MNDX_system_buttons(_) \ 713 + OXR_EXTENSION_SUPPORT_MNDX_xdev_space(_) 702 714 // clang-format on
+62
src/xrt/state_trackers/oxr/oxr_objects.h
··· 124 124 struct oxr_facial_tracker_htc; 125 125 struct oxr_facial_tracker_fb; 126 126 struct oxr_body_tracker_fb; 127 + struct oxr_xdev_list; 127 128 128 129 #define XRT_MAX_HANDLE_CHILDREN 256 129 130 #define OXR_MAX_BINDINGS_PER_ACTION 32 ··· 1118 1119 XrTime at_time, 1119 1120 struct xrt_hand_joint_set *out_value); 1120 1121 1122 + #ifdef OXR_HAVE_MNDX_xdev_space 1123 + static inline XrXDevListMNDX 1124 + oxr_xdev_list_to_openxr(struct oxr_xdev_list *sc) 1125 + { 1126 + return XRT_CAST_PTR_TO_OXR_HANDLE(XrXDevListMNDX, sc); 1127 + } 1128 + 1129 + XrResult 1130 + oxr_xdev_list_create(struct oxr_logger *log, 1131 + struct oxr_session *sess, 1132 + const XrCreateXDevListInfoMNDX *createInfo, 1133 + struct oxr_xdev_list **out_xdl); 1134 + 1135 + XrResult 1136 + oxr_xdev_list_get_properties(struct oxr_logger *log, 1137 + struct oxr_xdev_list *xdl, 1138 + uint32_t index, 1139 + XrXDevPropertiesMNDX *properties); 1140 + 1141 + XrResult 1142 + oxr_xdev_list_space_create(struct oxr_logger *log, 1143 + struct oxr_xdev_list *xdl, 1144 + const XrCreateXDevSpaceInfoMNDX *createInfo, 1145 + uint32_t index, 1146 + struct oxr_space **out_space); 1147 + 1148 + #endif // OXR_HAVE_MNDX_xdev_space 1149 + 1121 1150 1122 1151 /* 1123 1152 * ··· 1421 1450 1422 1451 struct xrt_visibility_mask *visibility_mask[2]; 1423 1452 1453 + #ifdef OXR_HAVE_MNDX_xdev_space 1454 + bool supports_xdev_space; 1455 + #endif 1456 + 1424 1457 #ifdef XR_USE_GRAPHICS_API_VULKAN 1425 1458 //! The instance/device we create when vulkan_enable2 is used 1426 1459 VkInstance vulkan_enable2_instance; ··· 2694 2727 const XrBodyJointsLocateInfoFB *locateInfo, 2695 2728 XrBodyJointLocationsFB *locations); 2696 2729 #endif 2730 + 2731 + #ifdef OXR_HAVE_MNDX_xdev_space 2732 + /*! 2733 + * Object that holds a list of the current @ref xrt_devices. 2734 + * 2735 + * Parent type/handle is @ref oxr_session 2736 + * 2737 + * @obj{XrXDevList} 2738 + * @extends oxr_handle_base 2739 + */ 2740 + struct oxr_xdev_list 2741 + { 2742 + //! Common structure for things referred to by OpenXR handles. 2743 + struct oxr_handle_base handle; 2744 + 2745 + //! Owner of this @ref xrt_device list. 2746 + struct oxr_session *sess; 2747 + 2748 + //! Monotonically increasing number. 2749 + uint64_t generation_number; 2750 + 2751 + uint64_t ids[XRT_SYSTEM_MAX_DEVICES]; 2752 + struct xrt_device *xdevs[XRT_SYSTEM_MAX_DEVICES]; 2753 + enum xrt_input_name names[XRT_SYSTEM_MAX_DEVICES]; 2754 + 2755 + //! Counts ids, names and xdevs. 2756 + uint32_t device_count; 2757 + }; 2758 + #endif // OXR_HAVE_MNDX_xdev_space 2697 2759 2698 2760 /*! 2699 2761 * @}
+22
src/xrt/state_trackers/oxr/oxr_system.c
··· 222 222 223 223 224 224 /* 225 + * Misc 226 + */ 227 + 228 + #ifdef OXR_HAVE_MNDX_xdev_space 229 + // By default xdev_space is implemented in the state tracker and does not need explicit system support. 230 + sys->supports_xdev_space = true; 231 + #endif 232 + 233 + /* 225 234 * Done. 226 235 */ 227 236 ··· 423 432 body_tracking_fb_props->supportsBodyTracking = oxr_system_get_body_tracking_fb_support(log, sys->inst); 424 433 } 425 434 #endif // OXR_HAVE_FB_body_tracking 435 + 436 + 437 + #ifdef OXR_HAVE_MNDX_xdev_space 438 + XrSystemXDevSpacePropertiesMNDX *xdev_space_props = NULL; 439 + if (sys->inst->extensions.MNDX_xdev_space) { 440 + xdev_space_props = OXR_GET_OUTPUT_FROM_CHAIN(properties, XR_TYPE_SYSTEM_XDEV_SPACE_PROPERTIES_MNDX, 441 + XrSystemXDevSpacePropertiesMNDX); 442 + } 443 + 444 + if (xdev_space_props) { 445 + xdev_space_props->supportsXDevSpace = sys->supports_xdev_space; 446 + } 447 + #endif // OXR_HAVE_MNDX_xdev_space 426 448 427 449 return XR_SUCCESS; 428 450 }
+150 -2
src/xrt/state_trackers/oxr/oxr_xdev.c
··· 1 - // Copyright 2019-2020, Collabora, Ltd. 1 + // Copyright 2019-2024, Collabora, Ltd. 2 2 // SPDX-License-Identifier: BSL-1.0 3 3 /*! 4 4 * @file ··· 16 16 #include "util/u_misc.h" 17 17 18 18 #include "oxr_objects.h" 19 + #include "oxr_logger.h" 20 + #include "oxr_handle.h" 21 + #include "xrt/xrt_defines.h" 19 22 20 - #include <assert.h> 23 + #include <stdio.h> 24 + #include <inttypes.h> 21 25 22 26 27 + /* 28 + * 29 + * Helper functions. 30 + * 31 + */ 32 + 33 + #ifdef OXR_HAVE_MNDX_xdev_space 34 + static enum xrt_input_name 35 + find_suitable_pose_name(struct xrt_device *xdev) 36 + { 37 + //! @todo More complete set of poses / a system to enumerate all canonical device poses. 38 + for (uint32_t i = 0; i < xdev->input_count; i++) { 39 + enum xrt_input_name name = xdev->inputs[i].name; 40 + switch (name) { 41 + case XRT_INPUT_GENERIC_HEAD_POSE: return name; 42 + case XRT_INPUT_GENERIC_TRACKER_POSE: return name; 43 + case XRT_INPUT_INDEX_GRIP_POSE: return name; 44 + default: break; 45 + } 46 + } 47 + 48 + return 0; 49 + } 50 + #endif 51 + 52 + 53 + /* 54 + * 55 + * 'Exported' functions. 56 + * 57 + */ 58 + 23 59 void 24 60 oxr_xdev_destroy(struct xrt_device **xdev_ptr) 25 61 { ··· 97 133 98 134 *out_value = value; 99 135 } 136 + 137 + 138 + /* 139 + * 140 + * XDev List 141 + * 142 + */ 143 + 144 + #ifdef OXR_HAVE_MNDX_xdev_space 145 + 146 + static XrResult 147 + oxr_xdev_list_destroy(struct oxr_logger *log, struct oxr_handle_base *hb) 148 + { 149 + struct oxr_xdev_list *xdl = (struct oxr_xdev_list *)hb; 150 + 151 + free(xdl); 152 + 153 + return XR_SUCCESS; 154 + } 155 + 156 + XrResult 157 + oxr_xdev_list_create(struct oxr_logger *log, 158 + struct oxr_session *sess, 159 + const XrCreateXDevListInfoMNDX *createInfo, 160 + struct oxr_xdev_list **out_xdl) 161 + { 162 + struct xrt_system_devices *xsysd = sess->sys->xsysd; 163 + uint32_t count = xsysd->xdev_count; 164 + 165 + struct oxr_xdev_list *xdl = NULL; 166 + OXR_ALLOCATE_HANDLE_OR_RETURN(log, xdl, OXR_XR_DEBUG_XDEVLIST, oxr_xdev_list_destroy, &sess->handle); 167 + 168 + /** 169 + * @todo Should ids be explicitly unique per xdev list? Currently an id queried from xdev list 1 may or may not 170 + * refer to the same xdev as an id queried from xdev list 2, which is error prone for app developers. 171 + * 172 + * On the other hand, it may be desirable to keep an id for an xdev fixed for the life time of the xdev. See 173 + * also XR_ML_marker_understanding (This is NOT what the xdev_space code does now, this is only an example what 174 + * other extensions do. xdev_space solves this with the xdev list generation_id): "Assuming the same set of 175 + * markers are in view across several snapshots, the runtime should return the same set of atoms. An application 176 + * can use the list of atoms as a simple test for if a particular marker has gone in or out of view." 177 + */ 178 + 179 + // The value of the assigned XrXDevIdMNDX atom. 180 + // Just to make them not start at 0 or 1. 181 + uint64_t id_gen = 42; 182 + 183 + for (uint32_t i = 0; i < count; i++) { 184 + struct xrt_device *xdev = xsysd->xdevs[i]; 185 + enum xrt_input_name name = find_suitable_pose_name(xdev); 186 + 187 + xdl->ids[i] = id_gen++; 188 + xdl->xdevs[i] = xdev; 189 + xdl->names[i] = name; 190 + } 191 + 192 + xdl->device_count = count; 193 + xdl->sess = sess; 194 + 195 + //! @todo Always the first generation, Monado doesn't have hotplug (yet). 196 + xdl->generation_number = 1; 197 + 198 + *out_xdl = xdl; 199 + 200 + return XR_SUCCESS; 201 + } 202 + 203 + XrResult 204 + oxr_xdev_list_get_properties(struct oxr_logger *log, 205 + struct oxr_xdev_list *xdl, 206 + uint32_t index, 207 + XrXDevPropertiesMNDX *properties) 208 + { 209 + if (index >= xdl->device_count) { 210 + return oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "index %u > device_count %u", index, xdl->device_count); 211 + } 212 + 213 + struct xrt_device *xdev = xdl->xdevs[index]; 214 + bool can_create_space = xdl->names[index] != 0; 215 + 216 + snprintf(properties->name, ARRAY_SIZE(properties->name), "%s", xdev->str); 217 + snprintf(properties->serial, ARRAY_SIZE(properties->serial), "%s", xdev->serial); 218 + properties->canCreateSpace = can_create_space; 219 + 220 + return XR_SUCCESS; 221 + } 222 + 223 + XrResult 224 + oxr_xdev_list_space_create(struct oxr_logger *log, 225 + struct oxr_xdev_list *xdl, 226 + const XrCreateXDevSpaceInfoMNDX *createInfo, 227 + uint32_t index, 228 + struct oxr_space **out_space) 229 + { 230 + if (index >= xdl->device_count) { 231 + return oxr_error(log, XR_ERROR_RUNTIME_FAILURE, 232 + "(createInfo->id == %" PRIu64 ") index %u > device_count %u", createInfo->id, index, 233 + xdl->device_count); 234 + } 235 + if (xdl->names[index] == 0) { 236 + return oxr_error(log, XR_ERROR_RUNTIME_FAILURE, 237 + "(createInfo->id == %" PRIu64 ") have no pose to create a space for", createInfo->id); 238 + } 239 + 240 + const struct xrt_pose *pose = (const struct xrt_pose *)&createInfo->offset; 241 + struct xrt_device *xdev = xdl->xdevs[index]; 242 + enum xrt_input_name name = xdl->names[index]; 243 + 244 + return oxr_space_xdev_pose_create(log, xdl->sess, xdev, name, pose, out_space); 245 + } 246 + 247 + #endif // OXR_HAVE_MNDX_xdev_space