[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