st/oxr: Handle XR_SESSION_STATE_LOSS_PENDING

This commit is contained in:
Jarvis Huang 2023-03-15 17:18:58 +08:00 committed by Jakob Bornecrantz
parent 971947f722
commit f9d83c8b1f
3 changed files with 25 additions and 17 deletions

View file

@ -693,7 +693,7 @@ oxr_session_enumerate_formats(struct oxr_logger *log,
* Change the state of the session, queues a event. * Change the state of the session, queues a event.
*/ */
void void
oxr_session_change_state(struct oxr_logger *log, struct oxr_session *sess, XrSessionState state); oxr_session_change_state(struct oxr_logger *log, struct oxr_session *sess, XrSessionState state, XrTime time);
XrResult XrResult
oxr_session_begin(struct oxr_logger *log, struct oxr_session *sess, const XrSessionBeginInfo *beginInfo); oxr_session_begin(struct oxr_logger *log, struct oxr_session *sess, const XrSessionBeginInfo *beginInfo);
@ -1530,6 +1530,8 @@ struct oxr_session
/*! initial relation of head in "global" space. /*! initial relation of head in "global" space.
* Used as reference for local space. */ * Used as reference for local space. */
struct xrt_space_relation local_space_pure_relation; struct xrt_space_relation local_space_pure_relation;
bool has_lost;
}; };
/*! /*!

View file

@ -92,9 +92,9 @@ to_string(XrSessionState state)
} }
void void
oxr_session_change_state(struct oxr_logger *log, struct oxr_session *sess, XrSessionState state) oxr_session_change_state(struct oxr_logger *log, struct oxr_session *sess, XrSessionState state, XrTime time)
{ {
oxr_event_push_XrEventDataSessionStateChanged(log, sess, state, 0); oxr_event_push_XrEventDataSessionStateChanged(log, sess, state, time);
sess->state = state; sess->state = state;
} }
@ -193,11 +193,11 @@ oxr_session_end(struct oxr_logger *log, struct oxr_session *sess)
CALL_CHK(xrt_comp_end_session(xc)); CALL_CHK(xrt_comp_end_session(xc));
} }
oxr_session_change_state(log, sess, XR_SESSION_STATE_IDLE); oxr_session_change_state(log, sess, XR_SESSION_STATE_IDLE, 0);
if (sess->exiting) { if (sess->exiting) {
oxr_session_change_state(log, sess, XR_SESSION_STATE_EXITING); oxr_session_change_state(log, sess, XR_SESSION_STATE_EXITING, 0);
} else { } else {
oxr_session_change_state(log, sess, XR_SESSION_STATE_READY); oxr_session_change_state(log, sess, XR_SESSION_STATE_READY, 0);
} }
sess->has_begun = false; sess->has_begun = false;
@ -213,19 +213,19 @@ oxr_session_request_exit(struct oxr_logger *log, struct oxr_session *sess)
} }
if (sess->state == XR_SESSION_STATE_FOCUSED) { if (sess->state == XR_SESSION_STATE_FOCUSED) {
oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE); oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE, 0);
} }
if (sess->state == XR_SESSION_STATE_VISIBLE) { if (sess->state == XR_SESSION_STATE_VISIBLE) {
oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED); oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED, 0);
} }
if (!sess->has_ended_once) { if (!sess->has_ended_once) {
oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED); oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED, 0);
// Fake the synchronization. // Fake the synchronization.
sess->has_ended_once = true; sess->has_ended_once = true;
} }
//! @todo start fading out the app. //! @todo start fading out the app.
oxr_session_change_state(log, sess, XR_SESSION_STATE_STOPPING); oxr_session_change_state(log, sess, XR_SESSION_STATE_STOPPING, 0);
sess->exiting = true; sess->exiting = true;
return oxr_session_success_result(sess); return oxr_session_success_result(sess);
} }
@ -256,24 +256,30 @@ oxr_session_poll(struct oxr_logger *log, struct oxr_session *sess)
case XRT_COMPOSITOR_EVENT_OVERLAY_CHANGE: case XRT_COMPOSITOR_EVENT_OVERLAY_CHANGE:
oxr_event_push_XrEventDataMainSessionVisibilityChangedEXTX(log, sess, xce.overlay.visible); oxr_event_push_XrEventDataMainSessionVisibilityChangedEXTX(log, sess, xce.overlay.visible);
break; break;
case XRT_COMPOSITOR_EVENT_LOSS_PENDING:
oxr_session_change_state(
log, sess, XR_SESSION_STATE_LOSS_PENDING,
time_state_monotonic_to_ts_ns(sess->sys->inst->timekeeping, xce.loss_pending.loss_time_ns));
break;
case XRT_COMPOSITOR_EVENT_LOST: sess->has_lost = true; break;
default: U_LOG_W("unhandled event type! %d", xce.type); break; default: U_LOG_W("unhandled event type! %d", xce.type); break;
} }
} }
if (sess->state == XR_SESSION_STATE_SYNCHRONIZED && sess->compositor_visible) { if (sess->state == XR_SESSION_STATE_SYNCHRONIZED && sess->compositor_visible) {
oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE); oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE, 0);
} }
if (sess->state == XR_SESSION_STATE_VISIBLE && sess->compositor_focused) { if (sess->state == XR_SESSION_STATE_VISIBLE && sess->compositor_focused) {
oxr_session_change_state(log, sess, XR_SESSION_STATE_FOCUSED); oxr_session_change_state(log, sess, XR_SESSION_STATE_FOCUSED, 0);
} }
if (sess->state == XR_SESSION_STATE_FOCUSED && !sess->compositor_focused) { if (sess->state == XR_SESSION_STATE_FOCUSED && !sess->compositor_focused) {
oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE); oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE, 0);
} }
if (sess->state == XR_SESSION_STATE_VISIBLE && !sess->compositor_visible) { if (sess->state == XR_SESSION_STATE_VISIBLE && !sess->compositor_visible) {
oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED); oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED, 0);
} }
} }
@ -891,8 +897,8 @@ oxr_session_create(struct oxr_logger *log,
} }
// Everything is in order, start the state changes. // Everything is in order, start the state changes.
oxr_session_change_state(log, sess, XR_SESSION_STATE_IDLE); oxr_session_change_state(log, sess, XR_SESSION_STATE_IDLE, 0);
oxr_session_change_state(log, sess, XR_SESSION_STATE_READY); oxr_session_change_state(log, sess, XR_SESSION_STATE_READY, 0);
*out_session = sess; *out_session = sess;

View file

@ -1200,7 +1200,7 @@ static void
do_synchronize_state_change(struct oxr_logger *log, struct oxr_session *sess) do_synchronize_state_change(struct oxr_logger *log, struct oxr_session *sess)
{ {
if (!sess->has_ended_once && sess->state < XR_SESSION_STATE_VISIBLE) { if (!sess->has_ended_once && sess->state < XR_SESSION_STATE_VISIBLE) {
oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED); oxr_session_change_state(log, sess, XR_SESSION_STATE_SYNCHRONIZED, 0);
sess->has_ended_once = true; sess->has_ended_once = true;
} }
} }