[Bf-blender-cvs] [5e642bfea17] soc-2019-openxr: Initial session state handling

Julian Eisel noreply at git.blender.org
Wed Jun 5 17:03:31 CEST 2019


Commit: 5e642bfea1722a78aa61854516428d42985cc45a
Author: Julian Eisel
Date:   Wed Jun 5 16:55:51 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rB5e642bfea1722a78aa61854516428d42985cc45a

Initial session state handling

To correctly start a session, a graphics extension specific object needs
to be passed to the OpenXR runtime. E.g. for the Windows Mixed Reality
runtime, XrGraphicsBindingD3D11KHR needs to be passed with a valid
DirectX device. Since we don't have any DirectX compatibility working,
I can't test this on Windows yet.
So to test this I finally need to get Monado to work on Linux and
correctly setup the OpenGL extension there.

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

M	source/blender/windowmanager/intern/wm_xr.c

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

diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index 8e7b48b6154..aad27fb3be0 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -60,6 +60,7 @@ typedef struct wmXRContext {
 
     XrSystemId system_id;
     XrSession session;
+    XrSessionState session_state;
   } oxr;
 } wmXRContext;
 
@@ -217,6 +218,8 @@ wmXRContext *wm_xr_context_create(void)
 {
   wmXRContext *xr_context = MEM_callocN(sizeof(*xr_context), "wmXRContext");
 
+  xr_context->oxr.session_state = XR_SESSION_STATE_UNKNOWN;
+
   BLI_assert(xr_context->oxr.instance == XR_NULL_HANDLE);
   openxr_instance_setup(xr_context);
   openxr_instance_log_print(xr_context);
@@ -237,7 +240,14 @@ void wm_xr_context_destroy(wmXRContext *xr_context)
 
 bool wm_xr_session_is_running(const wmXRContext *xr_context)
 {
-  return xr_context->oxr.session != XR_NULL_HANDLE;
+  if (xr_context->oxr.session == XR_NULL_HANDLE) {
+    return false;
+  }
+
+  return ELEM(xr_context->oxr.session_state,
+              XR_SESSION_STATE_RUNNING,
+              XR_SESSION_STATE_VISIBLE,
+              XR_SESSION_STATE_FOCUSED);
 }
 
 /**
@@ -264,6 +274,9 @@ void wm_xr_session_start(wmXRContext *xr_context)
 
   XrSessionCreateInfo create_info = {.type = XR_TYPE_SESSION_CREATE_INFO};
   create_info.systemId = xr_context->oxr.system_id;
+  /* TODO .next needs to point to graphics extension structure  XrGraphicsBindingFoo */
+  // create_info.next = ;
+
   xrCreateSession(xr_context->oxr.instance, &create_info, &xr_context->oxr.session);
 }
 
@@ -276,10 +289,20 @@ void wm_xr_session_end(wmXRContext *xr_context)
 static void wm_xr_session_state_change(wmXRContext *xr_context,
                                        const XrEventDataSessionStateChanged *lifecycle)
 {
+  xr_context->oxr.session_state = lifecycle->type;
+
   switch (lifecycle->type) {
     case XR_SESSION_STATE_READY: {
+      XrSessionBeginInfo begin_info = {
+          .type = XR_TYPE_SESSION_BEGIN_INFO,
+          .primaryViewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO};
+      xrBeginSession(xr_context->oxr.session, &begin_info);
       break;
     }
+    case XR_SESSION_STATE_STOPPING: {
+      BLI_assert(xr_context->oxr.session != XR_NULL_HANDLE);
+      xrEndSession(xr_context->oxr.session);
+    }
   }
 }
 
@@ -296,6 +319,10 @@ bool wm_xr_events_handle(wmXRContext *xr_context)
 {
   XrEventDataBuffer event_buffer; /* structure big enought to hold all possible events */
 
+  if (!wm_xr_session_is_running(xr_context)) {
+    return false;
+  }
+
   while (wm_xr_event_poll_next(xr_context, &event_buffer)) {
     XrEventDataBaseHeader *event = (XrEventDataBaseHeader *)&event_buffer; /* base event struct */



More information about the Bf-blender-cvs mailing list