[Bf-blender-cvs] [75f82845454] temp-drawcontext: GPU: Clear Batches VAOs upon window context switchs.

Clément Foucault noreply at git.blender.org
Fri Feb 23 17:24:20 CET 2018


Commit: 75f8284545412375f3cfb8f276ac6e511bc07cb7
Author: Clément Foucault
Date:   Fri Feb 23 16:42:51 2018 +0100
Branches: temp-drawcontext
https://developer.blender.org/rB75f8284545412375f3cfb8f276ac6e511bc07cb7

GPU: Clear Batches VAOs upon window context switchs.

This way all windows can display the preset batches correctly.

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

M	source/blender/gpu/GPU_batch.h
M	source/blender/gpu/intern/gpu_batch_presets.c
M	source/blender/windowmanager/intern/wm_window.c

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

diff --git a/source/blender/gpu/GPU_batch.h b/source/blender/gpu/GPU_batch.h
index 5807af7b359..fda24018150 100644
--- a/source/blender/gpu/GPU_batch.h
+++ b/source/blender/gpu/GPU_batch.h
@@ -32,6 +32,7 @@
 #define __GPU_BATCH_H__
 
 #include "../../../intern/gawain/gawain/gwn_batch.h"
+#include "../../../intern/gawain/gawain/gwn_batch_private.h"
 
 struct rctf;
 
@@ -65,6 +66,7 @@ Gwn_Batch *GPU_batch_preset_sphere(int lod) ATTR_WARN_UNUSED_RESULT;
 Gwn_Batch *GPU_batch_preset_sphere_wire(int lod) ATTR_WARN_UNUSED_RESULT;
 
 void gpu_batch_presets_init(void);
+void gpu_batch_presets_reset(void);
 void gpu_batch_presets_exit(void);
 
 #endif  /* __GPU_BATCH_H__ */
diff --git a/source/blender/gpu/intern/gpu_batch_presets.c b/source/blender/gpu/intern/gpu_batch_presets.c
index 21d6906083a..950f1a2dab3 100644
--- a/source/blender/gpu/intern/gpu_batch_presets.c
+++ b/source/blender/gpu/intern/gpu_batch_presets.c
@@ -193,6 +193,17 @@ void gpu_batch_presets_init(void)
 	g_presets_3d.batch.sphere_wire_med = batch_sphere_wire(8, 16);
 }
 
+void gpu_batch_presets_reset(void)
+{
+	/* Reset vao caches for these every time we switch opengl context.
+	 * This way they will draw correctly for each window. */
+	gwn_batch_vao_cache_clear(g_presets_3d.batch.sphere_low);
+	gwn_batch_vao_cache_clear(g_presets_3d.batch.sphere_med);
+	gwn_batch_vao_cache_clear(g_presets_3d.batch.sphere_high);
+	gwn_batch_vao_cache_clear(g_presets_3d.batch.sphere_wire_low);
+	gwn_batch_vao_cache_clear(g_presets_3d.batch.sphere_wire_med);
+}
+
 void gpu_batch_presets_exit(void)
 {
 	GWN_batch_discard(g_presets_3d.batch.sphere_low);
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index a7baf92e9a0..1ae2ff14efd 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -79,6 +79,7 @@
 
 #include "PIL_time.h"
 
+#include "GPU_batch.h"
 #include "GPU_draw.h"
 #include "GPU_extensions.h"
 #include "GPU_init_exit.h"
@@ -381,6 +382,7 @@ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
 		}
 
 		if (tmpwin) {
+			gpu_batch_presets_reset();
 			immDeactivate();
 		}
 
@@ -1028,6 +1030,7 @@ void wm_window_make_drawable(wmWindowManager *wm, wmWindow *win)
 			printf("%s: set drawable %d\n", __func__, win->winid);
 		}
 
+		gpu_batch_presets_reset();
 		immDeactivate();
 		GHOST_ActivateWindowDrawingContext(win->ghostwin);
 		GWN_context_active_set(win->gwnctx);
@@ -1049,6 +1052,7 @@ void wm_window_reset_drawable(void)
 	wmWindow *win = wm->windrawable;
 
 	if (BLI_thread_is_main() && win && win->ghostwin) {
+		gpu_batch_presets_reset();
 		immDeactivate();
 		GHOST_ActivateWindowDrawingContext(win->ghostwin);
 		GWN_context_active_set(win->gwnctx);



More information about the Bf-blender-cvs mailing list