[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