Merge branch 'wgl-usage-across-threads-324' into 'gtk-3-24'
3.24: GDK-Win32: Use wrapper functions for calling core wgl* functions (backport from GTK-4.x) See merge request GNOME/gtk!7284
This commit is contained in:
		
							
								
								
									
										56
									
								
								gdk/win32/gdkglcontext-win32-private.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								gdk/win32/gdkglcontext-win32-private.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| /* GDK - The GIMP Drawing Kit | ||||
|  * | ||||
|  * gdkglcontext-win32-wgl-private.c: Win32 specific OpenGL wrappers | ||||
|  * | ||||
|  * Copyright © 2023 Chun-wei Fan | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Library General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * Library General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Library General Public | ||||
|  * License along with this library. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * These wrapper functions are used when we don't want to use the wgl*() core functions | ||||
|  * that we acquire via libepoxy (such as when we are disposing the underlying WGL context in, | ||||
|  * GdkGLContext from different threads, so for these calls, we are actually linking to the | ||||
|  * system's/ICD opengl32.dll directly, so that we are guaranteed that the "right" versions of | ||||
|  * these WGL calls are carried out.  This must be a separate source file because we can't | ||||
|  * include the system's GL/gl.h with epoxy/(w)gl.h together in a single source file.  We | ||||
|  * should not need to use these when we are creating/initializing a WGL context in GDK, since | ||||
|  * we should be in the same thread at this point. | ||||
|  */ | ||||
|  | ||||
| #define DONT_INCLUDE_LIBEPOXY | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #include <windows.h> | ||||
| #include <GL/gl.h> | ||||
|  | ||||
| #include "gdkglcontext-win32.h" | ||||
|  | ||||
| void | ||||
| gdk_win32_private_wglDeleteContext (HGLRC hglrc) | ||||
| { | ||||
|   wglDeleteContext (hglrc); | ||||
| } | ||||
|  | ||||
| HGLRC | ||||
| gdk_win32_private_wglGetCurrentContext (void) | ||||
| { | ||||
|   return wglGetCurrentContext (); | ||||
| } | ||||
|  | ||||
| BOOL | ||||
| gdk_win32_private_wglMakeCurrent (HDC   hdc, | ||||
|                                   HGLRC hglrc) | ||||
| { | ||||
|   return wglMakeCurrent (hdc, hglrc); | ||||
| } | ||||
| @ -397,12 +397,12 @@ gdk_win32_gl_context_dispose_wgl (GObject *gobject) | ||||
|     { | ||||
|       GdkWindow *window = gdk_gl_context_get_window (context); | ||||
|  | ||||
|       if (wglGetCurrentContext () == context_wgl->wgl_context) | ||||
|         wglMakeCurrent (NULL, NULL); | ||||
|       if (gdk_win32_private_wglGetCurrentContext () == context_wgl->wgl_context) | ||||
|         gdk_win32_private_wglMakeCurrent (NULL, NULL); | ||||
|  | ||||
|       GDK_NOTE (OPENGL, g_print ("Destroying WGL context\n")); | ||||
|  | ||||
|       wglDeleteContext (context_wgl->wgl_context); | ||||
|       gdk_win32_private_wglDeleteContext (context_wgl->wgl_context); | ||||
|       context_wgl->wgl_context = NULL; | ||||
|  | ||||
|       gdk_win32_gl_context_cleanup (context); | ||||
| @ -843,7 +843,7 @@ gdk_win32_display_make_wgl_context_current (GdkDisplay   *display, | ||||
|  | ||||
|   if (context == NULL) | ||||
|     { | ||||
|       wglMakeCurrent(NULL, NULL); | ||||
|       gdk_win32_private_wglMakeCurrent (NULL, NULL); | ||||
|  | ||||
|       return TRUE; | ||||
|     } | ||||
| @ -851,8 +851,8 @@ gdk_win32_display_make_wgl_context_current (GdkDisplay   *display, | ||||
|   context_win32 = GDK_WIN32_GL_CONTEXT (context); | ||||
|   window = gdk_gl_context_get_window (context); | ||||
|  | ||||
|   if (!wglMakeCurrent (context_win32->gl_hdc, | ||||
|                        GDK_WIN32_GL_CONTEXT_WGL (context)->wgl_context)) | ||||
|   if (!gdk_win32_private_wglMakeCurrent (context_win32->gl_hdc, | ||||
|                                          GDK_WIN32_GL_CONTEXT_WGL (context)->wgl_context)) | ||||
|     { | ||||
|       GDK_NOTE (OPENGL, g_print ("Making WGL context current failed\n")); | ||||
|       return FALSE; | ||||
|  | ||||
| @ -21,20 +21,29 @@ | ||||
| #ifndef __GDK_WIN32_GL_CONTEXT__ | ||||
| #define __GDK_WIN32_GL_CONTEXT__ | ||||
|  | ||||
| #include <epoxy/gl.h> | ||||
| #include <epoxy/wgl.h> | ||||
| #ifdef DONT_INCLUDE_LIBEPOXY | ||||
| # define WIN32_LEAN_AND_MEAN | ||||
| # include <windows.h> | ||||
| # include <GL/gl.h> | ||||
|  | ||||
| #ifdef GDK_WIN32_ENABLE_EGL | ||||
| # include <epoxy/egl.h> | ||||
| # include <glib.h> | ||||
| #else | ||||
| # include <epoxy/gl.h> | ||||
| # include <epoxy/wgl.h> | ||||
|  | ||||
| # ifdef GDK_WIN32_ENABLE_EGL | ||||
| #  include <epoxy/egl.h> | ||||
| # endif | ||||
|  | ||||
| # include "gdkglcontextprivate.h" | ||||
| # include "gdkdisplayprivate.h" | ||||
| # include "gdkvisual.h" | ||||
| # include "gdkwindow.h" | ||||
| #endif | ||||
|  | ||||
| #include "gdkglcontextprivate.h" | ||||
| #include "gdkdisplayprivate.h" | ||||
| #include "gdkvisual.h" | ||||
| #include "gdkwindow.h" | ||||
|  | ||||
| G_BEGIN_DECLS | ||||
|  | ||||
| #ifndef DONT_INCLUDE_LIBEPOXY | ||||
| void | ||||
| gdk_win32_window_invalidate_egl_framebuffer (GdkWindow      *window); | ||||
|  | ||||
| @ -52,6 +61,14 @@ gboolean | ||||
| gdk_win32_display_make_gl_context_current   (GdkDisplay     *display, | ||||
|                                              GdkGLContext   *context); | ||||
|  | ||||
| #endif /* !DONT_INCLUDE_LIBEPOXY */ | ||||
|  | ||||
| HGLRC     gdk_win32_private_wglGetCurrentContext (void); | ||||
| BOOL      gdk_win32_private_wglMakeCurrent       (HDC hdc, | ||||
|                                                   HGLRC hglrc); | ||||
| void      gdk_win32_private_wglDeleteContext     (HGLRC hglrc); | ||||
|  | ||||
|  | ||||
| G_END_DECLS | ||||
|  | ||||
| #endif /* __GDK_WIN32_GL_CONTEXT__ */ | ||||
|  | ||||
| @ -11,6 +11,7 @@ gdk_win32_sources = files( | ||||
|   'gdkevents-win32.c', | ||||
|   'gdkgeometry-win32.c', | ||||
|   'gdkglcontext-win32.c', | ||||
|   'gdkglcontext-win32-private.c', | ||||
|   'gdkglobals-win32.c', | ||||
|   'gdkkeys-win32.c', | ||||
|   'gdkkeys-win32-impl.c', | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Luca Bacci
					Luca Bacci