[Bf-blender-cvs] [31b8350b017] soc-2019-openxr: Cleanup: Refactor (hacky) swapchain image submission

Julian Eisel noreply at git.blender.org
Sat Aug 24 03:32:40 CEST 2019


Commit: 31b8350b017dd6841656348f040e03d237883e09
Author: Julian Eisel
Date:   Sat Aug 24 03:27:41 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rB31b8350b017dd6841656348f040e03d237883e09

Cleanup: Refactor (hacky) swapchain image submission

Code now assumes that the view-draw callback left the OpenGL state for
ongoing use by Ghost-XR. So the state doesn't have to be set by the
swapchain image submission and thus it we don't need to pass the Ghost
OpenGL context to it in a hacky way.
Also, rename drawViewEnd (to submitToSwapchain) and remove
drawViewBegin.

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

M	intern/ghost/GHOST_Types.h
M	intern/ghost/intern/GHOST_IXrGraphicsBinding.h
M	intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
M	intern/ghost/intern/GHOST_XrSession.cpp
M	source/blender/windowmanager/intern/wm_xr.c

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

diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h
index ede2de1f6da..9d2af3216ed 100644
--- a/intern/ghost/GHOST_Types.h
+++ b/intern/ghost/GHOST_Types.h
@@ -634,10 +634,7 @@ typedef void (*GHOST_XrErrorHandlerFn)(const GHOST_XrError *);
 typedef void *(*GHOST_XrGraphicsContextBindFn)(GHOST_TXrGraphicsBinding graphics_lib);
 typedef void (*GHOST_XrGraphicsContextUnbindFn)(GHOST_TXrGraphicsBinding graphics_lib,
                                                 void *graphics_context);
-/* XXX hacky: returns GHOST_ContextHandle so DirectX binding can get a handle to the OpenGL
- * offscreen context. */
-typedef GHOST_ContextHandle (*GHOST_XrDrawViewFn)(const GHOST_XrDrawViewInfo *draw_view,
-                                                  void *customdata);
+typedef void (*GHOST_XrDrawViewFn)(const GHOST_XrDrawViewInfo *draw_view, void *customdata);
 
 #endif
 
diff --git a/intern/ghost/intern/GHOST_IXrGraphicsBinding.h b/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
index 8470827c2dd..93eca1aa243 100644
--- a/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
+++ b/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
@@ -57,10 +57,8 @@ class GHOST_IXrGraphicsBinding {
                                      int64_t *r_result) const = 0;
   virtual std::vector<XrSwapchainImageBaseHeader *> createSwapchainImages(
       uint32_t image_count) = 0;
-  virtual void drawViewBegin(XrSwapchainImageBaseHeader *swapchain_image) = 0;
-  virtual void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image,
-                           const GHOST_XrDrawViewInfo *draw_info,
-                           class GHOST_Context *ogl_ctx) = 0;
+  virtual void submitToSwapchain(XrSwapchainImageBaseHeader *swapchain_image,
+                                 const GHOST_XrDrawViewInfo *draw_info) = 0;
 
  protected:
   /* Use GHOST_XrGraphicsBindingCreateFromType */
diff --git a/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
index 33803ca687b..c425199c983 100644
--- a/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
+++ b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
@@ -143,12 +143,8 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
     return base_images;
   }
 
