[Bf-blender-cvs] [5954cb807ff] vr_scene_inspection: Fix crash when ending VR session through "Toggle VR Session"

Julian Eisel noreply at git.blender.org
Thu Dec 12 18:37:10 CET 2019


Commit: 5954cb807ffd43824bee92e879092ae8a37ee567
Author: Julian Eisel
Date:   Thu Dec 12 16:18:17 2019 +0100
Branches: vr_scene_inspection
https://developer.blender.org/rB5954cb807ffd43824bee92e879092ae8a37ee567

Fix crash when ending VR session through "Toggle VR Session"

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

M	source/blender/windowmanager/intern/wm_xr.c

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

diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index 9b7d616b6f9..c214cee7312 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -59,7 +59,7 @@
 #include "wm_surface.h"
 #include "wm_window.h"
 
-void wm_xr_runtime_session_state_free(struct bXrRuntimeSessionState *state);
+void wm_xr_runtime_session_state_free(struct bXrRuntimeSessionState **state);
 void wm_xr_draw_view(const GHOST_XrDrawViewInfo *, void *);
 void *wm_xr_session_gpu_binding_context_create(GHOST_TXrGraphicsBinding);
 void wm_xr_session_gpu_binding_context_destroy(GHOST_TXrGraphicsBinding, void *);
@@ -176,7 +176,7 @@ void wm_xr_data_destroy(wmWindowManager *wm)
     GHOST_XrContextDestroy(wm->xr.context);
   }
   if (wm->xr.session_state != NULL) {
-    wm_xr_runtime_session_state_free(wm->xr.session_state);
+    wm_xr_runtime_session_state_free(&wm->xr.session_state);
   }
 }
 
@@ -204,9 +204,9 @@ static bXrRuntimeSessionState *wm_xr_runtime_session_state_create(const Scene *s
   return state;
 }
 
-void wm_xr_runtime_session_state_free(bXrRuntimeSessionState *state)
+void wm_xr_runtime_session_state_free(bXrRuntimeSessionState **state)
 {
-  MEM_SAFE_FREE(state);
+  MEM_SAFE_FREE(*state);
 }
 
 static void wm_xr_runtime_session_state_update(bXrRuntimeSessionState *state,
@@ -275,7 +275,7 @@ void wm_xr_session_toggle(bContext *C, void *xr_context_ptr)
 
   if (xr_context && GHOST_XrSessionIsRunning(xr_context)) {
     GHOST_XrSessionEnd(xr_context);
-    wm_xr_runtime_session_state_free(wm->xr.session_state);
+    wm_xr_runtime_session_state_free(&wm->xr.session_state);
   }
   else {
     GHOST_XrSessionBeginInfo begin_info;
@@ -526,6 +526,11 @@ void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata)
   View3DShading shading;
   float viewmat[4][4], winmat[4][4];
 
+  /* The runtime may still trigger drawing while a session-end request is pending. */
+  if (!wm->xr.session_state || !wm->xr.context) {
+    return;
+  }
+
   wm_xr_runtime_session_state_update(wm->xr.session_state, draw_view, settings);
   wm_xr_draw_matrices_create(draw_view, settings, wm->xr.session_state, viewmat, winmat);



More information about the Bf-blender-cvs mailing list