[Bf-blender-cvs] [867007d9d7d] soc-2019-openxr: Set up OpenXR compositing layers for drawing

Julian Eisel noreply at git.blender.org
Mon Jun 24 16:47:20 CEST 2019


Commit: 867007d9d7d01bcc77bedbdee5d3f04c22e4b339
Author: Julian Eisel
Date:   Mon Jun 24 16:44:43 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rB867007d9d7d01bcc77bedbdee5d3f04c22e4b339

Set up OpenXR compositing layers for drawing

That should be one of the last steps to prepare pushing pixels to HMDs.
Fingers crossed!

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

M	intern/ghost/GHOST_C-api.h
M	intern/ghost/intern/GHOST_XRSession.cpp
M	intern/ghost/intern/GHOST_XR_intern.h
M	release/scripts/addons
M	release/scripts/addons_contrib
M	source/blender/windowmanager/intern/wm_xr.c
M	source/tools

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

diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h
index 0912fdf8168..40a711b207d 100644
--- a/intern/ghost/GHOST_C-api.h
+++ b/intern/ghost/GHOST_C-api.h
@@ -1015,8 +1015,6 @@ 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);
 void GHOST_XrSessionDrawViews(struct GHOST_XrContext *xr_context);
 
 /* events */
diff --git a/intern/ghost/intern/GHOST_XRSession.cpp b/intern/ghost/intern/GHOST_XRSession.cpp
index 1ae4e4b7533..11bd65b20fe 100644
--- a/intern/ghost/intern/GHOST_XRSession.cpp
+++ b/intern/ghost/intern/GHOST_XRSession.cpp
@@ -177,6 +177,7 @@ void GHOST_XrSessionRenderingPrepare(GHOST_XrContext *xr_context)
 
   xrEnumerateViewConfigurationViews(
       oxr->instance, oxr->system_id, oxr->view_type, 0, &view_count, nullptr);
+  view_configs.resize(view_count, {XR_TYPE_VIEW_CONFIGURATION_VIEW});
   xrEnumerateViewConfigurationViews(oxr->instance,
                                     oxr->system_id,
                                     oxr->view_type,
@@ -188,13 +189,16 @@ void GHOST_XrSessionRenderingPrepare(GHOST_XrContext *xr_context)
     XrSwapchain swapchain = swapchain_create(oxr->session, xr_context->gpu_binding.get(), &view);
     auto images = swapchain_images_create(swapchain, xr_context->gpu_binding.get());
 
+    oxr->swapchain_image_width = view.recommendedImageRectWidth;
+    oxr->swapchain_image_height = view.recommendedImageRectHeight;
+    oxr->swapchains.push_back(swapchain);
     oxr->swapchain_images.insert(std::make_pair(swapchain, std::move(images)));
   }
 
   oxr->views.resize(view_count, {XR_TYPE_VIEW});
 }
 
-void GHOST_XrSessionBeginDrawing(GHOST_XrContext *xr_context)
+static void drawing_begin(GHOST_XrContext *xr_context)
 {
   OpenXRData *oxr = &xr_context->oxr;
   XrFrameWaitInfo wait_info{XR_TYPE_FRAME_WAIT_INFO};
@@ -210,22 +214,88 @@ void GHOST_XrSessionBeginDrawing(GHOST_XrContext *xr_context)
   xr_context->draw_frame->frame_state = frame_state;
 }
 
-void GHOST_XrSessionEndDrawing(GHOST_XrContext *xr_context)
+void drawing_end(GHOST_XrContext *xr_context, std::vector<XrCompositionLayerBaseHeader *> *layers)
 {
   XrFrameEndInfo end_info{XR_TYPE_FRAME_END_INFO};
 
+  end_info.displayTime = xr_context->draw_frame->frame_state.predictedDisplayTime;
+  end_info.environmentBlendMode = XR_ENVIRONMENT_BLEND_MODE_OPAQUE;
+  end_info.layerCount = layers->size();
+  end_info.layers = layers->data();
+
   xrEndFrame(xr_context->oxr.session, &end_info);
   xr_context->draw_frame = nullptr;
 }
 
