[Bf-blender-cvs] [3a4034a7411] soc-2019-openxr: Make OpenGL-only session backend work

Julian Eisel noreply at git.blender.org
Sat Jul 20 19:35:49 CEST 2019


Commit: 3a4034a7411a65455de73bf86dcbb319002de468
Author: Julian Eisel
Date:   Sat Jul 20 19:32:06 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rB3a4034a7411a65455de73bf86dcbb319002de468

Make OpenGL-only session backend work

Previously, only DirectX HMD rendering would work (and still takes
priority).

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

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_IXrGraphicsBinding.h b/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
index e426312ba30..8470827c2dd 100644
--- a/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
+++ b/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
@@ -59,6 +59,7 @@ class GHOST_IXrGraphicsBinding {
       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;
 
  protected:
diff --git a/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
index 8120dccfcd7..b7c369ac996 100644
--- a/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
+++ b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
@@ -55,6 +55,13 @@ static bool choose_swapchain_format_from_candidates(std::vector<int64_t> gpu_bin
 
 class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
  public:
+  ~GHOST_XrGraphicsBindingOpenGL()
+  {
+    if (m_fbo != 0) {
+      glDeleteFramebuffers(1, &m_fbo);
+    }
+  }
+
   bool checkVersionRequirements(GHOST_Context *ghost_ctx,
                                 XrInstance instance,
                                 XrSystemId system_id,
@@ -106,6 +113,9 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
     oxr_binding.wgl.hDC = ctx_wgl->m_hDC;
     oxr_binding.wgl.hGLRC = ctx_wgl->m_hGLRC;
 #endif
+
+    /* Generate a framebuffer to use for blitting into the texture */
+    glGenFramebuffers(1, &m_fbo);
   }
 
   bool chooseSwapchainFormat(const std::vector<int64_t> &runtime_formats,
@@ -135,18 +145,40 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
 
   void drawViewBegin(XrSwapchainImageBaseHeader *swapchain_image) override
   {
-    // TODO
-    (void)swapchain_image;
   }
-  void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image, GHOST_Context *ogl_ctx) override
+  void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image,
+                   const GHOST_XrDrawViewInfo *draw_info,
+                   GHOST_Context *ogl_ctx) override
   {
-    // TODO
-    (void)swapchain_image;
-    (void)ogl_ctx;
+    XrSwapchainImageOpenGLKHR *ogl_swapchain_image = reinterpret_cast<XrSwapchainImageOpenGLKHR *>(
+        swapchain_image);
+
+    ogl_ctx->activateDrawingContext();
+    ogl_ctx->setDefaultFramebufferSize(draw_info->width, draw_info->height);
+
+    glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
+    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
+
+    glFramebufferTexture2D(
+        GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ogl_swapchain_image->image, 0);
+
+    glBlitFramebuffer(draw_info->ofsx,
+                      draw_info->ofsy,
+                      draw_info->ofsx + draw_info->width,
+                      draw_info->ofsy + draw_info->height,
+                      draw_info->ofsx,
+                      draw_info->ofsy,
+                      draw_info->ofsx + draw_info->width,
+                      draw_info->ofsy + draw_info->height,
+                      GL_COLOR_BUFFER_BIT,
+                      GL_LINEAR);
+
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
   }
 
  private:
   std::list<std::vector<XrSwapchainImageOpenGLKHR>> m_image_cache;
+  GLuint m_fbo{0};
 };
 
 #ifdef WIN32
@@ -211,7 +243,9 @@ class GHOST_XrGraphicsBindingD3D : public GHOST_IXrGraphicsBinding {
   void drawViewBegin(XrSwapchainImageBaseHeader * /*swapchain_image*/) override
   {
   }
-  void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image, GHOST_Context *ogl_ctx) override
+  void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image,
+                   const GHOST_XrDrawViewInfo *draw_info,
+                   GHOST_Context *ogl_ctx) override
   {
     XrSwapchainImageD3D11KHR *d3d_swapchain_image = reinterpret_cast<XrSwapchainImageD3D11KHR *>(
         swapchain_image);
@@ -229,21 +263,15 @@ class GHOST_XrGraphicsBindingD3D : public GHOST_IXrGraphicsBinding {
     ID3D11RenderTargetView *rtv;
     CD3D11_RENDER_TARGET_VIEW_DESC rtv_desc(D3D11_RTV_DIMENSION_TEXTURE2D,
                                             DXGI_FORMAT_R8G8B8A8_UNORM);
-    D3D11_TEXTURE2D_DESC tex_desc;
-
-    d3d_swapchain_image->texture->GetDesc(&tex_desc);
 
     m_ghost_ctx->m_device->CreateRenderTargetView(d3d_swapchain_image->texture, &rtv_desc, &rtv);
-    m_ghost_ctx->blitOpenGLOffscreenContext(ogl_ctx, rtv, tex_desc.Width, tex_desc.Height);
+    m_ghost_ctx->blitOpenGLOffscreenContext(ogl_ctx, rtv, draw_info->width, draw_info->height);
 #  else
     ID3D11Resource *res;
     ID3D11Texture2D *tex;
-    D3D11_TEXTURE2D_DESC tex_desc;
-
-    d3d_swapchain_image->texture->GetDesc(&tex_desc);
 
     ogl_ctx->activateDrawingContext();
-    m_ghost_ctx->blitOpenGLOffscreenContext(ogl_ctx, tex_desc.Width, tex_desc.Height);
+    m_ghost_ctx->blitOpenGLOffscreenContext(ogl_ctx, draw_info->width, draw_info->height);
 
     m_ghost_ctx->m_backbuffer_view->GetResource(&res);
     res->QueryInterface<ID3D11Texture2D>(&tex);
diff --git a/intern/ghost/intern/GHOST_XrSession.cpp b/intern/ghost/intern/GHOST_XrSession.cpp
index 2e85c22faad..fbf86fcbb83 100644
--- a/intern/ghost/intern/GHOST_XrSession.cpp
+++ b/intern/ghost/intern/GHOST_XrSession.cpp
@@ -415,7 +415,7 @@ void GHOST_XrSession::drawView(XrSwapchain swapchain,
 
   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, (GHOST_Context *)draw_ctx);
+  m_gpu_binding->drawViewEnd(swapchain_image, &draw_view_info, (GHOST_Context *)draw_ctx);
 
   CHECK_XR(xrReleaseSwapchainImage(swapchain, &release_info),
            "Failed to release swapchain image used to submit VR session frame.");



More information about the Bf-blender-cvs mailing list