[Bf-blender-cvs] [b6fb1d07a2f] temp-drawcontext: WM: Add offscreen context functions.

Clément Foucault noreply at git.blender.org
Fri Feb 9 21:05:19 CET 2018


Commit: b6fb1d07a2f43413cbe3158f536618c2a931ed5f
Author: Clément Foucault
Date:   Fri Feb 9 20:34:14 2018 +0100
Branches: temp-drawcontext
https://developer.blender.org/rBb6fb1d07a2f43413cbe3158f536618c2a931ed5f

WM: Add offscreen context functions.

Windows are drawn in order on one thread, the main thread. If the drawmanager is called the context is changed. wm_window_reset_drawable() function to reset the current window context to resume drawing.

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

M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_window.c
M	source/blender/windowmanager/wm_window.h

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

diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 7a66cc04014..835e28457f2 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -116,6 +116,10 @@ struct bScreen *WM_window_get_active_screen(const struct wmWindow *win) ATTR_NON
 void            WM_window_set_active_screen(struct wmWindow *win, struct WorkSpace *workspace, struct bScreen *screen) ATTR_NONNULL(1);
 bool WM_window_is_temp_screen(const struct wmWindow *win) ATTR_WARN_UNUSED_RESULT;
 
+void *WM_context_create(void);
+void WM_context_dispose(void *context);
+void WM_context_activate(void *context);
+
 /* defines for 'type' WM_window_open_temp */
 enum {
 	WM_WINDOW_RENDER = 1,
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 0e07b66996d..6c26b87b04c 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -95,6 +95,8 @@
 
 /* the global to talk to ghost */
 static GHOST_SystemHandle g_system = NULL;
+/* Active window */
+static GHOST_WindowHandle g_active_window = NULL;
 
 typedef enum WinOverrideFlag {
 	WIN_OVERRIDE_GEOM     = (1 << 0),
@@ -492,6 +494,8 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm, const char *title, wm
 #endif
 	                              GHOST_kDrawingContextTypeOpenGL,
 	                              glSettings);
+
+	g_active_window = ghostwin;
 	
 	if (ghostwin) {
 		GHOST_RectangleHandle bounds;
@@ -1022,6 +1026,7 @@ void wm_window_make_drawable(wmWindowManager *wm, wmWindow *win)
 
 		immDeactivate();
 		GHOST_ActivateWindowDrawingContext(win->ghostwin);
+		g_active_window = win->ghostwin;
 		immActivate();
 
 		/* this can change per window */
@@ -1029,6 +1034,19 @@ void wm_window_make_drawable(wmWindowManager *wm, wmWindow *win)
 	}
 }
 
+/* Reset active the current window opengl drawing context. */
+void wm_window_reset_drawable(void)
+{
+	if (BLI_thread_is_main()) {
+		immDeactivate();
+		GHOST_ActivateWindowDrawingContext(g_active_window);
+		immActivate();
+	}
+	else {
+		/* TODO unbind the context (set context to NULL) */
+	}
+}
+
 /* called by ghost, here we handle events for windows themselves or send to event system */
 /* mouse coordinate converversion happens here */
 static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr)
@@ -2022,3 +2040,20 @@ void wm_window_IME_end(wmWindow *win)
 	win->ime_data = NULL;
 }
 #endif  /* WITH_INPUT_IME */
+
+/* ****** direct opengl context management ****** */
+
+void *WM_context_create(void)
+{
+	return GHOST_CreateOffscreenContext(g_system);
+}
+
+void WM_context_dispose(void *context)
+{
+	GHOST_DisposeOffscreenContext(g_system, (GHOST_ContextHandle)context);
+}
+
+void WM_context_activate(void *context)
+{
+	GHOST_ActivateOffscreenContext((GHOST_ContextHandle)context);
+}
diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h
index 0264955a4c5..652cefb1a54 100644
--- a/source/blender/windowmanager/wm_window.h
+++ b/source/blender/windowmanager/wm_window.h
@@ -58,6 +58,7 @@ void		wm_window_process_events	(const bContext *C);
 void		wm_window_process_events_nosleep(void);
 
 void		wm_window_make_drawable(wmWindowManager *wm, wmWindow *win);
+void		wm_window_reset_drawable(void);
 
 void		wm_window_raise			(wmWindow *win);
 void		wm_window_lower			(wmWindow *win);



More information about the Bf-blender-cvs mailing list