diff options
-rw-r--r-- | intern/ghost/intern/GHOST_XrContext.cpp | 9 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_XrSession.cpp | 21 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_XrSession.h | 3 |
3 files changed, 20 insertions, 13 deletions
diff --git a/intern/ghost/intern/GHOST_XrContext.cpp b/intern/ghost/intern/GHOST_XrContext.cpp index 2cd5b2ca8c8..3aab420a9b6 100644 --- a/intern/ghost/intern/GHOST_XrContext.cpp +++ b/intern/ghost/intern/GHOST_XrContext.cpp @@ -465,7 +465,14 @@ void GHOST_XrContext::startSession(const GHOST_XrSessionBeginInfo *begin_info) void GHOST_XrContext::endSession() { - m_session->requestEnd(); + if (m_session) { + if (m_session->isRunning()) { + m_session->requestEnd(); + } + else { + m_session = nullptr; + } + } } bool GHOST_XrContext::isSessionRunning() const diff --git a/intern/ghost/intern/GHOST_XrSession.cpp b/intern/ghost/intern/GHOST_XrSession.cpp index 1f24f2fb37f..edc4960cf32 100644 --- a/intern/ghost/intern/GHOST_XrSession.cpp +++ b/intern/ghost/intern/GHOST_XrSession.cpp @@ -203,13 +203,17 @@ void GHOST_XrSession::requestEnd() xrRequestExitSession(m_oxr->session); } -void GHOST_XrSession::end() +void GHOST_XrSession::beginSession() { - assert(m_oxr->session != XR_NULL_HANDLE); + XrSessionBeginInfo begin_info = {XR_TYPE_SESSION_BEGIN_INFO}; + begin_info.primaryViewConfigurationType = m_oxr->view_type; + CHECK_XR(xrBeginSession(m_oxr->session, &begin_info), "Failed to cleanly begin the VR session."); +} +void GHOST_XrSession::endSession() +{ + assert(m_oxr->session != XR_NULL_HANDLE); CHECK_XR(xrEndSession(m_oxr->session), "Failed to cleanly end the VR session."); - unbindGraphicsContext(); - m_draw_info = nullptr; } GHOST_XrSession::LifeExpectancy GHOST_XrSession::handleStateChangeEvent( @@ -222,16 +226,11 @@ GHOST_XrSession::LifeExpectancy GHOST_XrSession::handleStateChangeEvent( switch (lifecycle->state) { case XR_SESSION_STATE_READY: { - XrSessionBeginInfo begin_info = {XR_TYPE_SESSION_BEGIN_INFO}; - - begin_info.primaryViewConfigurationType = m_oxr->view_type; - CHECK_XR(xrBeginSession(m_oxr->session, &begin_info), - "Failed to cleanly begin the VR session."); + beginSession(); break; } case XR_SESSION_STATE_STOPPING: - /* Runtime will change state to STATE_EXITING, don't destruct session yet. */ - end(); + endSession(); break; case XR_SESSION_STATE_EXITING: case XR_SESSION_STATE_LOSS_PENDING: diff --git a/intern/ghost/intern/GHOST_XrSession.h b/intern/ghost/intern/GHOST_XrSession.h index 39e1a63ffda..da0128b2851 100644 --- a/intern/ghost/intern/GHOST_XrSession.h +++ b/intern/ghost/intern/GHOST_XrSession.h @@ -68,7 +68,8 @@ class GHOST_XrSession { std::unique_ptr<GHOST_XrDrawInfo> m_draw_info; void initSystem(); - void end(); + void beginSession(); + void endSession(); void bindGraphicsContext(); |