The open source OpenXR runtime
0
fork

Configure Feed

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

st/oxr: Handle XR_SESSION_STATE_LOSS_PENDING

authored by

Jarvis Huang and committed by
Jakob Bornecrantz
f9d83c8b 971947f7

+25 -17
+3 -1
src/xrt/state_trackers/oxr/oxr_objects.h
··· 693 693 * Change the state of the session, queues a event. 694 694 */ 695 695 void 696 - oxr_session_change_state(struct oxr_logger *log, struct oxr_session *sess, XrSessionState state); 696 + oxr_session_change_state(struct oxr_logger *log, struct oxr_session *sess, XrSessionState state, XrTime time); 697 697 698 698 XrResult 699 699 oxr_session_begin(struct oxr_logger *log, struct oxr_session *sess, const XrSessionBeginInfo *beginInfo); ··· 1530 1530 /*! initial relation of head in "global" space. 1531 1531 * Used as reference for local space. */ 1532 1532 struct xrt_space_relation local_space_pure_relation; 1533 + 1534 + bool has_lost; 1533 1535 }; 1534 1536 1535 1537 /*!
+21 -15
src/xrt/state_trackers/oxr/oxr_session.c
··· 92 92 } 93 93 94 94 void 95 - oxr_session_change_state(struct oxr_logger *log, struct oxr_session *sess, XrSessionState state) 95 + oxr_session_change_state(struct oxr_logger *log, struct oxr_session *sess, XrSessionState state, XrTime time) 96 96 { 97 - oxr_event_push_XrEventDataSessionStateChanged(log, sess, state, 0); 97 + oxr_event_push_XrEventDataSessionStateChanged(log, sess, state, time); 98 98 sess->state = state; 99 99 } 100 100 ··· 193 193 CALL_CHK(xrt_comp_end_session(xc)); 194 194 } 195 195 196 - oxr_session_change_state(log, sess, XR_SESSION_STATE_IDLE); 196 + oxr_session_change_state(log, sess, XR_SESSION_STATE_IDLE, 0); 197 197 if (sess->exiting) { 198 - oxr_session_change_state(log, sess, XR_SESSION_STATE_EXITING); 198 + oxr_session_change_state(log, sess, XR_SESSION_STATE_EXITING, 0); 199 199 } else { 200 - oxr_session_change_state(log, sess, XR_SESSION_STATE_READY); 200 + oxr_session_change_state(log, sess, XR_SESSION_STATE_READY, 0); 201 201 } 202 202 203 203 sess->has_begun = false; ··· 213 213 } 214 214 215 215 if (sess->state == XR_SESSION_STATE_FOCUSED) { 216 - oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE); 216 + oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE, 0); 217 217 } 218 218 if (sess->state == XR_SESSION_STATE_VISIBLE) { 219 - oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED); 219 + oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED, 0); 220 220 } 221 221 if (!sess->has_ended_once) { 222 - oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED); 222 + oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED, 0); 223 223 // Fake the synchronization. 224 224 sess->has_ended_once = true; 225 225 } 226 226 227 227 //! @todo start fading out the app. 228 - oxr_session_change_state(log, sess, XR_SESSION_STATE_STOPPING); 228 + oxr_session_change_state(log, sess, XR_SESSION_STATE_STOPPING, 0); 229 229 sess->exiting = true; 230 230 return oxr_session_success_result(sess); 231 231 } ··· 256 256 case XRT_COMPOSITOR_EVENT_OVERLAY_CHANGE: 257 257 oxr_event_push_XrEventDataMainSessionVisibilityChangedEXTX(log, sess, xce.overlay.visible); 258 258 break; 259 + case XRT_COMPOSITOR_EVENT_LOSS_PENDING: 260 + oxr_session_change_state( 261 + log, sess, XR_SESSION_STATE_LOSS_PENDING, 262 + time_state_monotonic_to_ts_ns(sess->sys->inst->timekeeping, xce.loss_pending.loss_time_ns)); 263 + break; 264 + case XRT_COMPOSITOR_EVENT_LOST: sess->has_lost = true; break; 259 265 default: U_LOG_W("unhandled event type! %d", xce.type); break; 260 266 } 261 267 } 262 268 263 269 if (sess->state == XR_SESSION_STATE_SYNCHRONIZED && sess->compositor_visible) { 264 - oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE); 270 + oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE, 0); 265 271 } 266 272 267 273 if (sess->state == XR_SESSION_STATE_VISIBLE && sess->compositor_focused) { 268 - oxr_session_change_state(log, sess, XR_SESSION_STATE_FOCUSED); 274 + oxr_session_change_state(log, sess, XR_SESSION_STATE_FOCUSED, 0); 269 275 } 270 276 271 277 if (sess->state == XR_SESSION_STATE_FOCUSED && !sess->compositor_focused) { 272 - oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE); 278 + oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE, 0); 273 279 } 274 280 275 281 if (sess->state == XR_SESSION_STATE_VISIBLE && !sess->compositor_visible) { 276 - oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED); 282 + oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED, 0); 277 283 } 278 284 } 279 285 ··· 891 897 } 892 898 893 899 // Everything is in order, start the state changes. 894 - oxr_session_change_state(log, sess, XR_SESSION_STATE_IDLE); 895 - oxr_session_change_state(log, sess, XR_SESSION_STATE_READY); 900 + oxr_session_change_state(log, sess, XR_SESSION_STATE_IDLE, 0); 901 + oxr_session_change_state(log, sess, XR_SESSION_STATE_READY, 0); 896 902 897 903 *out_session = sess; 898 904
+1 -1
src/xrt/state_trackers/oxr/oxr_session_frame_end.c
··· 1200 1200 do_synchronize_state_change(struct oxr_logger *log, struct oxr_session *sess) 1201 1201 { 1202 1202 if (!sess->has_ended_once && sess->state < XR_SESSION_STATE_VISIBLE) { 1203 - oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED); 1203 + oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED, 0); 1204 1204 sess->has_ended_once = true; 1205 1205 } 1206 1206 }