The open source OpenXR runtime

oxr/st: add oxr/state tracker stubs for XR_ANDROID_face_tracking

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2605>

+4
src/xrt/state_trackers/oxr/CMakeLists.txt
··· 106 106 target_sources(st_oxr PRIVATE oxr_api_body_tracking.c oxr_body_tracking.c) 107 107 endif() 108 108 109 + if(XRT_FEATURE_OPENXR_FACE_TRACKING_ANDROID) 110 + target_sources(st_oxr PRIVATE oxr_api_face_tracking_android.c oxr_face_tracking_android.c) 111 + endif() 112 + 109 113 if(XRT_FEATURE_OPENXR_FACIAL_TRACKING_HTC) 110 114 target_sources(st_oxr PRIVATE oxr_api_face_tracking_htc.c oxr_face_tracking_htc.c) 111 115 endif()
+82
src/xrt/state_trackers/oxr/oxr_api_face_tracking_android.c
··· 1 + // Copyright 2025, Collabora, Ltd. 2 + // SPDX-License-Identifier: BSL-1.0 3 + /*! 4 + * @file 5 + * @brief Android face tracking related API entrypoint functions. 6 + * @author Korcan Hussein <korcan.hussein@collabora.com> 7 + * @ingroup oxr_api 8 + */ 9 + 10 + #include <stdio.h> 11 + #include <stdlib.h> 12 + #include <string.h> 13 + 14 + #include "util/u_trace_marker.h" 15 + 16 + #include "oxr_objects.h" 17 + #include "oxr_logger.h" 18 + 19 + #include "oxr_api_funcs.h" 20 + #include "oxr_api_verify.h" 21 + #include "oxr_handle.h" 22 + 23 + XRAPI_ATTR XrResult XRAPI_CALL 24 + oxr_xrCreateFaceTrackerANDROID(XrSession session, 25 + const XrFaceTrackerCreateInfoANDROID *createInfo, 26 + XrFaceTrackerANDROID *faceTracker) 27 + { 28 + OXR_TRACE_MARKER(); 29 + struct oxr_logger log; 30 + struct oxr_session *sess = NULL; 31 + OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess, "xrCreateFaceTrackerANDROID"); 32 + OXR_VERIFY_SESSION_NOT_LOST(&log, sess); 33 + OXR_VERIFY_EXTENSION(&log, sess->sys->inst, ANDROID_face_tracking); 34 + OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, createInfo, XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID); 35 + return oxr_face_tracker_android_create(&log, sess, createInfo, faceTracker); 36 + } 37 + 38 + XRAPI_ATTR XrResult XRAPI_CALL 39 + oxr_xrDestroyFaceTrackerANDROID(XrFaceTrackerANDROID facialTracker) 40 + { 41 + OXR_TRACE_MARKER(); 42 + struct oxr_logger log; 43 + struct oxr_face_tracker_android *face_tracker_android = NULL; 44 + OXR_VERIFY_FACE_TRACKER_ANDROID_AND_INIT_LOG(&log, facialTracker, face_tracker_android, 45 + "xrDestroyFaceTrackerANDROID"); 46 + return oxr_handle_destroy(&log, &face_tracker_android->handle); 47 + } 48 + 49 + XRAPI_ATTR XrResult XRAPI_CALL 50 + oxr_xrGetFaceStateANDROID(XrFaceTrackerANDROID faceTracker, 51 + const XrFaceStateGetInfoANDROID *getInfo, 52 + XrFaceStateANDROID *faceStateOutput) 53 + { 54 + OXR_TRACE_MARKER(); 55 + struct oxr_logger log; 56 + struct oxr_face_tracker_android *face_tracker_android = NULL; 57 + OXR_VERIFY_FACE_TRACKER_ANDROID_AND_INIT_LOG(&log, faceTracker, face_tracker_android, "xrGetFaceStateANDROID"); 58 + OXR_VERIFY_SESSION_NOT_LOST(&log, face_tracker_android->sess); 59 + OXR_VERIFY_ARG_NOT_NULL(&log, face_tracker_android->xdev); 60 + OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, getInfo, XR_TYPE_FACE_STATE_GET_INFO_ANDROID); 61 + OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, faceStateOutput, XR_TYPE_FACE_STATE_ANDROID); 62 + OXR_VERIFY_ARG_TIME_NOT_ZERO(&log, getInfo->time); 63 + OXR_VERIFY_TWO_CALL_ARRAY(&log, faceStateOutput->parametersCapacityInput, 64 + (&faceStateOutput->parametersCountOutput), faceStateOutput->parameters); 65 + OXR_VERIFY_TWO_CALL_ARRAY(&log, faceStateOutput->regionConfidencesCapacityInput, 66 + (&faceStateOutput->regionConfidencesCountOutput), faceStateOutput->regionConfidences); 67 + return oxr_get_face_state_android(&log, face_tracker_android, getInfo, faceStateOutput); 68 + } 69 + 70 + XRAPI_ATTR XrResult XRAPI_CALL 71 + oxr_xrGetFaceCalibrationStateANDROID(XrFaceTrackerANDROID faceTracker, XrBool32 *faceIsCalibratedOutput) 72 + { 73 + OXR_TRACE_MARKER(); 74 + struct oxr_logger log; 75 + struct oxr_face_tracker_android *face_tracker_android = NULL; 76 + OXR_VERIFY_FACE_TRACKER_ANDROID_AND_INIT_LOG(&log, faceTracker, face_tracker_android, 77 + "xrGetFaceCalibrationStateANDROID"); 78 + OXR_VERIFY_SESSION_NOT_LOST(&log, face_tracker_android->sess); 79 + OXR_VERIFY_ARG_NOT_NULL(&log, face_tracker_android->xdev); 80 + OXR_VERIFY_ARG_NOT_NULL(&log, faceIsCalibratedOutput); 81 + return oxr_get_face_calibration_state_android(&log, face_tracker_android, faceIsCalibratedOutput); 82 + }
+24
src/xrt/state_trackers/oxr/oxr_api_funcs.h
··· 779 779 oxr_xrCancelFutureEXT(XrInstance instance, const XrFutureCancelInfoEXT *cancelInfo); 780 780 #endif 781 781 782 + /* 783 + * 784 + * oxr_api_face_tracking_android.c 785 + * 786 + */ 787 + 788 + #ifdef OXR_HAVE_ANDROID_face_tracking 789 + XRAPI_ATTR XrResult XRAPI_CALL 790 + oxr_xrCreateFaceTrackerANDROID(XrSession session, 791 + const XrFaceTrackerCreateInfoANDROID *createInfo, 792 + XrFaceTrackerANDROID *faceTracker); 793 + 794 + XRAPI_ATTR XrResult XRAPI_CALL 795 + oxr_xrDestroyFaceTrackerANDROID(XrFaceTrackerANDROID facialTracker); 796 + 797 + XRAPI_ATTR XrResult XRAPI_CALL 798 + oxr_xrGetFaceStateANDROID(XrFaceTrackerANDROID faceTracker, 799 + const XrFaceStateGetInfoANDROID *getInfo, 800 + XrFaceStateANDROID *faceStateOutput); 801 + 802 + XRAPI_ATTR XrResult XRAPI_CALL 803 + oxr_xrGetFaceCalibrationStateANDROID(XrFaceTrackerANDROID faceTracker, XrBool32 *faceIsCalibratedOutput); 804 + #endif 805 + 782 806 /*! 783 807 * @} 784 808 */
+7
src/xrt/state_trackers/oxr/oxr_api_negotiate.c
··· 419 419 ENTRY_IF_EXT(xrCancelFutureEXT, EXT_future); 420 420 #endif // OXR_HAVE_EXT_future 421 421 422 + #ifdef OXR_HAVE_ANDROID_face_tracking 423 + ENTRY_IF_EXT(xrCreateFaceTrackerANDROID, ANDROID_face_tracking); 424 + ENTRY_IF_EXT(xrDestroyFaceTrackerANDROID, ANDROID_face_tracking); 425 + ENTRY_IF_EXT(xrGetFaceCalibrationStateANDROID, ANDROID_face_tracking); 426 + ENTRY_IF_EXT(xrGetFaceStateANDROID, ANDROID_face_tracking); 427 + #endif 428 + 422 429 #ifdef OXR_HAVE_KHR_extended_struct_name_lengths 423 430 ENTRY_IF_EXT(xrStructureTypeToString2KHR, KHR_extended_struct_name_lengths); 424 431 #endif // OXR_HAVE_KHR_extended_struct_name_lengths
+2
src/xrt/state_trackers/oxr/oxr_api_verify.h
··· 97 97 #define OXR_VERIFY_FUTURE_AND_INIT_LOG(log, thing, new_thing, name) \ 98 98 OXR_VERIFY_AND_SET_AND_INIT(log, thing, new_thing, oxr_future_ext, FUTURE, name, new_thing->inst); \ 99 99 OXR_VERIFY_FUTURE_VALID(log, new_thing) 100 + #define OXR_VERIFY_FACE_TRACKER_ANDROID_AND_INIT_LOG(log, thing, new_thing, name) \ 101 + OXR_VERIFY_AND_SET_AND_INIT(log, thing, new_thing, oxr_face_tracker_android, FTRACKER, name, new_thing->sess->sys->inst) 100 102 // clang-format on 101 103 102 104 #define OXR_VERIFY_INSTANCE_NOT_NULL(log, arg, new_arg) OXR_VERIFY_SET(log, arg, new_arg, oxr_instance, INSTANCE);
+51
src/xrt/state_trackers/oxr/oxr_face_tracking_android.c
··· 1 + // Copyright 2025, Collabora, Ltd. 2 + // SPDX-License-Identifier: BSL-1.0 3 + /*! 4 + * @file 5 + * @brief Android face tracking related API entrypoint functions. 6 + * @author Korcan Hussein <korcan.hussein@collabora.com> 7 + * @ingroup oxr_main 8 + */ 9 + 10 + #include <stdio.h> 11 + #include <stdlib.h> 12 + #include <string.h> 13 + 14 + #include "oxr_objects.h" 15 + #include "oxr_logger.h" 16 + #include "oxr_handle.h" 17 + 18 + static XrResult 19 + oxr_face_tracker_android_destroy_cb(struct oxr_logger *log, struct oxr_handle_base *hb) 20 + { 21 + struct oxr_face_tracker_android *face_tracker_android = (struct oxr_face_tracker_android *)hb; 22 + free(face_tracker_android); 23 + return XR_SUCCESS; 24 + } 25 + 26 + XrResult 27 + oxr_face_tracker_android_create(struct oxr_logger *log, 28 + struct oxr_session *sess, 29 + const XrFaceTrackerCreateInfoANDROID *createInfo, 30 + XrFaceTrackerANDROID *faceTracker) 31 + { 32 + return oxr_session_success_result(sess); 33 + } 34 + 35 + XrResult 36 + oxr_get_face_state_android(struct oxr_logger *log, 37 + struct oxr_face_tracker_android *facial_tracker_android, 38 + const XrFaceStateGetInfoANDROID *getInfo, 39 + XrFaceStateANDROID *faceStateOutput) 40 + { 41 + 42 + return oxr_session_success_result(facial_tracker_android->sess); 43 + } 44 + 45 + XrResult 46 + oxr_get_face_calibration_state_android(struct oxr_logger *log, 47 + struct oxr_face_tracker_android *facial_tracker_android, 48 + XrBool32 *faceIsCalibratedOutput) 49 + { 50 + return oxr_session_success_result(facial_tracker_android->sess); 51 + }
+55
src/xrt/state_trackers/oxr/oxr_objects.h
··· 127 127 struct oxr_action_set_ref; 128 128 struct oxr_action_ref; 129 129 struct oxr_hand_tracker; 130 + struct oxr_face_tracker_android; 130 131 struct oxr_facial_tracker_htc; 131 132 struct oxr_face_tracker2_fb; 132 133 struct oxr_body_tracker_fb; ··· 467 468 return XRT_CAST_PTR_TO_OXR_HANDLE(XrFaceTracker2FB, face_tracker2_fb); 468 469 } 469 470 #endif 471 + 472 + #ifdef OXR_HAVE_ANDROID_face_tracking 473 + /*! 474 + * To go back to a OpenXR object. 475 + * 476 + * @relates oxr_facial_tracker_htc 477 + */ 478 + static inline XrFaceTrackerANDROID 479 + oxr_face_tracker_android_to_openxr(struct oxr_face_tracker_android *face_tracker_android) 480 + { 481 + return XRT_CAST_PTR_TO_OXR_HANDLE(XrFaceTrackerANDROID, face_tracker_android); 482 + } 483 + #endif 484 + 470 485 /*! 471 486 * 472 487 * @name oxr_input.c ··· 3093 3108 XrResult 3094 3109 oxr_event_push_XrEventDataUserPresenceChangedEXT(struct oxr_logger *log, struct oxr_session *sess, bool isUserPresent); 3095 3110 #endif // OXR_HAVE_EXT_user_presence 3111 + 3112 + #ifdef OXR_HAVE_ANDROID_face_tracking 3113 + /*! 3114 + * Android specific Facial tracker. 3115 + * 3116 + * Parent type/handle is @ref oxr_instance 3117 + * 3118 + * 3119 + * @obj{XrFaceTrackerANDROID} 3120 + * @extends oxr_handle_base 3121 + */ 3122 + struct oxr_face_tracker_android 3123 + { 3124 + //! Common structure for things referred to by OpenXR handles. 3125 + struct oxr_handle_base handle; 3126 + 3127 + //! Owner of this face tracker. 3128 + struct oxr_session *sess; 3129 + 3130 + //! xrt_device backing this face tracker 3131 + struct xrt_device *xdev; 3132 + }; 3133 + 3134 + XrResult 3135 + oxr_face_tracker_android_create(struct oxr_logger *log, 3136 + struct oxr_session *sess, 3137 + const XrFaceTrackerCreateInfoANDROID *createInfo, 3138 + XrFaceTrackerANDROID *faceTracker); 3139 + 3140 + XrResult 3141 + oxr_get_face_state_android(struct oxr_logger *log, 3142 + struct oxr_face_tracker_android *facial_tracker_android, 3143 + const XrFaceStateGetInfoANDROID *getInfo, 3144 + XrFaceStateANDROID *faceStateOutput); 3145 + 3146 + XrResult 3147 + oxr_get_face_calibration_state_android(struct oxr_logger *log, 3148 + struct oxr_face_tracker_android *facial_tracker_android, 3149 + XrBool32 *faceIsCalibratedOutput); 3150 + #endif // OXR_HAVE_ANDROID_face_tracking 3096 3151 3097 3152 /*! 3098 3153 * @}