[Bf-blender-cvs] [4b674777328] soc-2019-openxr: Own FBO for VR viewport to get previous changes to work

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


Commit: 4b6747773283b0c4028c3c224d37e6fe69ae097a
Author: Julian Eisel
Date:   Sat Aug 24 03:15:25 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rB4b6747773283b0c4028c3c224d37e6fe69ae097a

Own FBO for VR viewport to get previous changes to work

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

M	intern/ghost/intern/GHOST_ContextD3D.cpp
M	source/blender/windowmanager/intern/wm_xr.c

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

diff --git a/intern/ghost/intern/GHOST_ContextD3D.cpp b/intern/ghost/intern/GHOST_ContextD3D.cpp
index b9bdb28dd7e..605a52905b1 100644
--- a/intern/ghost/intern/GHOST_ContextD3D.cpp
+++ b/intern/ghost/intern/GHOST_ContextD3D.cpp
@@ -240,11 +240,13 @@ class GHOST_SharedOpenGLResource {
     }
   }
 
-  GHOST_TSuccess blit()
+  GHOST_TSuccess blit(unsigned int width, unsigned int height)
   {
     GLint fbo;
     glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &fbo);
 
+    ensureUpdated(width, height);
+
     const float clear_col[] = {0.8f, 0.5f, 1.0f, 1.0f};
     m_device_ctx->ClearRenderTargetView(m_render_target, clear_col);
     m_device_ctx->OMSetRenderTargets(1, &m_render_target, nullptr);
@@ -260,17 +262,7 @@ class GHOST_SharedOpenGLResource {
 
     /* No glBlitNamedFramebuffer, gotta be 3.3 compatible. */
     glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
-    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_shared.fbo);
-    glBlitFramebuffer(0,
-                      0,
-                      m_cur_width,
-                      m_cur_height,
-                      0,
-                      0,
-                      m_cur_width,
-                      m_cur_height,
-                      GL_COLOR_BUFFER_BIT,
-                      GL_LINEAR);
+    glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
 
     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 
@@ -332,8 +324,7 @@ GHOST_TSuccess GHOST_ContextD3D::blitFromOpenGLContext(GHOST_SharedOpenGLResourc
                                                        unsigned int width,
                                                        unsigned int height)
 {
-  shared_res->ensureUpdated(width, height);
-  return shared_res->blit();
+  return shared_res->blit(width, height);
 }
 
 ID3D11Texture2D *GHOST_ContextD3D::getSharedTexture2D(GHOST_SharedOpenGLResource *shared_res)
diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index 8ce691958d5..2ee75be9cf3 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -63,6 +63,9 @@ typedef struct {
   GHOST_TXrGraphicsBinding gpu_binding_type;
   GPUOffScreen *offscreen;
   GPUViewport *viewport;
+  GPUFrameBuffer *fbo;
+  GPUTexture *fbo_tex;
+  bool viewport_bound;
 
   GHOST_ContextHandle secondary_ghost_ctx;
 } wmXrSurfaceData;
@@ -230,6 +233,21 @@ void wm_xr_session_toggle(bContext *C, void *xr_context_ptr)
  *
  * \{ */
 
+static void wm_xr_surface_viewport_bind(wmXrSurfaceData *surface_data, const rcti *rect)
+{
+  if (surface_data->viewport_bound == false) {
+    GPU_viewport_bind(surface_data->viewport, rect);
+  }
+  surface_data->viewport_bound = true;
+}
+static void wm_xr_surface_viewport_unbind(wmXrSurfaceData *surface_data)
+{
+  if (surface_data->viewport_bound) {
+    GPU_viewport_unbind(surface_data->viewport);
+  }
+  surface_data->viewport_bound = false;
+}
+
 /**
  * \brief Call Ghost-XR to draw a frame
  *
@@ -248,7 +266,7 @@ static void wm_xr_session_surface_draw(bContext *C)
   GHOST_XrSessionDrawViews(wm->xr_context, C);
   if (surface_data->viewport) {
     /* Still bound from view drawing. */
-    GPU_viewport_unbind(surface_data->viewport);
+    wm_xr_surface_viewport_unbind(surface_data);
   }
 }
 
@@ -272,6 +290,12 @@ static void wm_xr_session_free_data(wmSurface *surface)
   if (data->offscreen) {
     GPU_offscreen_free(data->offscreen);
   }
+  if (data->fbo) {
+    GPU_framebuffer_free(data->fbo);
+  }
+  if (data->fbo_tex) {
+    GPU_texture_free(data->fbo_tex);
+  }
   DRW_opengl_context_disable_ex(false);
 
   MEM_freeN(surface->customdata);
@@ -308,6 +332,13 @@ static bool wm_xr_session_surface_offscreen_ensure(const GHOST_XrDrawViewInfo *d
     GPU_offscreen_free(surface_data->offscreen);
     failure = true;
   }
+
+  surface_data->fbo = GPU_framebuffer_create();
+  surface_data->fbo_tex = GPU_texture_create_2d(
+      draw_view->width, draw_view->height, GPU_RGBA8, NULL, NULL);
+  GPU_framebuffer_ensure_config(
+      &surface_data->fbo, {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(surface_data->fbo_tex)});
+
   DRW_opengl_context_disable();
 
   if (failure) {
@@ -435,7 +466,7 @@ GHOST_ContextHandle wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void
 
   offscreen = surface_data->offscreen;
   viewport = surface_data->viewport;
-  GPU_viewport_bind(viewport, &rect);
+  wm_xr_surface_viewport_bind(surface_data, &rect);
   glClear(GL_DEPTH_BUFFER_BIT);
 
   BKE_screen_view3d_shading_init(&shading);
@@ -462,12 +493,11 @@ GHOST_ContextHandle wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void
                                   offscreen,
                                   viewport);
 
-  GPU_framebuffer_restore();
+  GPU_framebuffer_bind(surface_data->fbo);
 
   GPUTexture *texture = GPU_offscreen_color_texture(offscreen);
 
   wm_draw_offscreen_texture_parameters(offscreen);
-  GPU_depth_test(false);
 
   wmViewport(&rect);
   if (surface_data->secondary_ghost_ctx &&



More information about the Bf-blender-cvs mailing list