xrt: Add frame_id to compositor frame calls

This commit is contained in:
Jakob Bornecrantz 2020-06-23 17:11:39 +01:00
parent 5ac0c7a139
commit b75f4f844b
8 changed files with 90 additions and 46 deletions

View file

@ -111,38 +111,41 @@ client_gl_compositor_end_session(struct xrt_compositor *xc)
static xrt_result_t
client_gl_compositor_wait_frame(struct xrt_compositor *xc,
int64_t *out_frame_id,
uint64_t *predicted_display_time,
uint64_t *predicted_display_period)
{
struct client_gl_compositor *c = client_gl_compositor(xc);
// Pipe down call into fd compositor.
return xrt_comp_wait_frame(&c->xcfd->base, predicted_display_time,
return xrt_comp_wait_frame(&c->xcfd->base, out_frame_id,
predicted_display_time,
predicted_display_period);
}
static xrt_result_t
client_gl_compositor_begin_frame(struct xrt_compositor *xc)
client_gl_compositor_begin_frame(struct xrt_compositor *xc, int64_t frame_id)
{
struct client_gl_compositor *c = client_gl_compositor(xc);
// Pipe down call into fd compositor.
return xrt_comp_begin_frame(&c->xcfd->base);
return xrt_comp_begin_frame(&c->xcfd->base, frame_id);
}
static xrt_result_t
client_gl_compositor_discard_frame(struct xrt_compositor *xc)
client_gl_compositor_discard_frame(struct xrt_compositor *xc, int64_t frame_id)
{
struct client_gl_compositor *c = client_gl_compositor(xc);
// Pipe down call into fd compositor.
return xrt_comp_discard_frame(&c->xcfd->base);
return xrt_comp_discard_frame(&c->xcfd->base, frame_id);
}
static xrt_result_t
client_gl_compositor_layer_begin(struct xrt_compositor *xc,
int64_t frame_id,
enum xrt_blend_mode env_blend_mode)
{
struct client_gl_compositor *c = client_gl_compositor(xc);
return xrt_comp_layer_begin(&c->xcfd->base, env_blend_mode);
return xrt_comp_layer_begin(&c->xcfd->base, frame_id, env_blend_mode);
}
static xrt_result_t
@ -183,11 +186,11 @@ client_gl_compositor_layer_quad(struct xrt_compositor *xc,
}
static xrt_result_t
client_gl_compositor_layer_commit(struct xrt_compositor *xc)
client_gl_compositor_layer_commit(struct xrt_compositor *xc, int64_t frame_id)
{
struct client_gl_compositor *c = client_gl_compositor(xc);
return xrt_comp_layer_commit(&c->xcfd->base);
return xrt_comp_layer_commit(&c->xcfd->base, frame_id);
}
static int64_t

View file

@ -178,38 +178,41 @@ client_vk_compositor_end_session(struct xrt_compositor *xc)
static xrt_result_t
client_vk_compositor_wait_frame(struct xrt_compositor *xc,
int64_t *out_frame_id,
uint64_t *predicted_display_time,
uint64_t *predicted_display_period)
{
struct client_vk_compositor *c = client_vk_compositor(xc);
// Pipe down call into fd compositor.
return xrt_comp_wait_frame(&c->xcfd->base, predicted_display_time,
return xrt_comp_wait_frame(&c->xcfd->base, out_frame_id,
predicted_display_time,
predicted_display_period);
}
static xrt_result_t
client_vk_compositor_begin_frame(struct xrt_compositor *xc)
client_vk_compositor_begin_frame(struct xrt_compositor *xc, int64_t frame_id)
{
struct client_vk_compositor *c = client_vk_compositor(xc);
// Pipe down call into fd compositor.
return xrt_comp_begin_frame(&c->xcfd->base);
return xrt_comp_begin_frame(&c->xcfd->base, frame_id);
}
static xrt_result_t
client_vk_compositor_discard_frame(struct xrt_compositor *xc)
client_vk_compositor_discard_frame(struct xrt_compositor *xc, int64_t frame_id)
{
struct client_vk_compositor *c = client_vk_compositor(xc);
// Pipe down call into fd compositor.
return xrt_comp_discard_frame(&c->xcfd->base);
return xrt_comp_discard_frame(&c->xcfd->base, frame_id);
}
static xrt_result_t
client_vk_compositor_layer_begin(struct xrt_compositor *xc,
int64_t frame_id,
enum xrt_blend_mode env_blend_mode)
{
struct client_vk_compositor *c = client_vk_compositor(xc);
return xrt_comp_layer_begin(&c->xcfd->base, env_blend_mode);
return xrt_comp_layer_begin(&c->xcfd->base, frame_id, env_blend_mode);
}
static xrt_result_t
@ -250,11 +253,11 @@ client_vk_compositor_layer_quad(struct xrt_compositor *xc,
}
static xrt_result_t
client_vk_compositor_layer_commit(struct xrt_compositor *xc)
client_vk_compositor_layer_commit(struct xrt_compositor *xc, int64_t frame_id)
{
struct client_vk_compositor *c = client_vk_compositor(xc);
return xrt_comp_layer_commit(&c->xcfd->base);
return xrt_comp_layer_commit(&c->xcfd->base, frame_id);
}
static struct xrt_swapchain *

View file

@ -172,6 +172,7 @@ compositor_wait_vsync_or_time(struct comp_compositor *c, int64_t wake_up_time)
static xrt_result_t
compositor_wait_frame(struct xrt_compositor *xc,
int64_t *out_frame_id,
uint64_t *predicted_display_time,
uint64_t *predicted_display_period)
{
@ -188,6 +189,7 @@ compositor_wait_frame(struct xrt_compositor *xc,
*predicted_display_period = interval_ns;
c->last_next_display_time = now_ns + interval_ns;
*predicted_display_time = c->last_next_display_time;
*out_frame_id = c->last_next_display_time;
return XRT_SUCCESS;
}
@ -217,6 +219,7 @@ compositor_wait_frame(struct xrt_compositor *xc,
*predicted_display_period =
next_display_time - c->last_next_display_time;
*predicted_display_time = next_display_time;
*out_frame_id = c->last_next_display_time;
c->last_next_display_time = next_display_time;
return XRT_SUCCESS;
@ -225,7 +228,7 @@ compositor_wait_frame(struct xrt_compositor *xc,
}
static xrt_result_t
compositor_begin_frame(struct xrt_compositor *xc)
compositor_begin_frame(struct xrt_compositor *xc, int64_t frame_id)
{
struct comp_compositor *c = comp_compositor(xc);
COMP_SPEW(c, "BEGIN_FRAME");
@ -234,7 +237,7 @@ compositor_begin_frame(struct xrt_compositor *xc)
}
static xrt_result_t
compositor_discard_frame(struct xrt_compositor *xc)
compositor_discard_frame(struct xrt_compositor *xc, int64_t frame_id)
{
struct comp_compositor *c = comp_compositor(xc);
COMP_SPEW(c, "DISCARD_FRAME");
@ -280,6 +283,7 @@ compositor_add_frame_timing(struct comp_compositor *c)
static xrt_result_t
compositor_layer_begin(struct xrt_compositor *xc,
int64_t frame_id,
enum xrt_blend_mode env_blend_mode)
{
struct comp_compositor *c = comp_compositor(xc);
@ -336,7 +340,7 @@ compositor_layer_quad(struct xrt_compositor *xc,
}
static xrt_result_t
compositor_layer_commit(struct xrt_compositor *xc)
compositor_layer_commit(struct xrt_compositor *xc, int64_t frame_id)
{
struct comp_compositor *c = comp_compositor(xc);

View file

@ -408,15 +408,20 @@ struct xrt_compositor
/*!
* See xrWaitFrame.
*
* The only requirement on the compositor for the @p frame_id
* is that it is a positive number.
*/
xrt_result_t (*wait_frame)(struct xrt_compositor *xc,
int64_t *out_frame_id,
uint64_t *predicted_display_time,
uint64_t *predicted_display_period);
/*!
* See xrBeginFrame.
*/
xrt_result_t (*begin_frame)(struct xrt_compositor *xc);
xrt_result_t (*begin_frame)(struct xrt_compositor *xc,
int64_t frame_id);
/*!
* This isn't in the OpenXR API but is explicit in the XRT interfaces.
@ -424,12 +429,13 @@ struct xrt_compositor
* Two calls to xrBeginFrame will cause the state tracker to call.
*
* ```c
* xc->begin_frame(xc)
* xc->discard_frame(xc)
* xc->begin_frame(xc)
* xc->begin_frame(xc, frame_id)
* xc->discard_frame(xc, frame_id)
* xc->begin_frame(xc, frame_id)
* ```
*/
xrt_result_t (*discard_frame)(struct xrt_compositor *xc);
xrt_result_t (*discard_frame)(struct xrt_compositor *xc,
int64_t frame_id);
/*!
* Begins layer submission, this and the other layer_* calls are
@ -438,6 +444,7 @@ struct xrt_compositor
* of the swapchain the image is used as soon as it's given in a call.
*/
xrt_result_t (*layer_begin)(struct xrt_compositor *xc,
int64_t frame_id,
enum xrt_blend_mode env_blend_mode);
/*!
@ -473,7 +480,8 @@ struct xrt_compositor
* Commits all of the submitted layers, it's from this on that the
* compositor will use the layers.
*/
xrt_result_t (*layer_commit)(struct xrt_compositor *xc);
xrt_result_t (*layer_commit)(struct xrt_compositor *xc,
int64_t frame_id);
/*!
* Teardown the compositor.
@ -569,10 +577,11 @@ xrt_comp_end_session(struct xrt_compositor *xc)
*/
static inline xrt_result_t
xrt_comp_wait_frame(struct xrt_compositor *xc,
int64_t *out_frame_id,
uint64_t *predicted_display_time,
uint64_t *predicted_display_period)
{
return xc->wait_frame(xc, predicted_display_time,
return xc->wait_frame(xc, out_frame_id, predicted_display_time,
predicted_display_period);
}
@ -584,9 +593,9 @@ xrt_comp_wait_frame(struct xrt_compositor *xc,
* @public @memberof xrt_compositor
*/
static inline xrt_result_t
xrt_comp_begin_frame(struct xrt_compositor *xc)
xrt_comp_begin_frame(struct xrt_compositor *xc, int64_t frame_id)
{
return xc->begin_frame(xc);
return xc->begin_frame(xc, frame_id);
}
/*!
@ -597,9 +606,9 @@ xrt_comp_begin_frame(struct xrt_compositor *xc)
* @public @memberof xrt_compositor
*/
static inline xrt_result_t
xrt_comp_discard_frame(struct xrt_compositor *xc)
xrt_comp_discard_frame(struct xrt_compositor *xc, int64_t frame_id)
{
return xc->discard_frame(xc);
return xc->discard_frame(xc, frame_id);
}
/*!
@ -611,9 +620,10 @@ xrt_comp_discard_frame(struct xrt_compositor *xc)
*/
static inline xrt_result_t
xrt_comp_layer_begin(struct xrt_compositor *xc,
int64_t frame_id,
enum xrt_blend_mode env_blend_mode)
{
return xc->layer_begin(xc, env_blend_mode);
return xc->layer_begin(xc, frame_id, env_blend_mode);
}
/*!
@ -657,9 +667,9 @@ xrt_comp_layer_quad(struct xrt_compositor *xc,
* @public @memberof xrt_compositor
*/
static inline xrt_result_t
xrt_comp_layer_commit(struct xrt_compositor *xc)
xrt_comp_layer_commit(struct xrt_compositor *xc, int64_t frame_id)
{
return xc->layer_commit(xc);
return xc->layer_commit(xc, frame_id);
}
/*!

View file

@ -300,6 +300,7 @@ wait_semaphore(struct ipc_client_compositor *icc, struct ipc_shared_memory *ism)
static xrt_result_t
ipc_compositor_wait_frame(struct xrt_compositor *xc,
int64_t *out_frame_id,
uint64_t *out_predicted_display_time,
uint64_t *out_predicted_display_period)
{
@ -309,6 +310,7 @@ ipc_compositor_wait_frame(struct xrt_compositor *xc,
wait_semaphore(icc, icc->ipc_c->ism);
*out_frame_id = 1;
*out_predicted_display_time =
icc->ipc_c->ism->wait_frame.predicted_display_time;
*out_predicted_display_period =
@ -318,7 +320,7 @@ ipc_compositor_wait_frame(struct xrt_compositor *xc,
}
static xrt_result_t
ipc_compositor_begin_frame(struct xrt_compositor *xc)
ipc_compositor_begin_frame(struct xrt_compositor *xc, int64_t frame_id)
{
struct ipc_client_compositor *icc = ipc_client_compositor(xc);
@ -329,6 +331,7 @@ ipc_compositor_begin_frame(struct xrt_compositor *xc)
static xrt_result_t
ipc_compositor_layer_begin(struct xrt_compositor *xc,
int64_t frame_id,
enum xrt_blend_mode env_blend_mode)
{
struct ipc_client_compositor *icc = ipc_client_compositor(xc);
@ -391,7 +394,7 @@ ipc_compositor_layer_quad(struct xrt_compositor *xc,
}
static xrt_result_t
ipc_compositor_layer_commit(struct xrt_compositor *xc)
ipc_compositor_layer_commit(struct xrt_compositor *xc, int64_t frame_id)
{
struct ipc_client_compositor *icc = ipc_client_compositor(xc);
@ -411,7 +414,7 @@ ipc_compositor_layer_commit(struct xrt_compositor *xc)
}
static xrt_result_t
ipc_compositor_discard_frame(struct xrt_compositor *xc)
ipc_compositor_discard_frame(struct xrt_compositor *xc, int64_t frame_id)
{
struct ipc_client_compositor *icc = ipc_client_compositor(xc);

View file

@ -58,9 +58,12 @@ run(void *ptr)
// Unlock the mutex when we have waiting to do.
os_thread_helper_unlock(&iw->oth);
int64_t frame_id;
// Do the waiting.
uint64_t predicted_display_time, predicted_display_period;
xrt_comp_wait_frame(iw->s->xc, &predicted_display_time,
xrt_comp_wait_frame(iw->s->xc, &frame_id,
&predicted_display_time,
&predicted_display_period);
// Lock for broadcast.

View file

@ -1183,6 +1183,12 @@ struct oxr_session
bool frame_started;
bool exiting;
struct
{
int64_t waited;
int64_t begun;
} frame_id;
/*!
* An array of action set attachments that this session owns.
*/

View file

@ -161,10 +161,15 @@ oxr_session_end(struct oxr_logger *log, struct oxr_session *sess)
}
if (xc != NULL) {
if (sess->frame_started) {
xrt_comp_discard_frame(xc);
sess->frame_started = false;
if (sess->frame_id.waited > 0) {
xrt_comp_discard_frame(xc, sess->frame_id.waited);
sess->frame_id.waited = -1;
}
if (sess->frame_id.begun > 0) {
xrt_comp_discard_frame(xc, sess->frame_id.begun);
sess->frame_id.begun = -1;
}
sess->frame_started = false;
CALL_CHK(xrt_comp_end_session(xc));
}
@ -431,7 +436,8 @@ oxr_session_frame_wait(struct oxr_logger *log,
uint64_t predicted_display_time;
uint64_t predicted_display_period;
CALL_CHK(xrt_comp_wait_frame(xc, &predicted_display_time,
CALL_CHK(xrt_comp_wait_frame(xc, &sess->frame_id.waited,
&predicted_display_time,
&predicted_display_period));
if ((int64_t)predicted_display_time <= 0) {
@ -477,14 +483,18 @@ oxr_session_frame_begin(struct oxr_logger *log, struct oxr_session *sess)
if (sess->frame_started) {
ret = XR_FRAME_DISCARDED;
if (xc != NULL) {
CALL_CHK(xrt_comp_discard_frame(xc));
CALL_CHK(
xrt_comp_discard_frame(xc, sess->frame_id.begun));
sess->frame_id.begun = -1;
}
} else {
ret = oxr_session_success_result(sess);
sess->frame_started = true;
}
if (xc != NULL) {
CALL_CHK(xrt_comp_begin_frame(xc));
CALL_CHK(xrt_comp_begin_frame(xc, sess->frame_id.waited));
sess->frame_id.begun = sess->frame_id.waited;
sess->frame_id.waited = -1;
}
return ret;
@ -967,7 +977,8 @@ oxr_session_frame_end(struct oxr_logger *log,
* Early out for discarded frame if layer count is 0.
*/
if (frameEndInfo->layerCount == 0) {
CALL_CHK(xrt_comp_discard_frame(xc));
CALL_CHK(xrt_comp_discard_frame(xc, sess->frame_id.begun));
sess->frame_id.begun = -1;
sess->frame_started = false;
return oxr_session_success_result(sess);
@ -1027,7 +1038,7 @@ oxr_session_frame_end(struct oxr_logger *log,
math_pose_invert(&sess->sys->head->tracking_origin->offset,
&inv_offset);
CALL_CHK(xrt_comp_layer_begin(xc, blend_mode));
CALL_CHK(xrt_comp_layer_begin(xc, sess->frame_id.begun, blend_mode));
for (uint32_t i = 0; i < frameEndInfo->layerCount; i++) {
const XrCompositionLayerBaseHeader *layer =
@ -1051,7 +1062,8 @@ oxr_session_frame_end(struct oxr_logger *log,
}
}
CALL_CHK(xrt_comp_layer_commit(xc));
CALL_CHK(xrt_comp_layer_commit(xc, sess->frame_id.begun));
sess->frame_id.begun = -1;
sess->frame_started = false;