| 240 | } |
| 241 | |
| 242 | OVR_PUBLIC_FUNCTION(ovrResult) ovr_GetSessionStatus(ovrSession session, ovrSessionStatus* sessionStatus) |
| 243 | { |
| 244 | REV_TRACE(ovr_GetSessionStatus); |
| 245 | |
| 246 | if (!session) |
| 247 | return ovrError_InvalidSession; |
| 248 | |
| 249 | if (!sessionStatus) |
| 250 | return ovrError_InvalidParameter; |
| 251 | |
| 252 | assert(session->SessionStatus.is_lock_free()); |
| 253 | SessionStatusBits status = session->SessionStatus; |
| 254 | XrEventDataBuffer event = XR_TYPE(EVENT_DATA_BUFFER); |
| 255 | while (XR_UNQUALIFIED_SUCCESS(xrPollEvent(session->Instance, &event))) |
| 256 | { |
| 257 | switch (event.type) |
| 258 | { |
| 259 | case XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED: |
| 260 | { |
| 261 | const XrEventDataSessionStateChanged& stateChanged = |
| 262 | reinterpret_cast<XrEventDataSessionStateChanged&>(event); |
| 263 | if (stateChanged.session == session->Session) |
| 264 | { |
| 265 | switch (stateChanged.state) |
| 266 | { |
| 267 | case XR_SESSION_STATE_IDLE: |
| 268 | status.HmdPresent = true; |
| 269 | break; |
| 270 | case XR_SESSION_STATE_READY: |
| 271 | // Oculus apps won't synchronize before they're visible, |
| 272 | // so we have to set the IsVisible flag immediately. |
| 273 | status.IsVisible = true; |
| 274 | status.HmdMounted = true; |
| 275 | break; |
| 276 | case XR_SESSION_STATE_SYNCHRONIZED: |
| 277 | break; |
| 278 | case XR_SESSION_STATE_VISIBLE: |
| 279 | status.HasInputFocus = false; |
| 280 | break; |
| 281 | case XR_SESSION_STATE_FOCUSED: |
| 282 | status.HasInputFocus = true; |
| 283 | break; |
| 284 | case XR_SESSION_STATE_STOPPING: |
| 285 | status.IsVisible = false; |
| 286 | status.HmdMounted = false; |
| 287 | break; |
| 288 | case XR_SESSION_STATE_LOSS_PENDING: |
| 289 | status.DisplayLost = true; |
| 290 | break; |
| 291 | case XR_SESSION_STATE_EXITING: |
| 292 | status.ShouldQuit = true; |
| 293 | break; |
| 294 | } |
| 295 | session->SessionStatus = status; |
| 296 | |
| 297 | if (stateChanged.state == XR_SESSION_STATE_READY) |
| 298 | session->BeginSession(); |
| 299 | if (stateChanged.state == XR_SESSION_STATE_STOPPING) |
nothing calls this directly
no test coverage detected