From ccc512cc619dc9f0e6fd79270a7a96ece34d23b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Tue, 8 Sep 2020 03:18:49 +0200 Subject: GPUImmediate: Make activation / deactivation implicit This avoids unecessary complexity. Also makes the GPUImmediate threadsafe by using a threadlocal imm variable. --- intern/ghost/test/multitest/MultiTest.c | 1 - source/blender/draw/intern/draw_manager.c | 18 +----------------- source/blender/gpu/GPU_immediate.h | 6 ------ source/blender/gpu/intern/gpu_immediate.cc | 12 +----------- source/blender/gpu/intern/gpu_immediate_private.hh | 5 ++++- source/blender/gpu/intern/gpu_init_exit.c | 8 -------- source/blender/gpu/opengl/gl_context.cc | 4 ++++ source/blender/windowmanager/intern/wm_playanim.c | 3 --- source/blender/windowmanager/intern/wm_surface.c | 3 --- source/blender/windowmanager/intern/wm_window.c | 2 -- 10 files changed, 10 insertions(+), 52 deletions(-) diff --git a/intern/ghost/test/multitest/MultiTest.c b/intern/ghost/test/multitest/MultiTest.c index cf7a06bf3e5..b6b83f2a47d 100644 --- a/intern/ghost/test/multitest/MultiTest.c +++ b/intern/ghost/test/multitest/MultiTest.c @@ -439,7 +439,6 @@ static void loggerwindow_do_draw(LoggerWindow *lw) GHOST_ActivateWindowDrawingContext(lw->win); GPU_context_active_set(lw->gpu_context); - immActivate(); glClearColor(1, 1, 1, 1); glClear(GL_COLOR_BUFFER_BIT); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index f7c126d2e99..d2a95f9b7b3 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -2767,17 +2767,11 @@ void DRW_opengl_context_create(void) BLI_assert(DST.gl_context == NULL); /* Ensure it's called once */ DST.gl_context_mutex = BLI_ticket_mutex_alloc(); - if (!G.background) { - immDeactivate(); - } /* This changes the active context. */ DST.gl_context = WM_opengl_context_create(); WM_opengl_context_activate(DST.gl_context); /* Be sure to create gpu_context too. */ DST.gpu_context = GPU_context_create(0); - if (!G.background) { - immActivate(); - } /* So we activate the window's one afterwards. */ wm_window_reset_drawable(); } @@ -2794,25 +2788,15 @@ void DRW_opengl_context_destroy(void) } } -void DRW_opengl_context_enable_ex(bool restore) +void DRW_opengl_context_enable_ex(bool UNUSED(restore)) { if (DST.gl_context != NULL) { /* IMPORTANT: We dont support immediate mode in render mode! * This shall remain in effect until immediate mode supports * multiple threads. */ BLI_ticket_mutex_lock(DST.gl_context_mutex); - if (BLI_thread_is_main() && restore) { - if (!G.background) { - immDeactivate(); - } - } WM_opengl_context_activate(DST.gl_context); GPU_context_active_set(DST.gpu_context); - if (BLI_thread_is_main() && restore) { - if (!G.background) { - immActivate(); - } - } } } diff --git a/source/blender/gpu/GPU_immediate.h b/source/blender/gpu/GPU_immediate.h index 6057770d2d9..edb7c9fe5b5 100644 --- a/source/blender/gpu/GPU_immediate.h +++ b/source/blender/gpu/GPU_immediate.h @@ -145,12 +145,6 @@ void immUniformThemeColorBlendShade(int color_id1, int color_id2, float fac, int void immUniformThemeColorBlend(int color_id1, int color_id2, float fac); void immThemeColorShadeAlpha(int colorid, int coloffset, int alphaoffset); -/* These are called by the system -- not part of drawing API. */ -void immInit(void); -void immActivate(void); -void immDeactivate(void); -void immDestroy(void); - #ifdef __cplusplus } #endif diff --git a/source/blender/gpu/intern/gpu_immediate.cc b/source/blender/gpu/intern/gpu_immediate.cc index dd3e5bea604..9fc5e03a796 100644 --- a/source/blender/gpu/intern/gpu_immediate.cc +++ b/source/blender/gpu/intern/gpu_immediate.cc @@ -39,12 +39,7 @@ using namespace blender::gpu; -static Immediate *imm = NULL; - -void immInit(void) -{ - /* TODO Remove */ -} +static thread_local Immediate *imm = NULL; void immActivate(void) { @@ -56,11 +51,6 @@ void immDeactivate(void) imm = NULL; } -void immDestroy(void) -{ - /* TODO Remove */ -} - GPUVertFormat *immVertexFormat(void) { GPU_vertformat_clear(&imm->vertex_format); diff --git a/source/blender/gpu/intern/gpu_immediate_private.hh b/source/blender/gpu/intern/gpu_immediate_private.hh index aa99fb9a438..38db8131942 100644 --- a/source/blender/gpu/intern/gpu_immediate_private.hh +++ b/source/blender/gpu/intern/gpu_immediate_private.hh @@ -63,4 +63,7 @@ class Immediate { virtual void end(void) = 0; }; -} // namespace blender::gpu \ No newline at end of file +} // namespace blender::gpu + +void immActivate(void); +void immDeactivate(void); \ No newline at end of file diff --git a/source/blender/gpu/intern/gpu_init_exit.c b/source/blender/gpu/intern/gpu_init_exit.c index 129a66994b1..0eb2fe57c28 100644 --- a/source/blender/gpu/intern/gpu_init_exit.c +++ b/source/blender/gpu/intern/gpu_init_exit.c @@ -54,10 +54,6 @@ void GPU_init(void) gpu_batch_init(); - if (!G.background) { - immInit(); - } - #ifndef GPU_STANDALONE gpu_pbvh_init(); #endif @@ -69,10 +65,6 @@ void GPU_exit(void) gpu_pbvh_exit(); #endif - if (!G.background) { - immDestroy(); - } - gpu_batch_exit(); gpu_material_library_exit(); diff --git a/source/blender/gpu/opengl/gl_context.cc b/source/blender/gpu/opengl/gl_context.cc index 1f7e191d394..30279ccade1 100644 --- a/source/blender/gpu/opengl/gl_context.cc +++ b/source/blender/gpu/opengl/gl_context.cc @@ -32,6 +32,7 @@ #include "GHOST_C-api.h" #include "gpu_context_private.hh" +#include "gpu_immediate_private.hh" #include "gl_debug.hh" #include "gl_immediate.hh" @@ -151,10 +152,13 @@ void GLContext::activate(void) /* Not really following the state but we should consider * no ubo bound when activating a context. */ bound_ubo_slots = 0; + + immActivate(); } void GLContext::deactivate(void) { + immDeactivate(); is_active_ = false; } diff --git a/source/blender/windowmanager/intern/wm_playanim.c b/source/blender/windowmanager/intern/wm_playanim.c index 86d3f7f35dc..e3c763930c0 100644 --- a/source/blender/windowmanager/intern/wm_playanim.c +++ b/source/blender/windowmanager/intern/wm_playanim.c @@ -1292,7 +1292,6 @@ static char *wm_main_playanim_intern(int argc, const char **argv) /* initialize OpenGL immediate mode */ g_WS.gpu_context = GPU_context_create(g_WS.ghost_window); GPU_init(); - immActivate(); /* initialize the font */ BLF_init(); @@ -1579,8 +1578,6 @@ static char *wm_main_playanim_intern(int argc, const char **argv) GPU_shader_free_builtin_shaders(); - immDeactivate(); - if (g_WS.gpu_context) { GPU_context_active_set(g_WS.gpu_context); GPU_context_discard(g_WS.gpu_context); diff --git a/source/blender/windowmanager/intern/wm_surface.c b/source/blender/windowmanager/intern/wm_surface.c index e8cb5d9cd7d..4139574460b 100644 --- a/source/blender/windowmanager/intern/wm_surface.c +++ b/source/blender/windowmanager/intern/wm_surface.c @@ -56,8 +56,6 @@ void wm_surface_clear_drawable(void) WM_opengl_context_release(g_drawable->ghost_ctx); GPU_context_active_set(NULL); - immDeactivate(); - if (g_drawable->deactivate) { g_drawable->deactivate(); } @@ -79,7 +77,6 @@ void wm_surface_set_drawable(wmSurface *surface, bool activate) } GPU_context_active_set(surface->gpu_ctx); - immActivate(); } void wm_surface_make_drawable(wmSurface *surface) diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 0e19f79e659..795205b8200 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -1099,13 +1099,11 @@ static void wm_window_set_drawable(wmWindowManager *wm, wmWindow *win, bool acti GHOST_ActivateWindowDrawingContext(win->ghostwin); } GPU_context_active_set(win->gpuctx); - immActivate(); } void wm_window_clear_drawable(wmWindowManager *wm) { if (wm->windrawable) { - immDeactivate(); wm->windrawable = NULL; } } -- cgit v1.2.3