The open source OpenXR runtime
at main 106 lines 3.1 kB view raw
1// Copyright 2023-2024, Collabora, Ltd. 2// SPDX-License-Identifier: BSL-1.0 3/*! 4 * @file 5 * @brief Visual-Inertial Tracking consumer helper. 6 * @author Jakob Bornecrantz <jakob@collabora.com> 7 * @author Simon Zeni <simon.zeni@collabora.com> 8 * @ingroup aux_tracking 9 */ 10 11#include "xrt/xrt_config_os.h" 12#include "tracking/t_vit_loader.h" 13#include "util/u_logging.h" 14#include "vit/vit_interface.h" 15 16#include <stdlib.h> 17 18#if defined(XRT_OS_LINUX) || defined(XRT_OS_ANDROID) 19#include <dlfcn.h> 20#endif 21 22static inline bool 23vit_get_proc(void *handle, const char *name, void *proc_ptr) 24{ 25#if defined(XRT_OS_LINUX) || defined(XRT_OS_ANDROID) 26 void *proc = dlsym(handle, name); 27 char *err = dlerror(); 28 if (err != NULL) { 29 U_LOG_E("Failed to load symbol %s", err); 30 return false; 31 } 32 33 *(void **)proc_ptr = proc; 34 return true; 35#else 36#error "Unknown platform" 37#endif 38} 39 40bool 41t_vit_bundle_load(struct t_vit_bundle *vit, const char *path) 42{ 43#if defined(XRT_OS_LINUX) || defined(XRT_OS_ANDROID) 44 vit->handle = dlopen(path, RTLD_LAZY); 45 if (vit->handle == NULL) { 46 U_LOG_E("Failed to open VIT library: %s", dlerror()); 47 return false; 48 } 49#else 50#error "Unknown platform" 51#endif 52 53#define GET_PROC(SYM) \ 54 do { \ 55 if (!vit_get_proc(vit->handle, "vit_" #SYM, &vit->SYM)) { \ 56 return false; \ 57 } \ 58 } while (0) 59 60 // Get the version first. 61 GET_PROC(api_get_version); 62 vit->api_get_version(&vit->version.major, &vit->version.minor, &vit->version.patch); 63 64 // Check major version. 65 if (vit->version.major != VIT_HEADER_VERSION_MAJOR) { 66 U_LOG_E("Incompatible versions: expecting %u.%u.%u but got %u.%u.%u", // 67 VIT_HEADER_VERSION_MAJOR, VIT_HEADER_VERSION_MINOR, VIT_HEADER_VERSION_PATCH, // 68 vit->version.major, vit->version.minor, vit->version.patch); 69 dlclose(vit->handle); 70 return false; 71 } 72 73 GET_PROC(tracker_create); 74 GET_PROC(tracker_destroy); 75 GET_PROC(tracker_has_image_format); 76 GET_PROC(tracker_get_supported_extensions); 77 GET_PROC(tracker_get_enabled_extensions); 78 GET_PROC(tracker_enable_extension); 79 GET_PROC(tracker_start); 80 GET_PROC(tracker_stop); 81 GET_PROC(tracker_reset); 82 GET_PROC(tracker_is_running); 83 GET_PROC(tracker_push_imu_sample); 84 GET_PROC(tracker_push_img_sample); 85 GET_PROC(tracker_add_imu_calibration); 86 GET_PROC(tracker_add_camera_calibration); 87 GET_PROC(tracker_pop_pose); 88 GET_PROC(tracker_get_timing_titles); 89 GET_PROC(pose_destroy); 90 GET_PROC(pose_get_data); 91 GET_PROC(pose_get_timing); 92 GET_PROC(pose_get_features); 93#undef GET_PROC 94 95 return true; 96} 97 98void 99t_vit_bundle_unload(struct t_vit_bundle *vit) 100{ 101#if defined(XRT_OS_LINUX) || defined(XRT_OS_ANDROID) 102 dlclose(vit->handle); 103#else 104#error "Unknown platform" 105#endif 106}