[Bf-blender-cvs] [da44a02d00c] soc-2019-openxr: The first pixels pushed to Windows Mixed Reality HMDs!

Julian Eisel noreply at git.blender.org
Thu Jun 27 19:22:20 CEST 2019


Commit: da44a02d00ca9431ce232b9ac83009f0b3ab57a5
Author: Julian Eisel
Date:   Mon Jun 24 21:22:23 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rBda44a02d00ca9431ce232b9ac83009f0b3ab57a5

The first pixels pushed to Windows Mixed Reality HMDs!

Just a clear call for now, so all you see is a blue world. This blue
"world" is however drawn by Blender!

Also fixes use after destruction of compositor layer data.

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

M	intern/ghost/intern/GHOST_ContextD3D.cpp
M	intern/ghost/intern/GHOST_IXRGraphicsBinding.h
M	intern/ghost/intern/GHOST_XRGraphicsBinding.cpp
M	intern/ghost/intern/GHOST_XRSession.cpp

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

diff --git a/intern/ghost/intern/GHOST_ContextD3D.cpp b/intern/ghost/intern/GHOST_ContextD3D.cpp
index 2f3e28a28b2..6a617824856 100644
--- a/intern/ghost/intern/GHOST_ContextD3D.cpp
+++ b/intern/ghost/intern/GHOST_ContextD3D.cpp
@@ -176,7 +176,7 @@ GHOST_TSuccess GHOST_ContextD3D::initializeDrawingContext()
 
   DXGI_SWAP_CHAIN_DESC sd{};
 
-  sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
+  sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
   sd.SampleDesc.Count = 1;
   sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
   sd.BufferCount = 3;
diff --git a/intern/ghost/intern/GHOST_IXRGraphicsBinding.h b/intern/ghost/intern/GHOST_IXRGraphicsBinding.h
index 794153f251f..60b2304b239 100644
--- a/intern/ghost/intern/GHOST_IXRGraphicsBinding.h
+++ b/intern/ghost/intern/GHOST_IXRGraphicsBinding.h
@@ -44,6 +44,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) = 0;
 
  protected:
   /* Use GHOST_XrGraphicsBindingCreateFromType */
diff --git a/intern/ghost/intern/GHOST_XRGraphicsBinding.cpp b/intern/ghost/intern/GHOST_XRGraphicsBinding.cpp
index f42fa0fe059..d08940a951e 100644
--- a/intern/ghost/intern/GHOST_XRGraphicsBinding.cpp
+++ b/intern/ghost/intern/GHOST_XRGraphicsBinding.cpp
@@ -100,6 +100,17 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
     return base_images;
   }
 
+  void drawViewBegin(XrSwapchainImageBaseHeader *swapchain_image) override
+  {
+    // TODO
+    (void)swapchain_image;
+  }
+  void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image) override
+  {
+    // TODO
+    (void)swapchain_image;
+  }
+
  private:
   std::list<std::vector<XrSwapchainImageOpenGLKHR>> m_image_cache;
 };
@@ -113,6 +124,7 @@ class GHOST_XrGraphicsBindingD3D : public GHOST_IXrGraphicsBinding {
 
     oxr_binding.d3d11.type = XR_TYPE_GRAPHICS_BINDING_D3D11_KHR;
     oxr_binding.d3d11.device = ctx_d3d->m_device.Get();
+    m_ghost_ctx = ctx_d3d;
   }
 
   bool chooseSwapchainFormat(std::vector<int64_t> runtime_formats,
@@ -140,7 +152,30 @@ class GHOST_XrGraphicsBindingD3D : public GHOST_IXrGraphicsBinding {
     return base_images;
   }
 
+  void drawViewBegin(XrSwapchainImageBaseHeader *swapchain_image) override
+  {
+    // Can't we simply use the backbuffer texture? Didn't work in initial test.
+
+    XrSwapchainImageD3D11KHR *d3d_swapchain_image = reinterpret_cast<XrSwapchainImageD3D11KHR *>(
+        swapchain_image);
+    const CD3D11_RENDER_TARGET_VIEW_DESC render_target_view_desc(D3D11_RTV_DIMENSION_TEXTURE2D,
+                                                                 DXGI_FORMAT_R8G8B8A8_UNORM);
+    Microsoft::WRL::ComPtr<ID3D11RenderTargetView> renderTargetView;
+    m_ghost_ctx->m_device->CreateRenderTargetView(d3d_swapchain_image->texture,
+                                                  &render_target_view_desc,
+                                                  renderTargetView.ReleaseAndGetAddressOf());
+
+    const float clear_col[] = {0.2f, 0.5f, 0.8f, 1.0f};
+    m_ghost_ctx->m_device_ctx->ClearRenderTargetView(renderTargetView.Get(), clear_col);
+  }
+  void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image) override
+  {
+    // TODO
+    (void)swapchain_image;
+  }
+
  private:
