[Bf-blender-cvs] [be59b7699ef] xr-controller-support: XR: Fix crash on close with active session

Peter Kim noreply at git.blender.org
Wed Jul 28 06:08:37 CEST 2021


Commit: be59b7699ef580db82cd01bdeb84b34689438f3c
Author: Peter Kim
Date:   Wed Jul 28 13:06:41 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rBbe59b7699ef580db82cd01bdeb84b34689438f3c

XR: Fix crash on close with active session

Fixes an issue introduced in 99beac7b3f03 due to duplicate call to
wm_xr_session_data_free().

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

M	source/blender/windowmanager/xr/intern/wm_xr.c
M	source/blender/windowmanager/xr/intern/wm_xr_intern.h
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

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

diff --git a/source/blender/windowmanager/xr/intern/wm_xr.c b/source/blender/windowmanager/xr/intern/wm_xr.c
index 071a9797c51..cf4580f4c19 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr.c
@@ -163,15 +163,12 @@ void wm_xr_runtime_data_free(wmXrRuntimeData **runtime)
    * that is freed here. */
 
   /* We free all runtime XR data here, so if the context is still alive, destroy it. */
-  if (*runtime) {
-    if ((*runtime)->context != NULL) {
-      GHOST_XrContextHandle context = (*runtime)->context;
-      /* Prevent recursive GHOST_XrContextDestroy() call by NULL'ing the context pointer before the
-       * first call, see comment above. */
-      (*runtime)->context = NULL;
-      GHOST_XrContextDestroy(context);
-    }
-    wm_xr_session_data_free(&(*runtime)->session_state);
+  if ((*runtime)->context != NULL) {
+    GHOST_XrContextHandle context = (*runtime)->context;
+    /* Prevent recursive GHOST_XrContextDestroy() call by NULL'ing the context pointer before the
+     * first call, see comment above. */
+    (*runtime)->context = NULL;
+    GHOST_XrContextDestroy(context);
   }
   MEM_SAFE_FREE(*runtime);
 }
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_intern.h b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
index c7d71367799..74809c4d138 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_intern.h
+++ b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
@@ -215,7 +215,6 @@ typedef struct wmXrActionSet {
 
 wmXrRuntimeData *wm_xr_runtime_data_create(void);
 void wm_xr_runtime_data_free(wmXrRuntimeData **runtime);
-void wm_xr_session_data_free(wmXrSessionState *state);
 
 wmWindow *wm_xr_session_root_window_or_fallback_get(const wmWindowManager *wm,
                                                     const wmXrRuntimeData *runtime_data);
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c
index dd2a9699f64..b5fe69aea3b 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_session.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c
@@ -115,6 +115,25 @@ static void wm_xr_session_create_cb(void)
   state->prev_base_scale = settings->base_scale;
 }
 
+static void wm_xr_session_controller_data_free(wmXrSessionState *state)
+{
+  ListBase *lb = &state->controllers;
+  wmXrController *c;
+
+  while ((c = BLI_pophead(lb))) {
+    if (c->model) {
+      GPU_batch_discard(c->model);
+    }
+    BLI_freelinkN(lb, c);
+  }
+}
+
+static void wm_xr_session_data_free(wmXrSessionState *state)
+{
+  BLI_freelistN(&state->eyes);
+  wm_xr_session_controller_data_free(state);
+}
+
 static void wm_xr_session_exit_cb(void *customdata)
 {
   wmXrData *xr_data = customdata;
@@ -141,28 +160,10 @@ static void wm_xr_session_exit_cb(void *customdata)
   }
 
   /* Free the entire runtime data (including session state and context), to play safe. */
+  wm_xr_session_data_free(state);
   wm_xr_runtime_data_free(&xr_data->runtime);
 }
 
-static void wm_xr_session_controller_data_free(wmXrSessionState *state)
-{
-  ListBase *lb = &state->controllers;
-  wmXrController *c;
-
-  while ((c = BLI_pophead(lb))) {
-    if (c->model) {
-      GPU_batch_discard(c->model);
-    }
-    BLI_freelinkN(lb, c);
-  }
-}
-
-void wm_xr_session_data_free(wmXrSessionState *state)
-{
-  BLI_freelistN(&state->eyes);
-  wm_xr_session_controller_data_free(state);
-}
-
 static void wm_xr_session_begin_info_create(wmXrData *xr_data,
                                             GHOST_XrSessionBeginInfo *r_begin_info)
 {



More information about the Bf-blender-cvs mailing list