The open source OpenXR runtime

d/vive: Add Vive Pro 2 support

authored by

Pedro Santos and committed by
Jakob Bornecrantz
2a3ac52e 9b0815bc

+106 -2
+22 -2
src/xrt/drivers/vive/vive_device.c
··· 397 397 angular_velocity.y = -angular_velocity.y; 398 398 angular_velocity.z = -angular_velocity.z; 399 399 break; 400 - case VIVE_VARIANT_PRO: 400 + case VIVE_VARIANT_PRO: { 401 401 // flip all except y axis 402 402 acceleration.x = -acceleration.x; 403 403 acceleration.y = +acceleration.y; ··· 407 407 angular_velocity.y = +angular_velocity.y; 408 408 angular_velocity.z = -angular_velocity.z; 409 409 break; 410 + } 411 + case VIVE_VARIANT_PRO2: { 412 + acceleration.x = -acceleration.x; 413 + acceleration.y = acceleration.y; 414 + acceleration.z = -acceleration.z; 415 + 416 + angular_velocity.x = -angular_velocity.x; 417 + angular_velocity.y = angular_velocity.y; 418 + angular_velocity.z = -angular_velocity.z; 419 + } break; 420 + 410 421 case VIVE_VARIANT_INDEX: { 411 422 // Flip all axis and re-order. 412 423 struct xrt_vec3 acceleration_fixed; ··· 891 902 XRT_TRACE_MARKER(); 892 903 893 904 struct vive_device *d = vive_device(xdev); 894 - return u_compute_distortion_vive(&d->config.distortion.values[view], u, v, result); 905 + bool status = u_compute_distortion_vive(&d->config.distortion.values[view], u, v, result); 906 + 907 + if (d->config.variant == VIVE_VARIANT_PRO2) { 908 + // Flip Y coordinates 909 + result->r.y = 1.0f - result->r.y; 910 + result->g.y = 1.0f - result->g.y; 911 + result->b.y = 1.0f - result->b.y; 912 + } 913 + return status; 895 914 } 896 915 897 916 void ··· 1108 1127 switch (d->config.variant) { 1109 1128 case VIVE_VARIANT_VIVE: snprintf(d->base.str, XRT_DEVICE_NAME_LEN, "HTC Vive (vive)"); break; 1110 1129 case VIVE_VARIANT_PRO: snprintf(d->base.str, XRT_DEVICE_NAME_LEN, "HTC Vive Pro (vive)"); break; 1130 + case VIVE_VARIANT_PRO2: snprintf(d->base.str, XRT_DEVICE_NAME_LEN, "HTC Vive Pro 2 (vive)"); break; 1111 1131 case VIVE_VARIANT_INDEX: snprintf(d->base.str, XRT_DEVICE_NAME_LEN, "Valve Index (vive)"); break; 1112 1132 case VIVE_UNKNOWN: snprintf(d->base.str, XRT_DEVICE_NAME_LEN, "Unknown HMD (vive)"); break; 1113 1133 }
+83
src/xrt/drivers/vive/vive_prober.c
··· 25 25 26 26 static const char VIVE_PRODUCT_STRING[] = "HTC Vive"; 27 27 static const char VIVE_PRO_PRODUCT_STRING[] = "VIVE Pro"; 28 + static const char VIVE_PRO2_PRODUCT_STRING[] = "VIVE Pro 2"; 28 29 static const char VALVE_INDEX_PRODUCT_STRING[] = "Index HMD"; 29 30 static const char VALVE_INDEX_MANUFACTURER_STRING[] = "Valve"; 30 31 static const char VIVE_MANUFACTURER_STRING[] = "HTC"; ··· 213 214 } 214 215 215 216 static void 217 + init_vive_pro2(struct xrt_prober *xp, 218 + struct xrt_prober_device *dev, 219 + struct xrt_prober_device **devices, 220 + size_t device_count, 221 + enum u_logging_level log_level, 222 + struct vive_tracking_status tstatus, 223 + struct vive_source *vs, 224 + struct vive_device **out_vdev) 225 + { 226 + XRT_TRACE_MARKER(); 227 + 228 + log_vive_device(log_level, xp, dev); 229 + 230 + if (!u_prober_match_string(xp, dev, XRT_PROBER_STRING_MANUFACTURER, VIVE_MANUFACTURER_STRING) || 231 + !u_prober_match_string(xp, dev, XRT_PROBER_STRING_PRODUCT, VIVE_PRO2_PRODUCT_STRING)) { 232 + U_LOG_D("Vive Pro 2 manufacturer string did not match."); 233 + return; 234 + } 235 + 236 + struct os_hid_device *sensors_dev = NULL; 237 + struct os_hid_device *watchman_dev = NULL; 238 + 239 + for (uint32_t i = 0; i < device_count; i++) { 240 + struct xrt_prober_device *d = devices[i]; 241 + 242 + if (d->vendor_id != VALVE_VID && d->product_id != VIVE_PRO_LHR_PID) 243 + continue; 244 + 245 + log_vive_device(log_level, xp, d); 246 + 247 + int result = xrt_prober_open_hid_interface(xp, d, 0, &sensors_dev); 248 + if (result != 0) { 249 + U_LOG_E("Could not open Vive Pro 2 sensors device."); 250 + return; 251 + } 252 + 253 + result = xrt_prober_open_hid_interface(xp, d, 1, &watchman_dev); 254 + if (result != 0) { 255 + U_LOG_E("Could not open headset watchman device."); 256 + return; 257 + } 258 + 259 + break; 260 + } 261 + 262 + if (sensors_dev == NULL) { 263 + U_LOG_E("Could not find Vive Pro 2 sensors device."); 264 + return; 265 + } 266 + 267 + if (watchman_dev == NULL) { 268 + U_LOG_E("Could not find headset watchman device."); 269 + return; 270 + } 271 + 272 + struct os_hid_device *mainboard_dev = NULL; 273 + 274 + int result = xrt_prober_open_hid_interface(xp, dev, 0, &mainboard_dev); 275 + if (result != 0) { 276 + U_LOG_E("Could not open Vive mainboard device."); 277 + free(sensors_dev); 278 + return; 279 + } 280 + struct vive_device *d = 281 + vive_device_create(mainboard_dev, sensors_dev, watchman_dev, VIVE_VARIANT_PRO, tstatus, vs); 282 + if (d == NULL) { 283 + free(sensors_dev); 284 + free(mainboard_dev); 285 + return; 286 + } 287 + 288 + *out_vdev = d; 289 + 290 + return; 291 + } 292 + 293 + 294 + static void 216 295 init_valve_index(struct xrt_prober *xp, 217 296 struct xrt_prober_device *dev, 218 297 struct xrt_prober_device **devices, ··· 298 377 } 299 378 case VIVE_PRO_MAINBOARD_PID: { 300 379 init_vive_pro(xp, dev, devices, device_count, log_level, tstatus, vs, &vdev); 380 + break; 381 + } 382 + case VIVE_PRO2_MAINBOARD_PID: { 383 + init_vive_pro2(xp, dev, devices, device_count, log_level, tstatus, vs, &vdev); 301 384 break; 302 385 } 303 386 case VIVE_PRO_LHR_PID: {
+1
src/xrt/targets/common/target_builder_lighthouse.c
··· 633 633 switch (device->product_id) { 634 634 case VIVE_PID: 635 635 case VIVE_PRO_MAINBOARD_PID: 636 + case VIVE_PRO2_MAINBOARD_PID: 636 637 case VIVE_PRO_LHR_PID: { 637 638 struct vive_source *vs = vive_source_create(&usysd->xfctx); 638 639 int num_devices =