st/oxr: Use a semaphore to ensure wait frame is released after begin frame has been called

This commit is contained in:
Jakob Bornecrantz 2020-06-23 18:02:08 +01:00
parent f5359b655e
commit 3275f00464
2 changed files with 10 additions and 0 deletions
src/xrt/state_trackers/oxr

View file

@ -1189,6 +1189,8 @@ struct oxr_session
int64_t begun;
} frame_id;
struct os_semaphore sem;
/*!
* An array of action set attachments that this session owns.
*/

View file

@ -423,6 +423,7 @@ oxr_session_frame_wait(struct oxr_logger *log,
"Session is not running");
}
//! @todo this should be carefully synchronized, because there may be
//! more than one session per instance.
XRT_MAYBE_UNUSED timepoint_ns now =
@ -434,6 +435,9 @@ oxr_session_frame_wait(struct oxr_logger *log,
return oxr_session_success_result(sess);
}
// Before calling wait frame make sure that begin frame has been called.
os_semaphore_wait(&sess->sem, 0);
uint64_t predicted_display_time;
uint64_t predicted_display_period;
CALL_CHK(xrt_comp_wait_frame(xc, &sess->frame_id.waited,
@ -497,6 +501,8 @@ oxr_session_frame_begin(struct oxr_logger *log, struct oxr_session *sess)
sess->frame_id.waited = -1;
}
os_semaphore_release(&sess->sem);
return ret;
}
@ -1207,6 +1213,8 @@ oxr_session_create(struct oxr_logger *log,
return ret;
}
os_semaphore_init(&sess->sem, 1);
sess->ipd_meters = debug_get_num_option_ipd() / 1000.0f;
sess->static_prediction_s =
debug_get_num_option_prediction_ms() / 1000.0f;