The open source OpenXR runtime
0
fork

Configure Feed

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

xrt: Move synchronized state test into oxr session

The compositor now moves immediately to visible/focused when polling.
The state tracker will generate relevant openxr state changes once the session is synchronized.

Properly working alternative to e03ee48dcea88427ac3272ccab70bb665b1618a4 (reverted in e7643de8dbb10884736107284c2fdad56c7a6c83)

+29 -36
+7 -10
src/xrt/compositor/main/comp_compositor.c
··· 210 210 *predicted_display_time = c->last_next_display_time; 211 211 *out_frame_id = c->last_next_display_time; 212 212 213 - if (c->state == COMP_STATE_PREPARED) { 214 - c->state = COMP_STATE_WAITED; 215 - } 216 213 return XRT_SUCCESS; 217 214 } 218 215 ··· 246 243 247 244 c->last_next_display_time = next_display_time; 248 245 249 - if (c->state == COMP_STATE_PREPARED) { 250 - c->state = COMP_STATE_WAITED; 251 - } 252 246 return XRT_SUCCESS; 253 247 } 254 248 } ··· 529 523 U_ZERO(out_xce); 530 524 531 525 switch (c->state) { 526 + case COMP_STATE_UNINITIALIZED: 527 + COMP_ERROR(c, "Polled uninitialized compositor"); 528 + out_xce->state.type = XRT_COMPOSITOR_EVENT_NONE; 529 + break; 532 530 case COMP_STATE_READY: 533 531 out_xce->state.type = XRT_COMPOSITOR_EVENT_NONE; 534 532 break; 535 533 case COMP_STATE_PREPARED: 536 - out_xce->state.type = XRT_COMPOSITOR_EVENT_NONE; 537 - break; 538 - case COMP_STATE_WAITED: 539 - COMP_DEBUG(c, "WAITED -> VISIBLE"); 534 + COMP_DEBUG(c, "PREPARED -> VISIBLE"); 540 535 out_xce->state.type = XRT_COMPOSITOR_EVENT_STATE_CHANGE; 541 536 out_xce->state.visible = true; 542 537 c->state = COMP_STATE_VISIBLE; ··· 1372 1367 u_var_add_f32_timing(c, ft, "Frame Times (Compositor)"); 1373 1368 1374 1369 c->compositor_frame_times.debug_var = ft; 1370 + 1371 + c->state = COMP_STATE_READY; 1375 1372 1376 1373 return &c->base; 1377 1374 }
+3 -3
src/xrt/compositor/main/comp_compositor.h
··· 127 127 */ 128 128 enum comp_state 129 129 { 130 - COMP_STATE_READY = 0, 131 - COMP_STATE_PREPARED = 1, 132 - COMP_STATE_WAITED = 2, 130 + COMP_STATE_UNINITIALIZED = 0, 131 + COMP_STATE_READY = 1, 132 + COMP_STATE_PREPARED = 2, 133 133 COMP_STATE_VISIBLE = 3, 134 134 COMP_STATE_FOCUSED = 4, 135 135 };
+3
src/xrt/state_trackers/oxr/oxr_objects.h
··· 1258 1258 */ 1259 1259 bool has_ended_once; 1260 1260 1261 + bool compositor_visible; 1262 + bool compositor_focused; 1263 + 1261 1264 bool frame_started; 1262 1265 bool exiting; 1263 1266
+16 -23
src/xrt/state_trackers/oxr/oxr_session.c
··· 232 232 return; 233 233 } 234 234 235 - while (true) { 235 + bool read_more_events = true; 236 + while (read_more_events) { 236 237 union xrt_compositor_event xce = {0}; 237 238 xc->poll_events(xc, &xce); 238 239 ··· 240 241 switch (xce.type) { 241 242 case XRT_COMPOSITOR_EVENT_NONE: 242 243 // No more events. 243 - return; 244 + read_more_events = false; 245 + break; 244 246 case XRT_COMPOSITOR_EVENT_STATE_CHANGE: 245 - if (xce.state.visible && 246 - sess->state == XR_SESSION_STATE_SYNCHRONIZED) { 247 - oxr_session_change_state( 248 - log, sess, XR_SESSION_STATE_VISIBLE); 249 - } 250 - if (xce.state.focused && 251 - sess->state == XR_SESSION_STATE_VISIBLE) { 252 - oxr_session_change_state( 253 - log, sess, XR_SESSION_STATE_FOCUSED); 254 - } 255 - 256 - if (!xce.state.focused && 257 - sess->state == XR_SESSION_STATE_FOCUSED) { 258 - oxr_session_change_state( 259 - log, sess, XR_SESSION_STATE_VISIBLE); 260 - } 261 - if (!xce.state.visible && 262 - sess->state == XR_SESSION_STATE_VISIBLE) { 263 - oxr_session_change_state( 264 - log, sess, XR_SESSION_STATE_SYNCHRONIZED); 265 - } 247 + sess->compositor_visible = xce.state.visible; 248 + sess->compositor_focused = xce.state.focused; 266 249 break; 267 250 case XRT_COMPOSITOR_EVENT_OVERLAY_CHANGE: 268 251 oxr_event_push_XrEventDataMainSessionVisibilityChangedEXTX( ··· 272 255 fprintf(stderr, "unhandled event type! %d", xce.type); 273 256 break; 274 257 } 258 + } 259 + 260 + if (sess->state == XR_SESSION_STATE_SYNCHRONIZED && 261 + sess->compositor_visible) { 262 + oxr_session_change_state(log, sess, XR_SESSION_STATE_VISIBLE); 263 + } 264 + 265 + if (sess->state == XR_SESSION_STATE_VISIBLE && 266 + sess->compositor_focused) { 267 + oxr_session_change_state(log, sess, XR_SESSION_STATE_FOCUSED); 275 268 } 276 269 } 277 270