[Bf-blender-cvs] [8b8142c13a7] soc-2019-openxr: Remove obscure unique_oxr_ptr, implement alternative RAII for swapchain

Julian Eisel noreply at git.blender.org
Tue Mar 10 16:34:46 CET 2020


Commit: 8b8142c13a70cd72c794f6a0fd9f4fdd7789f72a
Author: Julian Eisel
Date:   Tue Mar 10 15:30:21 2020 +0100
Branches: soc-2019-openxr
https://developer.blender.org/rB8b8142c13a70cd72c794f6a0fd9f4fdd7789f72a

Remove obscure unique_oxr_ptr, implement alternative RAII for swapchain

Add an own class for the swapchain, through which we can ensure correct
RAII resource management.

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

M	intern/ghost/CMakeLists.txt
M	intern/ghost/intern/GHOST_IXrGraphicsBinding.h
M	intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
M	intern/ghost/intern/GHOST_XrSession.cpp
M	intern/ghost/intern/GHOST_XrSession.h
A	intern/ghost/intern/GHOST_XrSwapchain.cpp
A	intern/ghost/intern/GHOST_XrSwapchain.h
M	intern/ghost/intern/GHOST_Xr_intern.h

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

diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt
index 8bd46cb4f64..07d98475c00 100644
--- a/intern/ghost/CMakeLists.txt
+++ b/intern/ghost/CMakeLists.txt
@@ -364,13 +364,15 @@ if(WITH_XR_OPENXR)
     intern/GHOST_XrEvent.cpp
     intern/GHOST_XrGraphicsBinding.cpp
     intern/GHOST_XrSession.cpp
+    intern/GHOST_XrSwapchain.cpp
 
     GHOST_IXrContext.h
+    intern/GHOST_IXrGraphicsBinding.h
     intern/GHOST_Xr_intern.h
     intern/GHOST_Xr_openxr_includes.h
     intern/GHOST_XrContext.h
-    intern/GHOST_IXrGraphicsBinding.h
     intern/GHOST_XrSession.h
