[Bf-blender-cvs] [8a676e8fa98] soc-2019-openxr: Execute necessary OpenXR frame timing calls

Julian Eisel noreply at git.blender.org
Sun Jun 23 13:49:50 CEST 2019


Commit: 8a676e8fa982364d21cc640efa897799f0e390b3
Author: Julian Eisel
Date:   Sun Jun 23 13:47:42 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rB8a676e8fa982364d21cc640efa897799f0e390b3

Execute necessary OpenXR frame timing calls

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

M	intern/ghost/GHOST_C-api.h
M	intern/ghost/intern/GHOST_XRSession.cpp
M	source/blender/windowmanager/intern/wm_draw.c

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

diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h
index fce56fd58ef..9527e12f975 100644
--- a/intern/ghost/GHOST_C-api.h
+++ b/intern/ghost/GHOST_C-api.h
@@ -1007,6 +1007,8 @@ GHOST_TSuccess GHOST_XrSessionIsRunning(const struct GHOST_XrContext *xr_context
 void GHOST_XrSessionStart(struct GHOST_XrContext *xr_context);
 void GHOST_XrSessionEnd(struct GHOST_XrContext *xr_context);
 void GHOST_XrSessionRenderingPrepare(struct GHOST_XrContext *xr_context);
+void GHOST_XrSessionBeginDrawing(struct GHOST_XrContext *xr_context);
+void GHOST_XrSessionEndDrawing(struct GHOST_XrContext *xr_context);
 
 /* events */
 GHOST_TSuccess GHOST_XrEventsHandle(struct GHOST_XrContext *xr_context);
diff --git a/intern/ghost/intern/GHOST_XRSession.cpp b/intern/ghost/intern/GHOST_XRSession.cpp
index 399c0fbc065..58f84313eaa 100644
--- a/intern/ghost/intern/GHOST_XRSession.cpp
+++ b/intern/ghost/intern/GHOST_XRSession.cpp
@@ -188,3 +188,23 @@ void GHOST_XrSessionRenderingPrepare(GHOST_XrContext *xr_context)
     oxr->swapchain_images.insert(std::make_pair(swapchain, std::move(images)));
   }
 }
+
+void GHOST_XrSessionBeginDrawing(GHOST_XrContext *xr_context)
+{
+  OpenXRData *oxr = &xr_context->oxr;
+  XrFrameWaitInfo wait_info{XR_TYPE_FRAME_WAIT_INFO};
+  XrFrameState state_info{XR_TYPE_FRAME_STATE};
+  XrFrameBeginInfo begin_info{XR_TYPE_FRAME_BEGIN_INFO};
+
+  // TODO Blocking call. Does this intefer with other drawing?
+  xrWaitFrame(oxr->session, &wait_info, &state_info);
+
+  xrBeginFrame(oxr->session, &begin_info);
+}
+
+void GHOST_XrSessionEndDrawing(GHOST_XrContext *xr_context)
+{
+  XrFrameEndInfo end_info{XR_TYPE_FRAME_END_INFO};
+
+  xrEndFrame(xr_context->oxr.session, &end_info);
+}
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index 7fa1b16a425..bab16a0d49c 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -864,6 +864,26 @@ static void wm_draw_window(bContext *C, wmWindow *win)
   screen->do_draw = false;
 }
 
+/**
+ * Draw offscreen contexts not bound to a specific window.
+ *
+ * For now keeping it simple by handling all possible cases here directly (only VR view drawing
+ * currently). Could generalize this by something like a wmSurface type.
+ */
+static void wm_draw_non_window_surfaces(wmWindowManager *wm)
+{
+#ifdef WITH_OPENXR
+  if (wm->xr_context && GHOST_XrSessionIsRunning(wm->xr_context)) {
+    GHOST_XrSessionBeginDrawing(wm->xr_context);
+    /* TODO execute drawcall. Something like this? */
+    // ED_XR_view_draw();
+    GHOST_XrSessionEndDrawing(wm->xr_context);
+  }
+#else
+  UNUSED_VARS(wm);
+#endif
+}
+
 /****************** main update call **********************/
 
 /* quick test to prevent changing window drawable */
@@ -975,6 +995,8 @@ void wm_draw_update(bContext *C)
       CTX_wm_window_set(C, NULL);
     }
   }
+
+  wm_draw_non_window_surfaces(wm);
 }
 
 void wm_draw_region_clear(wmWindow *win, ARegion *UNUSED(ar))



More information about the Bf-blender-cvs mailing list