st/oxr: Fix state changes errors

This commit is contained in:
Jakob Bornecrantz 2020-10-20 19:27:48 +01:00
parent 2528583c55
commit fd5cfbe9a7
2 changed files with 23 additions and 16 deletions

View file

@ -1254,9 +1254,10 @@ struct oxr_session
bool has_begun;
/*!
* There is a extra state between xrBeginSession has been called and
* the first xrWaitFrame has been called. These are to track this.
* the first xrEndFrame has been called. These are to track this.
*/
bool has_waited_once;
bool has_ended_once;
bool frame_started;
bool exiting;

View file

@ -211,11 +211,11 @@ oxr_session_request_exit(struct oxr_logger *log, struct oxr_session *sess)
oxr_session_change_state(log, sess,
XR_SESSION_STATE_SYNCHRONIZED);
}
if (!sess->has_waited_once) {
if (!sess->has_ended_once) {
oxr_session_change_state(log, sess,
XR_SESSION_STATE_SYNCHRONIZED);
// Fake the synchronization.
sess->has_waited_once = true;
sess->has_ended_once = true;
}
//! @todo start fading out the app.
@ -555,18 +555,6 @@ oxr_session_frame_wait(struct oxr_logger *log,
frameState->predictedDisplayTime);
}
if (!sess->has_waited_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_VISIBLE); //these states will be handled by
// messages received from the compositor
// oxr_session_change_state(log, sess,
// XR_SESSION_STATE_FOCUSED); //these states will be handled by
// messages received from the compositor
sess->has_waited_once = true;
}
return oxr_session_success_result(sess);
}
@ -1657,6 +1645,16 @@ submit_equirect_layer(struct oxr_session *sess,
// Not implemented
}
static void
do_synchronize_state_change(struct oxr_logger *log, struct oxr_session *sess)
{
if (!sess->has_ended_once && sess->state < XR_SESSION_STATE_VISIBLE) {
oxr_session_change_state(log, sess,
XR_SESSION_STATE_SYNCHRONIZED);
sess->has_ended_once = true;
}
}
XrResult
oxr_session_frame_end(struct oxr_logger *log,
struct oxr_session *sess,
@ -1691,6 +1689,8 @@ oxr_session_frame_end(struct oxr_logger *log,
if (xc == NULL) {
sess->frame_started = false;
do_synchronize_state_change(log, sess);
return oxr_session_success_result(sess);
}
@ -1729,9 +1729,12 @@ oxr_session_frame_end(struct oxr_logger *log,
sess->frame_id.begun = -1;
sess->frame_started = false;
do_synchronize_state_change(log, sess);
return oxr_session_success_result(sess);
}
/*
* Layers.
*/
@ -1796,6 +1799,9 @@ oxr_session_frame_end(struct oxr_logger *log,
* Done verifying.
*/
// Do state change if needed.
do_synchronize_state_change(log, sess);
struct xrt_pose inv_offset = {0};
math_pose_invert(&xdev->tracking_origin->offset, &inv_offset);