[Bf-blender-cvs] [3fa7d59a04f] soc-2019-openxr: Fail without crashing if no runtime is found

Julian Eisel noreply at git.blender.org
Mon Jun 17 01:25:13 CEST 2019


Commit: 3fa7d59a04ffe3178e536ebb05ee5bde91a88b2b
Author: Julian Eisel
Date:   Mon Jun 17 01:24:07 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rB3fa7d59a04ffe3178e536ebb05ee5bde91a88b2b

Fail without crashing if no runtime is found

For now simply do nothing. Plan is to work on proper error handling and
reporting later.

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

M	source/blender/windowmanager/intern/wm_operators.c
M	source/blender/windowmanager/xr/intern/wm_xr.c
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

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

diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 712f8f76ba8..26ca96ecaef 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -3649,6 +3649,10 @@ static int xr_session_toggle_exec(bContext *C, wmOperator *UNUSED(op))
   wmWindowManager *wm = CTX_wm_manager(C);
   struct wmXRContext *xr_context = wm->xr_context;
 
+  if (xr_context == NULL) {
+    return OPERATOR_CANCELLED;
+  }
+
   if (wm_xr_session_is_running(xr_context)) {
     wm_xr_session_end(xr_context);
   }
diff --git a/source/blender/windowmanager/xr/intern/wm_xr.c b/source/blender/windowmanager/xr/intern/wm_xr.c
index 8b9b9acd064..c692ae60d5b 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr.c
@@ -43,18 +43,20 @@
 /**
  * \param layer_name May be NULL for extensions not belonging to a specific layer.
  */
-static void openxr_gather_extensions_ex(OpenXRData *oxr, const char *layer_name)
+static bool openxr_gather_extensions_ex(OpenXRData *oxr, const char *layer_name)
 {
   uint32_t extension_count = 0;
 
   oxr->extensions = NULL;
 
   /* Get count for array creation/init first. */
-  xrEnumerateInstanceExtensionProperties(layer_name, 0, &extension_count, NULL);
+  if (XR_FAILED(xrEnumerateInstanceExtensionProperties(layer_name, 0, &extension_count, NULL))) {
+    return false;
+  }
 
   if (extension_count == 0) {
-    /* Extensions are optional, can safely exit. */
-    return;
+    /* Extensions are optional, can successfully exit. */
+    return true;
   }
 
   oxr->extensions = MEM_calloc_arrayN(
@@ -77,22 +79,26 @@ static void openxr_gather_extensions_ex(OpenXRData *oxr, const char *layer_name)
     printf("Extension: %s\n", oxr->extensions[i].extensionName);
   }
 #endif
+
+  return true;
 }
-static void openxr_gather_extensions(OpenXRData *oxr)
+static bool openxr_gather_extensions(OpenXRData *oxr)
 {
-  openxr_gather_extensions_ex(oxr, NULL);
+  return openxr_gather_extensions_ex(oxr, NULL);
 }
 
-static void openxr_gather_api_layers(OpenXRData *oxr)
+static bool openxr_gather_api_layers(OpenXRData *oxr)
 {
   uint32_t layer_count = 0;
 
   /* Get count for array creation/init first. */
-  xrEnumerateApiLayerProperties(0, &layer_count, NULL);
+  if (XR_FAILED(xrEnumerateApiLayerProperties(0, &layer_count, NULL))) {
+    return false;
+  }
 
   if (layer_count == 0) {
     /* Layers are optional, can safely exit. */
-    return;
+    return true;
   }
 
   oxr->layers = MEM_calloc_arrayN(layer_count, sizeof(*oxr->layers), "XrApiLayerProperties");
@@ -110,6 +116,8 @@ static void openxr_gather_api_layers(OpenXRData *oxr)
     /* Each layer may have own extensions */
     openxr_gather_extensions_ex(oxr, oxr->layers[i].layerName);
   }
+
+  return true;
 }
 
 ATTR_NONNULL()
@@ -248,8 +256,10 @@ wmXRContext *wm_xr_context_create(const wmXRContextCreateInfo *create_info)
 #ifdef USE_EXT_LAYER_PRINTS
   puts("Available OpenXR layers/extensions:");
 #endif
-  openxr_gather_api_layers(oxr);
-  openxr_gather_extensions(oxr);
+  if (!openxr_gather_api_layers(oxr) || !openxr_gather_extensions(oxr)) {
+    MEM_freeN(xr_context);
+    return NULL;
+  }
 #ifdef USE_EXT_LAYER_PRINTS
   puts("Done printing OpenXR layers/extensions.");
 #endif
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c
index d5c4292b9b1..02e6dddfbda 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_session.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c
@@ -38,13 +38,8 @@
 
 bool wm_xr_session_is_running(const wmXRContext *xr_context)
 {
-  const OpenXRData *oxr = &xr_context->oxr;
-
-  if (oxr->session == XR_NULL_HANDLE) {
-    return false;
-  }
-
-  return ELEM(oxr->session_state,
+  return (xr_context != NULL) && (xr_context->oxr.session != XR_NULL_HANDLE) &&
+         ELEM(xr_context->oxr.session_state,
               XR_SESSION_STATE_RUNNING,
               XR_SESSION_STATE_VISIBLE,
               XR_SESSION_STATE_FOCUSED);



More information about the Bf-blender-cvs mailing list