[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