[Bf-blender-cvs] [ccc512cc619] master: GPUImmediate: Make activation / deactivation implicit

Clément Foucault noreply at git.blender.org
Tue Sep 8 04:15:56 CEST 2020


Commit: ccc512cc619dc9f0e6fd79270a7a96ece34d23b5
Author: Clément Foucault
Date:   Tue Sep 8 03:18:49 2020 +0200
Branches: master
https://developer.blender.org/rBccc512cc619dc9f0e6fd79270a7a96ece34d23b5

GPUImmediate: Make activation / deactivation implicit

This avoids unecessary complexity.

Also makes the GPUImmediate threadsafe by using a threadlocal imm variable.

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

M	intern/ghost/test/multitest/MultiTest.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/gpu/GPU_immediate.h
M	source/blender/gpu/intern/gpu_immediate.cc
M	source/blender/gpu/intern/gpu_immediate_private.hh
M	source/blender/gpu/intern/gpu_init_exit.c
M	source/blender/gpu/opengl/gl_context.cc
M	source/blender/windowmanager/intern/wm_playanim.c
M	source/blender/windowmanager/intern/wm_surface.c
M	source/blender/windowmanager/intern/wm_window.c

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

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;
   }
 }



More information about the Bf-blender-cvs mailing list