The open source OpenXR runtime
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}