+    intern/GHOST_XrSwapchain.h
   )
   list(APPEND INC_SYS
     ${XR_OPENXR_SDK_INCLUDE_DIR}
diff --git a/intern/ghost/intern/GHOST_IXrGraphicsBinding.h b/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
index 4cc71d19f21..4ef91d8ce46 100644
--- a/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
+++ b/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
@@ -57,7 +57,7 @@ class GHOST_IXrGraphicsBinding {
                                      int64_t *r_result) const = 0;
   virtual std::vector<XrSwapchainImageBaseHeader *> createSwapchainImages(
       uint32_t image_count) = 0;
-  virtual void submitToSwapchain(XrSwapchainImageBaseHeader *swapchain_image,
+  virtual void submitToSwapchainImage(XrSwapchainImageBaseHeader *swapchain_image,
                                  const GHOST_XrDrawViewInfo *draw_info) = 0;
 
  protected:
diff --git a/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
index b6a4f76b92d..ddc757b8f8a 100644
--- a/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
+++ b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
@@ -153,8 +153,8 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
     return base_images;
   }
 
-  void submitToSwapchain(XrSwapchainImageBaseHeader *swapchain_image,
-                         const GHOST_XrDrawViewInfo *draw_info) override
+  void submitToSwapchainImage(XrSwapchainImageBaseHeader *swapchain_image,
+                              const GHOST_XrDrawViewInfo *draw_info) override
   {
     XrSwapchainImageOpenGLKHR *ogl_swapchain_image = reinterpret_cast<XrSwapchainImageOpenGLKHR *>(
         swapchain_image);
@@ -257,8 +257,8 @@ class GHOST_XrGraphicsBindingD3D : public GHOST_IXrGraphicsBinding {
     return base_images;
   }
 
-  void submitToSwapchain(XrSwapchainImageBaseHeader *swapchain_image,
-                         const GHOST_XrDrawViewInfo *draw_info) override
+  void submitToSwapchainImage(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 4dfd72f46a3..818e9322ea7 100644
--- a/intern/ghost/intern/GHOST_XrSession.cpp
+++ b/intern/ghost/intern/GHOST_XrSession.cpp
@@ -31,6 +31,7 @@
 #include "GHOST_Xr_intern.h"
 #include "GHOST_XrContext.h"
 #include "GHOST_XrException.h"
+#include "GHOST_XrSwapchain.h"
 
 #include "GHOST_XrSession.h"
 
@@ -43,9 +44,7 @@ struct OpenXRSessionData {
   const XrViewConfigurationType view_type = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
   XrSpace reference_space;
   std::vector<XrView> views;
-  std::vector<XrSwapchain> swapchains;
-  std::map<XrSwapchain, std::vector<XrSwapchainImageBaseHeader *>> swapchain_images;
-  int32_t swapchain_image_width, swapchain_image_height;
+  std::vector<std::unique_ptr<GHOST_XrSwapchain>> swapchains;
 };
 
 struct GHOST_XrDrawInfo {
@@ -71,10 +70,8 @@ GHOST_XrSession::~GHOST_XrSession()
 {
   unbindGraphicsContext();
 
-  for (XrSwapchain &swapchain : m_oxr->swapchains) {
-    CHECK_XR_ASSERT(xrDestroySwapchain(swapchain));
-  }
   m_oxr->swapchains.clear();
+
   if (m_oxr->reference_space != XR_NULL_HANDLE) {
     CHECK_XR_ASSERT(xrDestroySpace(m_oxr->reference_space));
   }
@@ -241,58 +238,6 @@ GHOST_XrSession::LifeExpectancy GHOST_XrSession::handleStateChangeEvent(
  *
  * \{ */
 
-static std::vector<XrSwapchainImageBaseHeader *> swapchain_images_create(
-    XrSwapchain swapchain, GHOST_IXrGraphicsBinding *gpu_binding)
-{
-  std::vector<XrSwapchainImageBaseHeader *> images;
-  uint32_t image_count;
-
-  CHECK_XR(xrEnumerateSwapchainImages(swapchain, 0, &image_count, nullptr),
-           "Failed to get count of swapchain images to create for the VR session.");
-  images = gpu_binding->createSwapchainImages(image_count);
-  CHECK_XR(xrEnumerateSwapchainImages(swapchain, images.size(), &image_count, images[0]),
-           "Failed to create swapchain images for the VR session.");
-
-  return images;
-}
-
-static unique_oxr_ptr<XrSwapchain> swapchain_create(const XrSession session,
-                                                    GHOST_IXrGraphicsBinding *gpu_binding,
-                                                    const XrViewConfigurationView *xr_view)
-{
-  XrSwapchainCreateInfo create_info = {XR_TYPE_SWAPCHAIN_CREATE_INFO};
-  unique_oxr_ptr<XrSwapchain> swapchain(xrDestroySwapchain);
-  uint32_t format_count = 0;
-  int64_t chosen_format;
-
-  CHECK_XR(xrEnumerateSwapchainFormats(session, 0, &format_count, nullptr),
-           "Failed to get count of swapchain image formats.");
-  std::vector<int64_t> swapchain_formats(format_count);
-  CHECK_XR(xrEnumerateSwapchainFormats(
-               session, swapchain_formats.size(), &format_count, swapchain_formats.data()),
-           "Failed to get swapchain image formats.");
-  assert(swapchain_formats.size() == format_count);
-
-  if (!gpu_binding->chooseSwapchainFormat(swapchain_formats, &chosen_format)) {
-    throw GHOST_XrException(
-        "Error: No format matching OpenXR runtime supported swapchain formats found.");
-  }
-
-  create_info.usageFlags = XR_SWAPCHAIN_USAGE_SAMPLED_BIT |
-                           XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT;
-  create_info.format = chosen_format;
-  create_info.sampleCount = xr_view->recommendedSwapchainSampleCount;
-  create_info.width = xr_view->recommendedImageRectWidth;
-  create_info.height = xr_view->recommendedImageRectHeight;
-  create_info.faceCount = 1;
-  create_info.arraySize = 1;
-  create_info.mipCount = 1;
-  CHECK_XR(swapchain.construct(xrCreateSwapchain, session, &create_info),
-           "Failed to create OpenXR swapchain.");
-
-  return swapchain;
-}
-
 void GHOST_XrSession::prepareDrawing()
 {
   std::vector<XrViewConfigurationView> view_configs;
@@ -311,17 +256,9 @@ void GHOST_XrSession::prepareDrawing()
                                              view_configs.data()),
            "Failed to get count of view configurations.");
 
-  for (const XrViewConfigurationView &view : view_configs) {
-    unique_oxr_ptr<XrSwapchain> swapchain = swapchain_create(
-        m_oxr->session, m_gpu_binding.get(), &view);
-    auto images = swapchain_images_create(swapchain.get(), m_gpu_binding.get());
-
-    m_oxr->swapchain_image_width = view.recommendedImageRectWidth;
-    m_oxr->swapchain_image_height = view.recommendedImageRectHeight;
-    m_oxr->swapchains.push_back(swapchain.get());
-    m_oxr->swapchain_images.insert(std::make_pair(swapchain.get(), std::move(images)));
-
-    swapchain.release();
+  for (const XrViewConfigurationView &view_config : view_configs) {
+    m_oxr->swapchains.push_back(std::unique_ptr<GHOST_XrSwapchain>(
+        new GHOST_XrSwapchain(*m_gpu_binding, m_oxr->session, view_config)));
   }
 
   m_oxr->views.resize(view_count, {XR_TYPE_VIEW});
@@ -432,50 +369,35 @@ static bool ghost_xr_draw_view_expects_srgb_buffer(const GHOST_XrContext *contex
          (context->getOpenXRRuntimeID() == OPENXR_RUNTIME_MONADO);
 }
 
-void GHOST_XrSession::drawView(XrSwapchain swapchain,
-                               XrCompositionLayerProjectionView &proj_layer_view,
+void GHOST_XrSession::drawView(GHOST_XrSwapchain &swapchain,
+                               XrCompositionLayerProjectionView &r_proj_layer_view,
                                XrView &view,
                                void *draw_customdata)
 {
-  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;
+  XrSwapchainImageBaseHeader *swapchain_image = swapchain.acquireDrawableSwapchainImage();
   GHOST_XrDrawViewInfo draw_view_info = {};
-  uint32_t swapchain_idx;
-
-  CHECK_XR(xrAcquireSwapchainImage(swapchain, &acquire_info, &swapchain_idx),
-           "Failed to acquire swapchain image for the VR session.");
-  wait_info.timeout = XR_INFINITE_DURATION;
-  CHECK_XR(xrWaitSwapchainImage(swapchain, &wait_info),
-           "Failed to acquire swapchain image for the VR session.");
-
-  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 = {m_oxr->swapchain_image_width,
-                                               m_oxr->swapchain_image_height};
 
-  swapchain_image = m_oxr->swapchain_images[swapchain][swapchain_idx];
+  r_proj_layer_view.type = XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW;
+  r_proj_layer_view.pose = view.pose;
+  r_proj_layer_view.fov = view.fov;
+  swapchain.updateCompositionLayerProjectViewSubImage(r_proj_layer_view.subImage);
 
   draw_view_info.expects_srgb_buffer = ghost_xr_draw_view_expects_srgb_buffer(m_context);
-  draw_view_info.ofsx = proj_layer_view.subImage.imageRect.offset.x;
-  draw_view_info.ofsy = proj_layer_view.subImage.imageRect.offset.y;
-  draw_view_info.width = proj_layer_view.subImage.imageRect.extent.width;
-  draw_view_info.height = proj_layer_view.subImage.imageRect.extent.height;
+  draw_view_info.ofsx = r_proj_layer_view.subImage.imageRect.offset.x;
+  draw_view_info.ofsy = r_proj_layer_view.subImage.imageRect.offset.y;
+  draw_view_info.width = r_proj_layer_view.subImage.ima

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list