The open source OpenXR runtime

ipc: relocate xtracks to ipc_client_system_devices

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

authored by

Andrei Aristarkhov and committed by
Jakob Bornecrantz
b8b4cfad 2eefb0a3

+68 -73
+21 -1
src/xrt/ipc/client/ipc_client.h
··· 1 1 // Copyright 2020-2023, Collabora, Ltd. 2 + // Copyright 2025, NVIDIA CORPORATION. 2 3 // SPDX-License-Identifier: BSL-1.0 3 4 /*! 4 5 * @file ··· 16 17 17 18 #include "util/u_threading.h" 18 19 #include "util/u_logging.h" 20 + #include "util/u_system_helpers.h" 19 21 20 22 #include "shared/ipc_utils.h" 21 23 #include "shared/ipc_protocol.h" ··· 69 71 #endif // XRT_OS_ANDROID 70 72 }; 71 73 74 + /*! 75 + * Client side implementation of the system devices struct. 76 + */ 77 + struct ipc_client_system_devices 78 + { 79 + //! @public Base 80 + struct u_system_devices base; 81 + 82 + //! Connection to service. 83 + struct ipc_connection *ipc_c; 84 + 85 + struct xrt_tracking_origin *xtracks[XRT_SYSTEM_MAX_DEVICES]; 86 + 87 + size_t xtrack_count; 88 + 89 + struct xrt_reference feature_use[XRT_DEVICE_FEATURE_MAX_ENUM]; 90 + }; 91 + 72 92 73 93 /* 74 94 * ··· 125 145 struct xrt_space_overseer * 126 146 ipc_client_space_overseer_create(struct ipc_connection *ipc_c); 127 147 128 - struct xrt_system_devices * 148 + struct ipc_client_system_devices * 129 149 ipc_client_system_devices_create(struct ipc_connection *ipc_c); 130 150 131 151 struct xrt_session *
+36 -58
src/xrt/ipc/client/ipc_client_instance.c
··· 1 1 // Copyright 2020-2024, Collabora, Ltd. 2 + // Copyright 2025, NVIDIA CORPORATION. 2 3 // SPDX-License-Identifier: BSL-1.0 3 4 /*! 4 5 * @file ··· 78 79 79 80 struct ipc_connection ipc_c; 80 81 81 - struct xrt_tracking_origin *xtracks[XRT_SYSTEM_MAX_DEVICES]; 82 - size_t xtrack_count; 83 - 84 - struct xrt_device *xdevs[XRT_SYSTEM_MAX_DEVICES]; 85 - size_t xdev_count; 86 - 87 82 #ifdef XRT_OS_ANDROID 88 83 struct android_instance_base android; 89 84 #endif ··· 151 146 assert(*out_xsysd == NULL); 152 147 assert(out_xsysc == NULL || *out_xsysc == NULL); 153 148 154 - struct xrt_system_devices *xsysd = NULL; 155 149 struct xrt_system_compositor *xsysc = NULL; 156 150 157 151 // Allocate a helper xrt_system_devices struct. 158 - xsysd = ipc_client_system_devices_create(&ii->ipc_c); 152 + struct ipc_client_system_devices *icsd = ipc_client_system_devices_create(&ii->ipc_c); 153 + struct xrt_system_devices *xsysd = &icsd->base.base; 154 + 155 + uint32_t count = 0; 156 + struct xrt_tracking_origin *xtrack = NULL; 157 + struct ipc_shared_memory *ism = ii->ipc_c.ism; 158 + 159 + // Query the server for how many tracking origins it has. 160 + count = 0; 161 + for (uint32_t i = 0; i < ism->itrack_count; i++) { 162 + xtrack = U_TYPED_CALLOC(struct xrt_tracking_origin); 163 + 164 + memcpy(xtrack->name, ism->itracks[i].name, sizeof(xtrack->name)); 165 + 166 + xtrack->type = ism->itracks[i].type; 167 + xtrack->initial_offset = ism->itracks[i].offset; 168 + icsd->xtracks[count++] = xtrack; 159 169 160 - // Take the devices from this instance. 161 - for (uint32_t i = 0; i < ii->xdev_count; i++) { 162 - xsysd->xdevs[i] = ii->xdevs[i]; 163 - ii->xdevs[i] = NULL; 170 + u_var_add_root(xtrack, "Tracking origin", true); 171 + u_var_add_ro_text(xtrack, xtrack->name, "name"); 172 + u_var_add_pose(xtrack, &xtrack->initial_offset, "offset"); 164 173 } 165 - xsysd->xdev_count = ii->xdev_count; 166 - ii->xdev_count = 0; 174 + icsd->xtrack_count = count; 175 + 176 + // Query the server for how many devices it has. 177 + count = 0; 178 + for (uint32_t i = 0; i < ism->isdev_count; i++) { 179 + struct ipc_shared_device *isdev = &ism->isdevs[i]; 180 + xtrack = icsd->xtracks[isdev->tracking_origin_index]; 181 + 182 + if (isdev->device_type == XRT_DEVICE_TYPE_HMD) { 183 + xsysd->xdevs[count++] = ipc_client_hmd_create(&ii->ipc_c, xtrack, i); 184 + } else { 185 + xsysd->xdevs[count++] = ipc_client_device_create(&ii->ipc_c, xtrack, i); 186 + } 187 + } 188 + xsysd->xdev_count = count; 167 189 168 190 #define SET_ROLE(ROLE) \ 169 191 do { \ ··· 232 254 // service considers us to be connected until fd is closed 233 255 ipc_client_connection_fini(&ii->ipc_c); 234 256 235 - for (size_t i = 0; i < ii->xtrack_count; i++) { 236 - u_var_remove_root(ii->xtracks[i]); 237 - free(ii->xtracks[i]); 238 - ii->xtracks[i] = NULL; 239 - } 240 - ii->xtrack_count = 0; 241 - 242 257 #ifdef XRT_OS_ANDROID 243 258 android_instance_base_cleanup(&(ii->android), xinst); 244 259 ipc_client_android_destroy(&(ii->ipc_c.ica)); ··· 294 309 free(ii); 295 310 return xret; 296 311 } 297 - 298 - uint32_t count = 0; 299 - struct xrt_tracking_origin *xtrack = NULL; 300 - struct ipc_shared_memory *ism = ii->ipc_c.ism; 301 - 302 - // Query the server for how many tracking origins it has. 303 - count = 0; 304 - for (uint32_t i = 0; i < ism->itrack_count; i++) { 305 - xtrack = U_TYPED_CALLOC(struct xrt_tracking_origin); 306 - 307 - memcpy(xtrack->name, ism->itracks[i].name, sizeof(xtrack->name)); 308 - 309 - xtrack->type = ism->itracks[i].type; 310 - xtrack->initial_offset = ism->itracks[i].offset; 311 - ii->xtracks[count++] = xtrack; 312 - 313 - u_var_add_root(xtrack, "Tracking origin", true); 314 - u_var_add_ro_text(xtrack, xtrack->name, "name"); 315 - u_var_add_pose(xtrack, &xtrack->initial_offset, "offset"); 316 - } 317 - 318 - ii->xtrack_count = count; 319 - 320 - // Query the server for how many devices it has. 321 - count = 0; 322 - for (uint32_t i = 0; i < ism->isdev_count; i++) { 323 - struct ipc_shared_device *isdev = &ism->isdevs[i]; 324 - xtrack = ii->xtracks[isdev->tracking_origin_index]; 325 - 326 - if (isdev->device_type == XRT_DEVICE_TYPE_HMD) { 327 - ii->xdevs[count++] = ipc_client_hmd_create(&ii->ipc_c, xtrack, i); 328 - } else { 329 - ii->xdevs[count++] = ipc_client_device_create(&ii->ipc_c, xtrack, i); 330 - } 331 - } 332 - 333 - ii->xdev_count = count; 334 312 335 313 ii->base.startup_timestamp = ii->ipc_c.ism->startup_timestamp; 336 314
+11 -14
src/xrt/ipc/client/ipc_client_system_devices.c
··· 1 1 // Copyright 2023, Collabora, Ltd. 2 + // Copyright 2025, NVIDIA CORPORATION. 2 3 // SPDX-License-Identifier: BSL-1.0 3 4 /*! 4 5 * @file ··· 12 13 #include "ipc_client_generated.h" 13 14 14 15 #include "util/u_system_helpers.h" 15 - 16 - 17 - struct ipc_client_system_devices 18 - { 19 - //! @public Base 20 - struct u_system_devices base; 21 - 22 - //! Connection to service. 23 - struct ipc_connection *ipc_c; 24 - 25 - struct xrt_reference feature_use[XRT_DEVICE_FEATURE_MAX_ENUM]; 26 - }; 16 + #include "util/u_var.h" 27 17 28 18 29 19 /* ··· 93 83 { 94 84 struct ipc_client_system_devices *usysd = ipc_system_devices(xsysd); 95 85 86 + for (size_t i = 0; i < usysd->xtrack_count; i++) { 87 + u_var_remove_root(usysd->xtracks[i]); 88 + free(usysd->xtracks[i]); 89 + usysd->xtracks[i] = NULL; 90 + } 91 + usysd->xtrack_count = 0; 92 + 96 93 u_system_devices_close(&usysd->base.base); 97 94 98 95 free(usysd); ··· 105 102 * 106 103 */ 107 104 108 - struct xrt_system_devices * 105 + struct ipc_client_system_devices * 109 106 ipc_client_system_devices_create(struct ipc_connection *ipc_c) 110 107 { 111 108 struct ipc_client_system_devices *icsd = U_TYPED_CALLOC(struct ipc_client_system_devices); ··· 115 112 icsd->base.base.feature_dec = ipc_client_system_devices_feature_dec; 116 113 icsd->ipc_c = ipc_c; 117 114 118 - return &icsd->base.base; 115 + return icsd; 119 116 }