[Bf-blender-cvs] [7a711e133c9] temp-vr-draw-thread: Keep a single OpenGL/GPU context alive on the drawing thread

Julian Eisel noreply at git.blender.org
Fri Aug 2 13:45:37 CEST 2019


Commit: 7a711e133c9bd1f7a6df8320a82ee69c749d3d2f
Author: Julian Eisel
Date:   Fri Aug 2 13:40:48 2019 +0200
Branches: temp-vr-draw-thread
https://developer.blender.org/rB7a711e133c9bd1f7a6df8320a82ee69c749d3d2f

Keep a single OpenGL/GPU context alive on the drawing thread

Avoids expensive context switches.

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

M	source/blender/draw/DRW_engine.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/windowmanager/intern/wm_xr.c

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

diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 6c853d27f67..f9963fa67b7 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -171,8 +171,12 @@ void DRW_cache_free_old_batches(struct Main *bmain);
 void DRW_opengl_context_enable_ex(bool restore);
 void DRW_opengl_context_disable_ex(bool restore);
 
+void DRW_opengl_render_context_enable_ex(void *re_gl_context);
 void DRW_opengl_render_context_enable(void *re_gl_context);
+void DRW_opengl_render_context_disable_ex(void *re_gl_context);
 void DRW_opengl_render_context_disable(void *re_gl_context);
+void DRW_render_context_draw_begin();
+void DRW_render_context_draw_end();
 void DRW_gawain_render_context_enable(void *re_gpu_context);
 void DRW_gawain_render_context_disable(void *re_gpu_context);
 
@@ -182,9 +186,7 @@ struct DrawDataList *DRW_drawdatalist_from_id(struct ID *id);
 void DRW_drawdata_free(struct ID *id);
 
 /* select_engine.c */
-void DRW_select_context_create(struct Base **bases,
-                               const uint bases_len,
-                               short select_mode);
+void DRW_select_context_create(struct Base **bases, const uint bases_len, short select_mode);
 bool DRW_select_elem_get(const uint sel_id, uint *r_elem, uint *r_base_index, char *r_elem_type);
 uint DRW_select_context_offset_for_object_elem(const uint base_index, char elem_type);
 uint DRW_select_context_elem_len(void);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 26ad9a54189..4b958a74bf9 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -3020,20 +3020,40 @@ void *DRW_gpu_context_get(void)
   return DST.gpu_context;
 }
 
-void DRW_opengl_render_context_enable(void *re_gl_context)
+void DRW_opengl_render_context_enable_ex(void *re_gl_context)
 {
   /* If thread is main you should use DRW_opengl_context_enable(). */
   BLI_assert(!BLI_thread_is_main());
 
-  /* TODO get rid of the blocking. Only here because of the static global DST. */
-  BLI_ticket_mutex_lock(DST.gl_context_mutex);
   WM_opengl_context_activate(re_gl_context);
 }
+void DRW_opengl_render_context_enable(void *re_gl_context)
+{
+  DRW_opengl_render_context_enable_ex(re_gl_context);
+  DRW_render_context_draw_begin();
+}
 
-void DRW_opengl_render_context_disable(void *re_gl_context)
+void DRW_opengl_render_context_disable_ex(void *re_gl_context)
 {
   GPU_flush();
   WM_opengl_context_release(re_gl_context);
+}
+void DRW_opengl_render_context_disable(void *re_gl_context)
+{
+  DRW_opengl_render_context_disable_ex(re_gl_context);
+  DRW_render_context_draw_end();
+}
+
+void DRW_render_context_draw_begin()
+{
+  BLI_assert(!BLI_thread_is_main());
+  /* TODO get rid of the blocking. */
+  BLI_ticket_mutex_lock(DST.gl_context_mutex);
+}
+
+void DRW_render_context_draw_end()
+{
+  //  GPU_flush();
   /* TODO get rid of the blocking. */
   BLI_ticket_mutex_unlock(DST.gl_context_mutex);
 }
diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index a0d6f5f9dc6..82337d632bc 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -316,8 +316,7 @@ static GHOST_ContextHandle wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view
 
   BKE_scene_graph_evaluated_ensure(g_depsgraph, CTX_data_main(C));
 
-  DRW_opengl_render_context_enable(g_xr_surface->ghost_ctx);
-  DRW_gawain_render_context_enable(g_xr_surface->gpu_ctx);
+  DRW_render_context_draw_begin();
 
   if (!wm_xr_session_surface_offscreen_ensure(draw_view)) {
     // TODO disable correctly.
@@ -375,10 +374,10 @@ static GHOST_ContextHandle wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view
 
   GPU_matrix_pop_projection();
   GPU_matrix_pop();
+
   GPU_viewport_unbind(viewport);
 
-  DRW_gawain_render_context_disable(g_xr_surface->gpu_ctx);
-  DRW_opengl_render_context_disable(g_xr_surface->ghost_ctx);
+  DRW_render_context_draw_end();
 
   return g_xr_surface->ghost_ctx;
 }
@@ -445,6 +444,9 @@ static void *wm_xr_session_drawthread_main(void *data)
       GHOST_GetContextDefaultOpenGLFramebuffer(g_xr_surface->ghost_ctx));
   WM_opengl_context_release(g_xr_surface->ghost_ctx);
 
+  DRW_opengl_render_context_enable_ex(g_xr_surface->ghost_ctx);
+  DRW_gawain_render_context_enable(g_xr_surface->gpu_ctx);
+
   /* Sort of the session's main loop. */
   while (GHOST_XrHasSession(wm->xr_context)) {
     if (!GHOST_XrSessionShouldRunDrawLoop(wm->xr_context)) {
@@ -454,6 +456,9 @@ static void *wm_xr_session_drawthread_main(void *data)
     GHOST_XrSessionDrawViews(wm->xr_context, C);
   }
 
+  DRW_gawain_render_context_disable(g_xr_surface->gpu_ctx);
+  DRW_opengl_render_context_disable_ex(g_xr_surface->ghost_ctx);
+
   return NULL;
 }



More information about the Bf-blender-cvs mailing list