[Bf-blender-cvs] [ecbba1ff2d3] temp-drawcontext: DRW: Fix GPUViewport's FBOs being free in wrong ogl context.

Clément Foucault noreply at git.blender.org
Fri Feb 23 15:51:42 CET 2018


Commit: ecbba1ff2d32fea2ab89c39238c0a8654e91304a
Author: Clément Foucault
Date:   Thu Feb 22 21:54:34 2018 +0100
Branches: temp-drawcontext
https://developer.blender.org/rBecbba1ff2d32fea2ab89c39238c0a8654e91304a

DRW: Fix GPUViewport's FBOs being free in wrong ogl context.

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

M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/gpu/intern/gpu_viewport.c
M	source/blender/windowmanager/intern/wm_window.c

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

diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 73fd3f562be..1774390a1e5 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -65,6 +65,8 @@
 #include "GPU_viewport.h"
 #include "GPU_matrix.h"
 
+#include "DRW_engine.h"
+
 #include "WM_api.h"
 #include "WM_types.h"
 #include "WM_message.h"
@@ -572,7 +574,9 @@ static void view3d_main_region_exit(wmWindowManager *wm, ARegion *ar)
 	}
 
 	if (rv3d->viewport) {
+		DRW_opengl_context_enable();
 		GPU_viewport_free(rv3d->viewport);
+		DRW_opengl_context_disable();
 		MEM_freeN(rv3d->viewport);
 		rv3d->viewport = NULL;
 	}
@@ -757,7 +761,9 @@ static void view3d_main_region_free(ARegion *ar)
 			GPU_fx_compositor_destroy(rv3d->compositor);
 		}
 		if (rv3d->viewport) {
+			DRW_opengl_context_enable();
 			GPU_viewport_free(rv3d->viewport);
+			DRW_opengl_context_disable();
 			MEM_freeN(rv3d->viewport);
 		}
 
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c
index 665859e4d33..83b9a8f0b0e 100644
--- a/source/blender/gpu/intern/gpu_viewport.c
+++ b/source/blender/gpu/intern/gpu_viewport.c
@@ -467,6 +467,7 @@ cleanup:
 		if (!ok) {
 			GPU_viewport_free(viewport);
 			MEM_freeN(viewport);
+			DRW_opengl_context_disable();
 			return;
 		}
 
@@ -587,6 +588,7 @@ static void gpu_viewport_passes_free(PassList *psl, int psl_len)
 	}
 }
 
+/* Must be executed inside Drawmanager Opengl Context. */
 void GPU_viewport_free(GPUViewport *viewport)
 {
 	gpu_viewport_engines_data_free(viewport);
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 56ee1078bf2..a7baf92e9a0 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -1042,6 +1042,10 @@ void wm_window_make_drawable(wmWindowManager *wm, wmWindow *win)
 void wm_window_reset_drawable(void)
 {
 	wmWindowManager *wm = G.main->wm.first;
+
+	if (wm == NULL)
+		return;
+
 	wmWindow *win = wm->windrawable;
 
 	if (BLI_thread_is_main() && win && win->ghostwin) {



More information about the Bf-blender-cvs mailing list