Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorNicolas Fauvet <droune2001>2020-05-07 15:00:49 +0300
committerJulian Eisel <julian@blender.org>2020-05-07 15:28:28 +0300
commit6e0540671c7a7426d85791db7be20eccc8271619 (patch)
tree7ff47c11f7baf765af42144a97bd2de23c46c66a /intern
parent850a539c903605586d0f32bd14fc3dcf63d5a89e (diff)
VR: Fix OpenXR state freeze on Oculus after taking off HMD
With the Oculus runtime, the VR session would freeze when taking off the HMD and putting it back on. This was caused by the deletion of graphics resources too early in the OpenXR state machine, at least for Oculus. The resources will now only be freed once the session is actually destroyed. Also fixes an issue where it wasn't possible to stop the session via the UI when the HMD was taken off. Reviewed By: Julian Eisel Differential Revision: https://developer.blender.org/D7635
Diffstat (limited to 'intern')
-rw-r--r--intern/ghost/intern/GHOST_XrContext.cpp9
-rw-r--r--intern/ghost/intern/GHOST_XrSession.cpp21
-rw-r--r--intern/ghost/intern/GHOST_XrSession.h3
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();