The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

u/space_overseer: Use broadcast event sink for reference space changes

Generates xrt_session_event_reference_space_change_pending events.

+35 -4
+1 -1
src/xrt/auxiliary/util/u_builders.c
··· 173 173 * Space overseer. 174 174 */ 175 175 176 - struct u_space_overseer *uso = u_space_overseer_create(); 176 + struct u_space_overseer *uso = u_space_overseer_create(broadcast); 177 177 178 178 struct xrt_pose T_stage_local = XRT_POSE_IDENTITY; 179 179 T_stage_local.position.y = 1.6;
+30 -1
src/xrt/auxiliary/util/u_space_overseer.c
··· 10 10 11 11 #include "xrt/xrt_space.h" 12 12 #include "xrt/xrt_device.h" 13 + #include "xrt/xrt_session.h" 13 14 #include "xrt/xrt_tracking.h" 14 15 15 16 #include "os/os_time.h" ··· 89 90 90 91 //! Tracks usage of reference spaces. 91 92 struct xrt_reference ref_space_use[XRT_SPACE_REFERENCE_TYPE_COUNT]; 93 + 94 + //! Event sink to broadcast events to all sessions. 95 + struct xrt_session_event_sink *broadcast; 92 96 93 97 /*! 94 98 * Can we do a recenter of the local and local_floor spaces, protected ··· 544 548 recenter_local_spaces(struct xrt_space_overseer *xso) 545 549 { 546 550 struct u_space_overseer *uso = u_space_overseer(xso); 551 + xrt_result_t xret; 547 552 548 553 // Take the full lock from the start. 549 554 pthread_rwlock_wrlock(&uso->lock); ··· 617 622 update_offset_write_locked(ulocal, &local_offset); 618 623 update_offset_write_locked(ulocal_floor, &local_floor_offset); 619 624 625 + // Push the events. 626 + union xrt_session_event xse = XRT_STRUCT_INIT; 627 + 628 + // Basics 629 + xse.ref_change.event_type = XRT_SESSION_EVENT_REFERENCE_SPACE_CHANGE_PENDING; 630 + xse.ref_change.pose_valid = false; 631 + xse.ref_change.pose_in_previous_space = (struct xrt_pose)XRT_POSE_IDENTITY; 632 + xse.ref_change.timestamp_ns = os_monotonic_get_ns(); 633 + 634 + // Event for local space. 635 + xse.ref_change.ref_type = XRT_SPACE_REFERENCE_TYPE_LOCAL; 636 + xret = xrt_session_event_sink_push(uso->broadcast, &xse); 637 + if (xret != XRT_SUCCESS) { 638 + U_LOG_E("Failed to push event for LOCAL!"); 639 + } 640 + 641 + // Event for local floor space. 642 + xse.ref_change.ref_type = XRT_SPACE_REFERENCE_TYPE_LOCAL_FLOOR; 643 + xret = xrt_session_event_sink_push(uso->broadcast, &xse); 644 + if (xret != XRT_SUCCESS) { 645 + U_LOG_E("Failed to push event LOCAL_FLOOR!"); 646 + } 647 + 620 648 pthread_rwlock_unlock(&uso->lock); 621 649 622 650 return XRT_SUCCESS; ··· 656 684 */ 657 685 658 686 struct u_space_overseer * 659 - u_space_overseer_create(void) 687 + u_space_overseer_create(struct xrt_session_event_sink *broadcast) 660 688 { 661 689 struct u_space_overseer *uso = U_TYPED_CALLOC(struct u_space_overseer); 662 690 uso->base.create_offset_space = create_offset_space; ··· 667 695 uso->base.ref_space_dec = ref_space_dec; 668 696 uso->base.recenter_local_spaces = recenter_local_spaces; 669 697 uso->base.destroy = destroy; 698 + uso->broadcast = broadcast; 670 699 671 700 XRT_MAYBE_UNUSED int ret = 0; 672 701
+3 -1
src/xrt/auxiliary/util/u_space_overseer.h
··· 17 17 18 18 19 19 struct u_space_overseer; 20 + struct xrt_session_event_sink; 20 21 21 22 22 23 /* ··· 28 29 /*! 29 30 * Create a default implementation of a space overseer. 30 31 * 32 + * @param[in] broadcast Event sink that broadcasts events to all sessions. 31 33 * @ingroup aux_util 32 34 */ 33 35 struct u_space_overseer * 34 - u_space_overseer_create(void); 36 + u_space_overseer_create(struct xrt_session_event_sink *broadcast); 35 37 36 38 /*! 37 39 * Sets up the space overseer and all semantic spaces in a way that works with
+1 -1
src/xrt/drivers/remote/r_hub.c
··· 477 477 * Space overseer. 478 478 */ 479 479 480 - struct u_space_overseer *uso = u_space_overseer_create(); 480 + struct u_space_overseer *uso = u_space_overseer_create(broadcast); 481 481 struct xrt_space_overseer *xso = (struct xrt_space_overseer *)uso; 482 482 assert(uso != NULL); 483 483