Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Eisel <eiseljulian@gmail.com>2019-06-01 18:11:18 +0300
committerJulian Eisel <eiseljulian@gmail.com>2019-06-01 18:16:49 +0300
commit5d5ad5d6dd646429f63001f773694ae73674f74b (patch)
treee9ce9384e83c95635c19ade71458fb8f56c25146 /source/blender/windowmanager/intern/wm_xr.c
parente70894c3600959243d698727461f990b72c6561c (diff)
Gather available OpenXR extensions and API-layers on OpenXR setup
We don't actually enable any extension or layer yet. We just put their names into arrays and print them. The printing can be disabled via a compiler define, later we should put them behind a proper logging/debugging mechanism (CLOG). Also fixes a Visual Studio compile error.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_xr.c')
-rw-r--r--source/blender/windowmanager/intern/wm_xr.c115
1 files changed, 109 insertions, 6 deletions
diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index e3e1becfa65..dbefcde3c67 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -40,6 +40,10 @@
#include "WM_types.h"
#include "wm.h"
+/* Toggle printing of available OpenXR extensions and API-layers. Should probably be changed to use
+ * CLOG at some point */
+#define USE_EXT_LAYER_PRINTS
+
#if !defined(WITH_OPENXR)
static_assert(false, "WITH_OPENXR not defined, but wm_xr.c is being compiled.");
#endif
@@ -47,23 +51,120 @@ static_assert(false, "WITH_OPENXR not defined, but wm_xr.c is being compiled.");
typedef struct wmXRContext {
struct OpenXRData {
XrInstance instance;
+
+ XrExtensionProperties *extensions;
+ uint32_t extension_count;
+
+ XrApiLayerProperties *layers;
+ uint32_t layer_count;
} oxr;
} wmXRContext;
-wmXRContext *wm_xr_context_create(void)
+/**
+ * \param layer_name May be NULL for extensions not belonging to a specific layer.
+ */
+static void openxr_gather_extensions_ex(wmXRContext *context, const char *layer_name)
{
- XrInstanceCreateInfo create_info = {.type = XR_TYPE_INSTANCE_CREATE_INFO};
- XrInstance instance = {0};
+ uint32_t extension_count;
- wmXRContext *wm_context = MEM_callocN(sizeof(*wm_context), "wmXRContext");
+ context->oxr.extensions = NULL;
- BLI_assert(wm_context->oxr.instance == XR_NULL_HANDLE);
+ /* Get count for array creation/init first. */
+ xrEnumerateInstanceExtensionProperties(layer_name, 0, &extension_count, NULL);
+
+ if (extension_count == 0) {
+ /* Extensions are optional, can safely exit. */
+ return;
+ }
+
+ context->oxr.extensions = MEM_calloc_arrayN(
+ extension_count, sizeof(*context->oxr.extensions), "xrExtensionProperties");
+ for (int i = 0; i < extension_count; i++) {
+ context->oxr.extensions[i].type = XR_TYPE_EXTENSION_PROPERTIES;
+ }
+
+#ifdef USE_EXT_LAYER_PRINTS
+ if (layer_name) {
+ printf("Layer: %s\n", layer_name);
+ }
+#endif
+ /* Actually get the extensions. */
+ xrEnumerateInstanceExtensionProperties(
+ layer_name, extension_count, &extension_count, context->oxr.extensions);
+#ifdef USE_EXT_LAYER_PRINTS
+ for (int i = 0; i < extension_count; i++) {
+ printf("Extension: %s\n", context->oxr.extensions[i].extensionName);
+ }
+#endif
+}
+static void openxr_gather_extensions(wmXRContext *context)
+{
+ openxr_gather_extensions_ex(context, NULL);
+}
+
+static void openxr_gather_api_layers(wmXRContext *context)
+{
+ uint32_t layer_count;
+
+ /* Get count for array creation/init first. */
+ xrEnumerateApiLayerProperties(0, &layer_count, NULL);
+
+ if (layer_count == 0) {
+ /* Layers are optional, can safely exit. */
+ return;
+ }
+
+ context->oxr.layers = MEM_calloc_arrayN(
+ layer_count, sizeof(*context->oxr.layers), "XrApiLayerProperties");
+ for (int i = 0; i < layer_count; i++) {
+ context->oxr.layers[i].type = XR_TYPE_API_LAYER_PROPERTIES;
+ }
+
+ /* Actually get the layers. */
+ xrEnumerateApiLayerProperties(layer_count, &layer_count, context->oxr.layers);
+ for (int i = 0; i < layer_count; i++) {
+#ifdef USE_EXT_LAYER_PRINTS
+ printf("Layer: %s\n", context->oxr.layers[i]);
+#endif
+ /* Each layer may have own extensions */
+ openxr_gather_extensions_ex(context, context->oxr.layers[i].layerName);
+ }
+}
+
+static bool openxr_instance_setup(wmXRContext *context) ATTR_NONNULL()
+{
+ XrInstanceCreateInfo create_info = {.type = XR_TYPE_INSTANCE_CREATE_INFO};
+
+#ifdef USE_EXT_LAYER_PRINTS
+ puts("Available OpenXR layers/extensions:");
+#endif
+ openxr_gather_api_layers(context);
+ openxr_gather_extensions(context);
+#ifdef USE_EXT_LAYER_PRINTS
+ puts("Done printing OpenXR layers/extensions.");
+#endif
BLI_strncpy(
create_info.applicationInfo.applicationName, "Blender", XR_MAX_APPLICATION_NAME_SIZE);
create_info.applicationInfo.apiVersion = XR_CURRENT_API_VERSION;
+ // create_info.enabledExtensionCount = 1;
+ create_info.enabledExtensionCount = 0;
+ static const uchar *enabled_extensions[] = {// "XR_KHR_D3D11_enable",
+ // "XR_KHR_opengl_enable"
+ ""};
+ create_info.enabledExtensionNames = enabled_extensions;
- xrCreateInstance(&create_info, &instance);
+ xrCreateInstance(&create_info, &context->oxr.instance);
+
+ return true;
+}
+
+wmXRContext *wm_xr_context_create(void)
+{
+ wmXRContext *wm_context = MEM_callocN(sizeof(*wm_context), "wmXRContext");
+
+ BLI_assert(wm_context->oxr.instance == XR_NULL_HANDLE);
+ openxr_instance_setup(wm_context);
return wm_context;
}
@@ -71,5 +172,7 @@ wmXRContext *wm_xr_context_create(void)
void wm_xr_context_destroy(wmXRContext *wm_context)
{
xrDestroyInstance(wm_context->oxr.instance);
+ MEM_SAFE_FREE(wm_context->oxr.extensions);
+ MEM_SAFE_FREE(wm_context->oxr.layers);
MEM_SAFE_FREE(wm_context);
}