[Bf-blender-cvs] [2d94b0d6b06] master: GPU: Add more safeguard for BGL calls

Clément Foucault noreply at git.blender.org
Fri Oct 9 17:00:17 CEST 2020


Commit: 2d94b0d6b062ecdaa1fb8553073cc4d80699ea0e
Author: Clément Foucault
Date:   Fri Oct 9 17:00:00 2020 +0200
Branches: master
https://developer.blender.org/rB2d94b0d6b062ecdaa1fb8553073cc4d80699ea0e

GPU: Add more safeguard for BGL calls

This makes sure no BGL call before window drawing locks the GPUState.

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

M	source/blender/gpu/intern/gpu_state.cc
M	source/blender/windowmanager/intern/wm_draw.c

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

diff --git a/source/blender/gpu/intern/gpu_state.cc b/source/blender/gpu/intern/gpu_state.cc
index 4bdd49cb210..d0048ab9b87 100644
--- a/source/blender/gpu/intern/gpu_state.cc
+++ b/source/blender/gpu/intern/gpu_state.cc
@@ -330,23 +330,28 @@ void GPU_apply_state(void)
 void GPU_bgl_start(void)
 {
   Context *ctx = Context::get();
-  if (ctx && ctx->state_manager) {
-    StateManager &state_manager = *(Context::get()->state_manager);
-    if (state_manager.use_bgl == false) {
-      /* Expected by many addons (see T80169, T81289).
-       * This will reset the blend function. */
-      GPU_blend(GPU_BLEND_NONE);
-      state_manager.apply_state();
-      state_manager.use_bgl = true;
-    }
+  if (!(ctx && ctx->state_manager)) {
+    return;
+  }
+  StateManager &state_manager = *(Context::get()->state_manager);
+  if (state_manager.use_bgl == false) {
+    /* Expected by many addons (see T80169, T81289).
+     * This will reset the blend function. */
+    GPU_blend(GPU_BLEND_NONE);
+    state_manager.apply_state();
+    state_manager.use_bgl = true;
   }
 }
 
+/* Just turn off the bgl safeguard system. Can be called even without GPU_bgl_start. */
 void GPU_bgl_end(void)
 {
   Context *ctx = Context::get();
-  if (ctx && ctx->state_manager) {
-    StateManager &state_manager = *ctx->state_manager;
+  if (!(ctx && ctx->state_manager)) {
+    return;
+  }
+  StateManager &state_manager = *ctx->state_manager;
+  if (state_manager.use_bgl == true) {
     state_manager.use_bgl = false;
     /* Resync state tracking. */
     state_manager.force_state();
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index 2853481381d..a805e00e0a2 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -863,6 +863,10 @@ static void wm_draw_window(bContext *C, wmWindow *win)
 {
   bScreen *screen = WM_window_get_active_screen(win);
   bool stereo = WM_stereo3d_enabled(win, false);
+
+  /* Avoid any BGL call issued before this to alter the window drawin. */
+  GPU_bgl_end();
+
   /* Draw area regions into their own framebuffer. This way we can redraw
    * the areas that need it, and blit the rest from existing framebuffers. */
   wm_draw_window_offscreen(C, win, stereo);



More information about the Bf-blender-cvs mailing list