[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