Commit: 262b1efd15883e83b277837fd228c24d13ceddcb
Author: Julian Eisel
Date:   Mon Mar 9 14:57:43 2020 +0100
Branches: vr_scene_inspection
https://developer.blender.org/rB262b1efd15883e83b277837fd228c24d13ceddcb

Avoid queries on inaccessible session state

On the Blender side we now use a more narrow definition of when a
session is considered running than the OpenXR specification does.

Also does related cleanup.

===================================================================

M       source/blender/editors/space_view3d/view3d_draw.c
M       source/blender/makesrna/intern/rna_xr.c
M       source/blender/windowmanager/WM_api.h
M       source/blender/windowmanager/intern/wm_operators.c
M       source/blender/windowmanager/intern/wm_xr.c

===================================================================

diff --git a/source/blender/editors/space_view3d/view3d_draw.c 
b/source/blender/editors/space_view3d/view3d_draw.c
index ca333b572db..d0df54f046c 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -322,10 +322,8 @@ static bool view3d_xr_mirror_active(const wmWindowManager 
*wm,
   return (v3d->flag & V3D_XR_SESSION_MIRROR) &&
          /* The free region (e.g. the camera region in quad-view) is always 
the last in the list
             base. We don't want any other to be affected. */
-         !region->next &&
-         /* NULL'ed when sending session end request. */
-         wm->xr.session_state &&  //
-         WM_xr_is_session_running(&wm->xr);
+         !region->next &&  //
+         WM_xr_session_is_running(&wm->xr);
 }
 
 static void view3d_xr_mirror_setup(const wmWindowManager *wm,
diff --git a/source/blender/makesrna/intern/rna_xr.c 
b/source/blender/makesrna/intern/rna_xr.c
index 42ce1c10b16..1bf54baa787 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -36,7 +36,7 @@ static bool rna_XrSessionState_is_running(bContext *C)
 {
 #  ifdef WITH_XR_OPENXR
   const wmWindowManager *wm = CTX_wm_manager(C);
-  return WM_xr_is_session_running(&wm->xr);
+  return WM_xr_session_is_running(&wm->xr);
 #  else
   UNUSED_VARS(C);
   return false;
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index bf3c622c3f9..10bc505fbc1 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -873,7 +873,7 @@ void WM_generic_user_data_free(struct wmGenericUserData 
*user_data);
 
 #ifdef WITH_XR_OPENXR
 /* wm_xr.c */
-bool WM_xr_is_session_running(const wmXrData *xr);
+bool WM_xr_session_is_running(const wmXrData *xr);
 void WM_xr_session_state_viewer_location_get(const wmXrData *xr, float 
location[3]);
 void WM_xr_session_state_viewer_rotation_get(const wmXrData *xr, float 
rotation[4]);
 void WM_xr_session_state_viewer_matrix_info_get(const wmXrData *xr,
diff --git a/source/blender/windowmanager/intern/wm_operators.c 
b/source/blender/windowmanager/intern/wm_operators.c
index d3d2ae2c910..50985174dee 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -3681,7 +3681,7 @@ static int wm_xr_session_toggle_exec(bContext *C, 
wmOperator *UNUSED(op))
 
   wm_xr_session_toggle(C, wm->xr.context);
 
-  if (!WM_xr_is_session_running(&wm->xr) || !wm->xr.session_state) {
+  if (!WM_xr_session_is_running(&wm->xr)) {
     wm_xr_session_disable_mirror_views(CTX_data_main(C));
   }
 
diff --git a/source/blender/windowmanager/intern/wm_xr.c 
b/source/blender/windowmanager/intern/wm_xr.c
index 2fb6929bfbe..bdb53d01fad 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -303,7 +303,7 @@ static void 
wm_xr_runtime_session_state_info_update(bXrRuntimeSessionState *stat
 
 void WM_xr_session_state_viewer_location_get(const wmXrData *xr, float 
location[3])
 {
-  if (!WM_xr_is_session_running(xr) || 
!xr->session_state->last_known.is_initialized) {
+  if (!WM_xr_session_is_running(xr) || 
!xr->session_state->last_known.is_initialized) {
     return;
   }
 
@@ -312,7 +312,7 @@ void WM_xr_session_state_viewer_location_get(const wmXrData 
*xr, float location[
 
 void WM_xr_session_state_viewer_rotation_get(const wmXrData *xr, float 
rotation[4])
 {
-  if (!WM_xr_is_session_running(xr) || 
!xr->session_state->last_known.is_initialized) {
+  if (!WM_xr_session_is_running(xr) || 
!xr->session_state->last_known.is_initialized) {
     return;
   }
 
@@ -323,7 +323,7 @@ void WM_xr_session_state_viewer_matrix_info_get(const 
wmXrData *xr,
                                                 float r_viewmat[4][4],
                                                 float *r_focal_len)
 {
-  if (!WM_xr_is_session_running(xr) || 
!xr->session_state->last_known.is_initialized) {
+  if (!WM_xr_session_is_running(xr) || 
!xr->session_state->last_known.is_initialized) {
     return;
   }
 
@@ -376,7 +376,7 @@ void wm_xr_session_toggle(bContext *C, void *xr_context_ptr)
   GHOST_XrContextHandle xr_context = xr_context_ptr;
   wmWindowManager *wm = CTX_wm_manager(C);
 
-  if (WM_xr_is_session_running(&wm->xr)) {
+  if (WM_xr_session_is_running(&wm->xr)) {
     GHOST_XrSessionEnd(xr_context);
     wm_xr_runtime_session_state_free(&wm->xr.session_state);
   }
@@ -390,11 +390,21 @@ void wm_xr_session_toggle(bContext *C, void 
*xr_context_ptr)
   }
 }
 
-bool WM_xr_is_session_running(const wmXrData *xr)
+/**
+ * The definition used here to define a session as running differs slightly 
from the OpenXR
+ * sepecification one: Here we already consider a session as stopped when 
session-end request was
+ * issued. Ghost-XR may still have to handle session logic then, but Blender 
specific handling
+ * should be stopped then.
+ * This check should be used from external calls to WM_xr. Internally, 
GHOST_XrSessionIsRunning()
+ * may have to be called instead. It checks for the running state according to 
the OpenXR
+ * specification.
+ */
+bool WM_xr_session_is_running(const wmXrData *xr)
 {
-  /* wmXrData.session_state will be NULL if session end was requested. In that 
case, pretend like
-   * it's already  */
-  return xr->context && GHOST_XrSessionIsRunning(xr->context);
+  /* wmXrData.session_state will be NULL if session end was requested. That's 
what we use here to
+   * define if the session was already stopped (even if according to OpenXR, 
it's still considered
+   * running). */
+  return xr->context && xr->session_state && 
GHOST_XrSessionIsRunning(xr->context);
 }
 
 /** \} */ /* XR-Session */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to