summaryrefslogtreecommitdiff
path: root/gdk/win32
diff options
context:
space:
mode:
authorChun-wei Fan <fanc999@yahoo.com.tw>2020-07-24 02:37:33 +0000
committerChun-wei Fan <fanc999@yahoo.com.tw>2020-07-24 02:37:33 +0000
commit844555384be7ed7c6f2da4ed8f43bac09a8c5edf (patch)
treecf1b3eedaae21747ef4cc3d98d7920f41643f2ff /gdk/win32
parent522e5d4fa55b39dbd4397ed77370dc023db92b4e (diff)
parent98996aa60bbc1233b63fdc7254d80a4d62a648ba (diff)
downloadgtk+-844555384be7ed7c6f2da4ed8f43bac09a8c5edf.tar.gz
Merge branch 'gles-windows-arm64' into 'gtk-3-24'
GDK/Win32: Force GLES if running on ARM64 See merge request GNOME/gtk!827
Diffstat (limited to 'gdk/win32')
-rw-r--r--gdk/win32/gdkdisplay-win32.c39
-rw-r--r--gdk/win32/gdkdisplay-win32.h11
-rw-r--r--gdk/win32/gdkglcontext-win32.c4
3 files changed, 53 insertions, 1 deletions
diff --git a/gdk/win32/gdkdisplay-win32.c b/gdk/win32/gdkdisplay-win32.c
index 5c18ba689e..c2b572b402 100644
--- a/gdk/win32/gdkdisplay-win32.c
+++ b/gdk/win32/gdkdisplay-win32.c
@@ -37,6 +37,10 @@
#include "gdkwin32langnotification.h"
+#ifndef IMAGE_FILE_MACHINE_ARM64
+# define IMAGE_FILE_MACHINE_ARM64 0xAA64
+#endif
+
static int debug_indent = 0;
static GdkMonitor *
@@ -1035,6 +1039,40 @@ _gdk_win32_enable_hidpi (GdkWin32Display *display)
}
static void
+_gdk_win32_check_on_arm64 (GdkWin32Display *display)
+{
+ static gsize checked = 0;
+
+ if (g_once_init_enter (&checked))
+ {
+ HMODULE kernel32 = LoadLibraryW (L"kernel32.dll");
+
+ if (kernel32 != NULL)
+ {
+ display->cpu_funcs.isWow64Process2 =
+ (funcIsWow64Process2) GetProcAddress (kernel32, "IsWow64Process2");
+
+ if (display->cpu_funcs.isWow64Process2 != NULL)
+ {
+ USHORT proc_cpu = 0;
+ USHORT native_cpu = 0;
+
+ display->cpu_funcs.isWow64Process2 (GetCurrentProcess (),
+ &proc_cpu,
+ &native_cpu);
+
+ if (native_cpu == IMAGE_FILE_MACHINE_ARM64)
+ display->running_on_arm64 = TRUE;
+ }
+
+ FreeLibrary (kernel32);
+ }
+
+ g_once_init_leave (&checked, 1);
+ }
+}
+
+static void
gdk_win32_display_init (GdkWin32Display *display)
{
const gchar *scale_str = g_getenv ("GDK_SCALE");
@@ -1042,6 +1080,7 @@ gdk_win32_display_init (GdkWin32Display *display)
display->monitors = g_ptr_array_new_with_free_func (g_object_unref);
_gdk_win32_enable_hidpi (display);
+ _gdk_win32_check_on_arm64 (display);
/* if we have DPI awareness, set up fixed scale if set */
if (display->dpi_aware_type != PROCESS_DPI_UNAWARE &&
diff --git a/gdk/win32/gdkdisplay-win32.h b/gdk/win32/gdkdisplay-win32.h
index ad8db96f0f..3089f4dea0 100644
--- a/gdk/win32/gdkdisplay-win32.h
+++ b/gdk/win32/gdkdisplay-win32.h
@@ -60,6 +60,13 @@ typedef struct _GdkWin32User32DPIFuncs
funcIsProcessDPIAware isDpiAwareFunc;
} GdkWin32User32DPIFuncs;
+/* Detect running architecture */
+typedef BOOL (WINAPI *funcIsWow64Process2) (HANDLE, USHORT *, USHORT *);
+typedef struct _GdkWin32KernelCPUFuncs
+{
+ funcIsWow64Process2 isWow64Process2;
+} GdkWin32KernelCPUFuncs;
+
struct _GdkWin32Display
{
GdkDisplay display;
@@ -109,6 +116,10 @@ struct _GdkWin32Display
GdkWin32ShcoreFuncs shcore_funcs;
GdkWin32User32DPIFuncs user32_dpi_funcs;
+
+ /* Running CPU items */
+ guint running_on_arm64 : 1;
+ GdkWin32KernelCPUFuncs cpu_funcs;
};
struct _GdkWin32DisplayClass
diff --git a/gdk/win32/gdkglcontext-win32.c b/gdk/win32/gdkglcontext-win32.c
index 26a8b02a6a..0782c9a59a 100644
--- a/gdk/win32/gdkglcontext-win32.c
+++ b/gdk/win32/gdkglcontext-win32.c
@@ -577,7 +577,9 @@ _gdk_win32_display_init_gl (GdkDisplay *display,
#ifdef GDK_WIN32_ENABLE_EGL
EGLDisplay egl_disp;
- disable_wgl = (_gdk_gl_flags & GDK_GL_GLES) != 0;
+
+ disable_wgl = ((_gdk_gl_flags & GDK_GL_GLES) != 0) ||
+ display_win32->running_on_arm64;
#endif
if (display_win32->have_wgl