[Bf-blender-cvs] [6dbe2d781d5] soc-2019-openxr: Don't create framebuffer for VR view, re-use GPUViewport one

Julian Eisel noreply at git.blender.org
Mon Feb 17 16:57:57 CET 2020


Commit: 6dbe2d781d53310d21b36c3200ad1229339c20a5
Author: Julian Eisel
Date:   Mon Feb 17 16:21:28 2020 +0100
Branches: soc-2019-openxr
https://developer.blender.org/rB6dbe2d781d53310d21b36c3200ad1229339c20a5

Don't create framebuffer for VR view, re-use GPUViewport one

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

M	source/blender/windowmanager/intern/wm_xr.c

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

diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index 69df585fca5..ebe4d3f04bf 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -64,8 +64,6 @@ typedef struct {
   GHOST_TXrGraphicsBinding gpu_binding_type;
   GPUOffScreen *offscreen;
   GPUViewport *viewport;
-  GPUFrameBuffer *fbo;
-  GPUTexture *fbo_tex;
   bool viewport_bound;
 
   GHOST_ContextHandle secondary_ghost_ctx;
@@ -291,12 +289,6 @@ 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);
@@ -307,18 +299,18 @@ static void wm_xr_session_free_data(wmSurface *surface)
 static bool wm_xr_session_surface_offscreen_ensure(const GHOST_XrDrawViewInfo *draw_view)
 {
   wmXrSurfaceData *surface_data = g_xr_surface->customdata;
+  const bool size_changed = surface_data->offscreen &&
+                            (GPU_offscreen_width(surface_data->offscreen) != draw_view->width) &&
+                            (GPU_offscreen_height(surface_data->offscreen) != draw_view->height);
   char err_out[256] = "unknown";
   bool failure = false;
 
-  if (surface_data->offscreen &&
-      (GPU_offscreen_width(surface_data->offscreen) == draw_view->width) &&
-      (GPU_offscreen_height(surface_data->offscreen) == draw_view->height)) {
+  if (surface_data->offscreen) {
     BLI_assert(surface_data->viewport);
-    return true;
-  }
 
-  DRW_opengl_context_enable();
-  if (surface_data->offscreen) {
+    if (!size_changed) {
+      return true;
+    }
     GPU_viewport_free(surface_data->viewport);
     GPU_offscreen_free(surface_data->offscreen);
   }
@@ -327,19 +319,15 @@ static bool wm_xr_session_surface_offscreen_ensure(const GHOST_XrDrawViewInfo *d
             draw_view->width, draw_view->height, 0, true, false, err_out))) {
     failure = true;
   }
-  if ((failure == false) && !(surface_data->viewport = GPU_viewport_create())) {
+
+  if (failure) {
+    /* Pass. */
+  }
+  else if (!(surface_data->viewport = GPU_viewport_create())) {
     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) {
     fprintf(stderr, "%s: failed to get buffer, %s\n", __func__, err_out);
     return false;
@@ -475,6 +463,7 @@ void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata)
   shading.flag |= V3D_SHADING_WORLD_ORIENTATION;
   shading.flag &= ~V3D_SHADING_SPECULAR_HIGHLIGHT;
   shading.background_type = V3D_SHADING_BACKGROUND_WORLD;
+
   ED_view3d_draw_offscreen_simple(CTX_data_ensure_evaluated_depsgraph(C),
                                   CTX_data_scene(C),
                                   &shading,
@@ -493,15 +482,18 @@ void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata)
                                   offscreen,
                                   viewport);
 
-  GPU_framebuffer_bind(surface_data->fbo);
+  BLI_assert(GPU_context_active_get() == DRW_gpu_context_get());
 
-  wm_draw_offscreen_texture_parameters(offscreen);
-
-  wmViewport(&rect);
+  // TODO
   //  const bool is_upside_down = surface_data->secondary_ghost_ctx &&
   //                              GHOST_isUpsideDownContext(surface_data->secondary_ghost_ctx);
-  //  const int ymin = is_upside_down ? draw_view->height : 0;
-  //  const int ymax = is_upside_down ? 0 : draw_view->height;
+
+  DefaultFramebufferList *dfl = GPU_viewport_framebuffer_list_get(viewport);
+
+  /* Draw into viewport default framebuffer and leave it bound when exiting this function. Ghost-XR
+   * will blit from the currently bound framebuffer into the OpenXR swapchain. */
+  GPU_framebuffer_bind(dfl->default_fb);
+  wmViewport(&rect);
   GPU_viewport_draw_to_screen(viewport, &rect);
 
   /* Leave viewport bound so GHOST_Xr can use its context/framebuffer, its unbound in



More information about the Bf-blender-cvs mailing list