diff --git a/gdk/meson.build b/gdk/meson.build
index 4bb1bf2b6c..297c38c68e 100644
--- a/gdk/meson.build
+++ b/gdk/meson.build
@@ -216,6 +216,7 @@ if win32_enabled
cc.find_library('comctl32'),
cc.find_library('dwmapi'),
cc.find_library('imm32'),
+ cc.find_library('opengl32'),
cc.find_library('setupapi'),
cc.find_library('winmm')]
diff --git a/gdk/win32/gdkglcontext-win32-private.c b/gdk/win32/gdkglcontext-win32-private.c
new file mode 100644
index 0000000000..a5ab83a7e8
--- /dev/null
+++ b/gdk/win32/gdkglcontext-win32-private.c
@@ -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 .
+ */
+
+/*
+ * 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
+#include
+
+#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);
+}
diff --git a/gdk/win32/gdkglcontext-win32.c b/gdk/win32/gdkglcontext-win32.c
index d303df2a63..f5507f1232 100644
--- a/gdk/win32/gdkglcontext-win32.c
+++ b/gdk/win32/gdkglcontext-win32.c
@@ -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;
diff --git a/gdk/win32/gdkglcontext-win32.h b/gdk/win32/gdkglcontext-win32.h
index a4b8b2dda2..49e67da064 100644
--- a/gdk/win32/gdkglcontext-win32.h
+++ b/gdk/win32/gdkglcontext-win32.h
@@ -21,20 +21,29 @@
#ifndef __GDK_WIN32_GL_CONTEXT__
#define __GDK_WIN32_GL_CONTEXT__
-#include
-#include
+#ifdef DONT_INCLUDE_LIBEPOXY
+# define WIN32_LEAN_AND_MEAN
+# include
+# include
-#ifdef GDK_WIN32_ENABLE_EGL
-# include
+# include
+#else
+# include
+# include
+
+# ifdef GDK_WIN32_ENABLE_EGL
+# include
+# 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__ */
diff --git a/gdk/win32/meson.build b/gdk/win32/meson.build
index ce35090aec..ff4b58da0f 100644
--- a/gdk/win32/meson.build
+++ b/gdk/win32/meson.build
@@ -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',