diff options
author | Peter Kim <pk15950@gmail.com> | 2022-06-17 11:25:48 +0300 |
---|---|---|
committer | Peter Kim <pk15950@gmail.com> | 2022-06-17 11:25:48 +0300 |
commit | 10981bc8c092dda48ed5228cc19108513035abf0 (patch) | |
tree | edf643f5ad5d9b36af9e163e68981e42ae3fbbf0 /intern | |
parent | 18960c08fde76dcd839e323d60b5775101229937 (diff) |
Fix T98944: Uninitialized XRFrameState can prevent VR/OpenXR viewing
This provides a workaround for the VR session stopping due to an error
in locating controller poses. The problem was that for the actions sync
on the first frame, the session's XrFrameState/predicted display time
had not been initialized yet, which led to an error in xrLocateSpace()
(the error was only observed for some OpenXR runtimes since the first
frame pose state would be inactive for other runtimes, skipping the
call to xrLocateSpace()).
The timing of action updates relative to frame state updates could be
reworked in the future, but for now simply check for a valid display
time to avoid an error on the first frame.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/ghost/intern/GHOST_XrAction.cpp | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/intern/ghost/intern/GHOST_XrAction.cpp b/intern/ghost/intern/GHOST_XrAction.cpp index 587b1124848..0e725bf4075 100644 --- a/intern/ghost/intern/GHOST_XrAction.cpp +++ b/intern/ghost/intern/GHOST_XrAction.cpp @@ -332,23 +332,26 @@ void GHOST_XrAction::updateState(XrSession session, break; } case GHOST_kXrActionTypePoseInput: { - XrActionStatePose state{XR_TYPE_ACTION_STATE_POSE}; - CHECK_XR( - xrGetActionStatePose(session, &state_info, &state), - (std::string("Failed to get state for pose action \"") + action_name + "\".").data()); - if (state.isActive) { - XrSpace pose_space = ((subaction != nullptr) && (subaction->space != nullptr)) ? - subaction->space->getSpace() : - XR_NULL_HANDLE; - if (pose_space != XR_NULL_HANDLE) { - XrSpaceLocation space_location{XR_TYPE_SPACE_LOCATION}; - CHECK_XR( - xrLocateSpace( - pose_space, reference_space, predicted_display_time, &space_location), - (std::string("Failed to query pose space for action \"") + action_name + "\".") - .data()); - copy_openxr_pose_to_ghost_pose(space_location.pose, - ((GHOST_XrPose *)m_states)[subaction_idx]); + /* Check for valid display time to avoid an error in #xrLocateSpace(). */ + if (predicted_display_time > 0) { + XrActionStatePose state{XR_TYPE_ACTION_STATE_POSE}; + CHECK_XR(xrGetActionStatePose(session, &state_info, &state), + (std::string("Failed to get state for pose action \"") + action_name + "\".") + .data()); + if (state.isActive) { + XrSpace pose_space = ((subaction != nullptr) && (subaction->space != nullptr)) ? + subaction->space->getSpace() : + XR_NULL_HANDLE; + if (pose_space != XR_NULL_HANDLE) { + XrSpaceLocation space_location{XR_TYPE_SPACE_LOCATION}; + CHECK_XR( + xrLocateSpace( + pose_space, reference_space, predicted_display_time, &space_location), + (std::string("Failed to query pose space for action \"") + action_name + "\".") + .data()); + copy_openxr_pose_to_ghost_pose(space_location.pose, + ((GHOST_XrPose *)m_states)[subaction_idx]); + } } } break; |