diff options
author | Chun-wei Fan <fanc999@yahoo.com.tw> | 2020-07-24 02:37:33 +0000 |
---|---|---|
committer | Chun-wei Fan <fanc999@yahoo.com.tw> | 2020-07-24 02:37:33 +0000 |
commit | 844555384be7ed7c6f2da4ed8f43bac09a8c5edf (patch) | |
tree | cf1b3eedaae21747ef4cc3d98d7920f41643f2ff /gdk/win32 | |
parent | 522e5d4fa55b39dbd4397ed77370dc023db92b4e (diff) | |
parent | 98996aa60bbc1233b63fdc7254d80a4d62a648ba (diff) | |
download | gtk+-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.c | 39 | ||||
-rw-r--r-- | gdk/win32/gdkdisplay-win32.h | 11 | ||||
-rw-r--r-- | gdk/win32/gdkglcontext-win32.c | 4 |
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 |