+  GHOST_ContextD3D *m_ghost_ctx;
   std::list<std::vector<XrSwapchainImageD3D11KHR>> m_image_cache;
 };
 #endif  // WIN32
diff --git a/intern/ghost/intern/GHOST_XRSession.cpp b/intern/ghost/intern/GHOST_XRSession.cpp
index 11bd65b20fe..84193b2f13f 100644
--- a/intern/ghost/intern/GHOST_XRSession.cpp
+++ b/intern/ghost/intern/GHOST_XRSession.cpp
@@ -227,7 +227,8 @@ void drawing_end(GHOST_XrContext *xr_context, std::vector<XrCompositionLayerBase
   xr_context->draw_frame = nullptr;
 }
 
-static void draw_view(OpenXRData *oxr,
+static void draw_view(GHOST_XrContext *xr_context,
+                      OpenXRData *oxr,
                       XrSwapchain swapchain,
                       XrCompositionLayerProjectionView &proj_layer_view,
                       XrView &view)
@@ -252,19 +253,22 @@ static void draw_view(OpenXRData *oxr,
 
   swapchain_image = oxr->swapchain_images[swapchain][swapchain_idx];
 
-  //    xr_context->draw_view_fn();
+  xr_context->gpu_binding->drawViewBegin(swapchain_image);
+  //  xr_context->draw_view_fn();
+  xr_context->gpu_binding->drawViewEnd(swapchain_image);
 
   xrReleaseSwapchainImage(swapchain, &release_info);
 }
 
-static XrCompositionLayerProjection draw_layer(GHOST_XrContext *xr_context,
-                                               OpenXRData *oxr,
-                                               XrSpace space)
+static XrCompositionLayerProjection draw_layer(
+    GHOST_XrContext *xr_context,
+    OpenXRData *oxr,
+    XrSpace space,
+    std::vector<XrCompositionLayerProjectionView> &proj_layer_views)
 {
   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;
@@ -277,7 +281,11 @@ static XrCompositionLayerProjection draw_layer(GHOST_XrContext *xr_context,
   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]);
+    draw_view(xr_context,
+              oxr,
+              oxr->swapchains[view_idx],
+              proj_layer_views[view_idx],
+              oxr->views[view_idx]);
   }
 
   layer.space = space;
@@ -291,6 +299,8 @@ void GHOST_XrSessionDrawViews(GHOST_XrContext *xr_context)
 {
   OpenXRData *oxr = &xr_context->oxr;
   XrReferenceSpaceCreateInfo refspace_info{XR_TYPE_REFERENCE_SPACE_CREATE_INFO};
+  std::vector<XrCompositionLayerProjectionView>
+      projection_layer_views;  // Keep alive until xrEndFrame() call!
   XrCompositionLayerProjection proj_layer;
   std::vector<XrCompositionLayerBaseHeader *> layers;
   XrSpace space;
@@ -303,7 +313,7 @@ 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);
 
-  proj_layer = draw_layer(xr_context, oxr, space);
+  proj_layer = draw_layer(xr_context, oxr, space, projection_layer_views);
   layers.push_back(reinterpret_cast<XrCompositionLayerBaseHeader *>(&proj_layer));
 
   drawing_end(xr_context, &layers);



More information about the Bf-blender-cvs mailing list