-void GHOST_XrSessionDrawViews(GHOST_XrContext *xr_context)
+static void draw_view(OpenXRData *oxr,
+                      XrSwapchain swapchain,
+                      XrCompositionLayerProjectionView &proj_layer_view,
+                      XrView &view)
+{
+  XrSwapchainImageAcquireInfo acquire_info{XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO};
+  XrSwapchainImageWaitInfo wait_info{XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO};
+  XrSwapchainImageReleaseInfo release_info{XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO};
+  XrSwapchainImageBaseHeader *swapchain_image;
+  uint32_t swapchain_idx;
+
+  xrAcquireSwapchainImage(swapchain, &acquire_info, &swapchain_idx);
+  wait_info.timeout = XR_INFINITE_DURATION;
+  xrWaitSwapchainImage(swapchain, &wait_info);
+
+  proj_layer_view.type = XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW;
+  proj_layer_view.pose = view.pose;
+  proj_layer_view.fov = view.fov;
+  proj_layer_view.subImage.swapchain = swapchain;
+  proj_layer_view.subImage.imageRect.offset = {0, 0};
+  proj_layer_view.subImage.imageRect.extent = {oxr->swapchain_image_width,
+                                               oxr->swapchain_image_height};
+
+  swapchain_image = oxr->swapchain_images[swapchain][swapchain_idx];
+
+  //    xr_context->draw_view_fn();
+
+  xrReleaseSwapchainImage(swapchain, &release_info);
+}
+
+static XrCompositionLayerProjection draw_layer(GHOST_XrContext *xr_context,
+                                               OpenXRData *oxr,
+                                               XrSpace space)
 {
-  OpenXRData *oxr = &xr_context->oxr;
   XrViewLocateInfo viewloc_info{XR_TYPE_VIEW_LOCATE_INFO};
   XrViewState view_state{XR_TYPE_VIEW_STATE};
+  XrCompositionLayerProjection layer{XR_TYPE_COMPOSITION_LAYER_PROJECTION};
+  std::vector<XrCompositionLayerProjectionView> proj_layer_views;
+  uint32_t view_count;
+
+  viewloc_info.displayTime = xr_context->draw_frame->frame_state.predictedDisplayTime;
+  viewloc_info.space = space;
+
+  xrLocateViews(
+      oxr->session, &viewloc_info, &view_state, oxr->views.size(), &view_count, oxr->views.data());
+  assert(oxr->swapchains.size() == view_count);
+
+  proj_layer_views.resize(view_count);
+
+  for (uint32_t view_idx = 0; view_idx < view_count; view_idx++) {
+    draw_view(oxr, oxr->swapchains[view_idx], proj_layer_views[view_idx], oxr->views[view_idx]);
+  }
+
+  layer.space = space;
+  layer.viewCount = proj_layer_views.size();
+  layer.views = proj_layer_views.data();
+
+  return layer;
+}
+
+void GHOST_XrSessionDrawViews(GHOST_XrContext *xr_context)
+{
+  OpenXRData *oxr = &xr_context->oxr;
   XrReferenceSpaceCreateInfo refspace_info{XR_TYPE_REFERENCE_SPACE_CREATE_INFO};
+  XrCompositionLayerProjection proj_layer;
+  std::vector<XrCompositionLayerBaseHeader *> layers;
   XrSpace space;
-  uint32_t view_count;
+
+  drawing_begin(xr_context);
 
   refspace_info.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_LOCAL;
   // TODO Use viewport pose here.
@@ -233,9 +303,8 @@ void GHOST_XrSessionDrawViews(GHOST_XrContext *xr_context)
   refspace_info.poseInReferenceSpace.orientation = {0.0f, 0.0f, 0.0f, 1.0f};
   xrCreateReferenceSpace(oxr->session, &refspace_info, &space);
 
-  viewloc_info.displayTime = xr_context->draw_frame->frame_state.predictedDisplayTime;
-  viewloc_info.space = space;
+  proj_layer = draw_layer(xr_context, oxr, space);
+  layers.push_back(reinterpret_cast<XrCompositionLayerBaseHeader *>(&proj_layer));
 
-  xrLocateViews(
-      oxr->session, &viewloc_info, &view_state, oxr->views.size(), &view_count, oxr->views.data());
+  drawing_end(xr_context, &layers);
 }
diff --git a/intern/ghost/intern/GHOST_XR_intern.h b/intern/ghost/intern/GHOST_XR_intern.h
index 5daeb79cab9..83205ec28dd 100644
--- a/intern/ghost/intern/GHOST_XR_intern.h
+++ b/intern/ghost/intern/GHOST_XR_intern.h
@@ -41,7 +41,9 @@ typedef struct OpenXRData {
   XrSession session;
   XrSessionState session_state;
 
+  std::vector<XrSwapchain> swapchains;
   std::map<XrSwapchain, std::vector<XrSwapchainImageBaseHeader *>> swapchain_images;
+  int32_t swapchain_image_width, swapchain_image_height;
 } OpenXRData;
 
 typedef struct GHOST_XrContext {
diff --git a/release/scripts/addons b/release/scripts/addons
index a5a236df5f6..0e53a9a3867 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit a5a236df5f6630ea17958e3006070ef609c6a4b8
+Subproject commit 0e53a9a38672790d5fbb9a1d4a935980824d4a84
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 5781362d811..e83541d42c7 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 5781362d811bb4a99bee4e38a9d3a69813a8dd04
+Subproject commit e83541d42c71bfb689acf9a53a6eb66b0c190451
diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index c53e021d5f6..73f925aa7db 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -25,8 +25,6 @@ void wm_xr_session_draw(struct GHOST_XrContext *xr_context)
   if (!GHOST_XrSessionIsRunning(xr_context)) {
     return;
   }
-  GHOST_XrSessionBeginDrawing(xr_context);
   // TODO session visible?
   GHOST_XrSessionDrawViews(xr_context);
-  GHOST_XrSessionEndDrawing(xr_context);
 }
diff --git a/source/tools b/source/tools
index 33d3969202b..eb406b701d5 160000
--- a/source/tools
+++ b/source/tools
@@ -1 +1 @@
-Subproject commit 33d3969202b855305a9823a9bc67a1d56e4546c2
+Subproject commit eb406b701d5a251818e425fec489417477019d61



More information about the Bf-blender-cvs mailing list