-  void drawViewBegin(XrSwapchainImageBaseHeader * /*swapchain_image*/) override
-  {
-  }
-  void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image,
-                   const GHOST_XrDrawViewInfo *draw_info,
-                   GHOST_Context * /*ogl_ctx*/) override
+  void submitToSwapchain(XrSwapchainImageBaseHeader *swapchain_image,
+                         const GHOST_XrDrawViewInfo *draw_info) override
   {
     XrSwapchainImageOpenGLKHR *ogl_swapchain_image = reinterpret_cast<XrSwapchainImageOpenGLKHR *>(
         swapchain_image);
@@ -243,12 +239,8 @@ class GHOST_XrGraphicsBindingD3D : public GHOST_IXrGraphicsBinding {
     return base_images;
   }
 
-  void drawViewBegin(XrSwapchainImageBaseHeader * /*swapchain_image*/) override
-  {
-  }
-  void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image,
-                   const GHOST_XrDrawViewInfo *draw_info,
-                   GHOST_Context *ogl_ctx) override
+  void submitToSwapchain(XrSwapchainImageBaseHeader *swapchain_image,
+                         const GHOST_XrDrawViewInfo *draw_info) override
   {
     XrSwapchainImageD3D11KHR *d3d_swapchain_image = reinterpret_cast<XrSwapchainImageD3D11KHR *>(
         swapchain_image);
diff --git a/intern/ghost/intern/GHOST_XrSession.cpp b/intern/ghost/intern/GHOST_XrSession.cpp
index 52db74ded5b..debd86e4e48 100644
--- a/intern/ghost/intern/GHOST_XrSession.cpp
+++ b/intern/ghost/intern/GHOST_XrSession.cpp
@@ -448,7 +448,6 @@ void GHOST_XrSession::drawView(XrSwapchain swapchain,
   XrSwapchainImageReleaseInfo release_info{XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO};
   XrSwapchainImageBaseHeader *swapchain_image;
   GHOST_XrDrawViewInfo draw_view_info{};
-  GHOST_ContextHandle draw_ctx;
   uint32_t swapchain_idx;
 
   CHECK_XR(xrAcquireSwapchainImage(swapchain, &acquire_info, &swapchain_idx),
@@ -474,9 +473,8 @@ void GHOST_XrSession::drawView(XrSwapchain swapchain,
   draw_view_info.height = proj_layer_view.subImage.imageRect.extent.height;
   ghost_xr_draw_view_info_from_view(view, draw_view_info);
 
-  m_gpu_binding->drawViewBegin(swapchain_image);
-  draw_ctx = m_context->getCustomFuncs()->draw_view_fn(&draw_view_info, draw_customdata);
-  m_gpu_binding->drawViewEnd(swapchain_image, &draw_view_info, (GHOST_Context *)draw_ctx);
+  m_context->getCustomFuncs()->draw_view_fn(&draw_view_info, draw_customdata);
+  m_gpu_binding->submitToSwapchain(swapchain_image, &draw_view_info);
 
   CHECK_XR(xrReleaseSwapchainImage(swapchain, &release_info),
            "Failed to release swapchain image used to submit VR session frame.");
diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index 2ee75be9cf3..0bd5628d708 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -75,7 +75,7 @@ typedef struct {
   bContext *evil_C;
 } wmXrErrorHandlerData;
 
-GHOST_ContextHandle wm_xr_draw_view(const GHOST_XrDrawViewInfo *, void *);
+void wm_xr_draw_view(const GHOST_XrDrawViewInfo *, void *);
 void *wm_xr_session_gpu_binding_context_create(GHOST_TXrGraphicsBinding);
 void wm_xr_session_gpu_binding_context_destroy(GHOST_TXrGraphicsBinding, void *);
 wmSurface *wm_xr_session_surface_create(wmWindowManager *, unsigned int);
@@ -444,7 +444,7 @@ static void wm_xr_draw_matrices_create(const Scene *scene,
  * This is the main viewport drawing function for VR sessions. It's assigned to Ghost-XR as a
  * callback (see GHOST_XrDrawViewFunc()) and executed for each view (read: eye).
  */
-GHOST_ContextHandle wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata)
+void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata)
 {
   bContext *C = customdata;
   wmXrSurfaceData *surface_data = g_xr_surface->customdata;
@@ -461,7 +461,7 @@ GHOST_ContextHandle wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void
   wm_xr_draw_matrices_create(CTX_data_scene(C), draw_view, clip_start, clip_end, viewmat, winmat);
 
   if (!wm_xr_session_surface_offscreen_ensure(draw_view)) {
-    return NULL;
+    return;
   }
 
   offscreen = surface_data->offscreen;
@@ -512,8 +512,6 @@ GHOST_ContextHandle wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void
   /* Leave viewport bound so GHOST_Xr can use its context/framebuffer, its unbound in
    * wm_xr_session_surface_draw(). */
   // GPU_viewport_unbind(viewport);
-
-  return g_xr_surface->ghost_ctx;
 }
 
 /** \} */ /* XR Drawing */



More information about the Bf-blender-cvs mailing list