diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2024-07-30 12:29:13 +0200 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-07-30 12:29:13 +0200 |
commit | 3e0c10d3931afb62a30f26532a9f7709ee68bf2c (patch) | |
tree | 3aeeb76741b9427c02fd42d0f845d8713ae4ae28 | |
parent | 862d88184320f51763c15e8abb1fea5a3c69e441 (diff) | |
parent | ad0ab2f3961bf58135f24802dd37e0a217e7f738 (diff) | |
download | redot-engine-3e0c10d3931afb62a30f26532a9f7709ee68bf2c.tar.gz |
Merge pull request #94943 from bruvzg/arm64_gl_switch
[Windows] Improve OpenGL/ANGLE switching on ARM64.
-rw-r--r-- | platform/windows/display_server_windows.cpp | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index 020ef0c31b..fa6ed81793 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -5984,13 +5984,32 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win // Init context and rendering device #if defined(GLES3_ENABLED) -#if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) || defined(_M_ARM64) - // There's no native OpenGL drivers on Windows for ARM, switch to ANGLE over DX. + bool fallback = GLOBAL_GET("rendering/gl_compatibility/fallback_to_angle"); + bool show_warning = true; + if (rendering_driver == "opengl3") { - rendering_driver = "opengl3_angle"; + // There's no native OpenGL drivers on Windows for ARM, always enable fallback. +#if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) || defined(_M_ARM64) + fallback = true; + show_warning = false; +#else + typedef BOOL(WINAPI * IsWow64Process2Ptr)(HANDLE, USHORT *, USHORT *); + + IsWow64Process2Ptr IsWow64Process2 = (IsWow64Process2Ptr)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process2"); + if (IsWow64Process2) { + USHORT process_arch = 0; + USHORT machine_arch = 0; + if (!IsWow64Process2(GetCurrentProcess(), &process_arch, &machine_arch)) { + machine_arch = 0; + } + if (machine_arch == 0xAA64) { + fallback = true; + show_warning = false; + } + } +#endif } -#elif defined(EGL_STATIC) - bool fallback = GLOBAL_GET("rendering/gl_compatibility/fallback_to_angle"); + if (fallback && (rendering_driver == "opengl3")) { Dictionary gl_info = detect_wgl(); @@ -6016,11 +6035,12 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win } if (force_angle || (gl_info["version"].operator int() < 30003)) { - WARN_PRINT("Your video card drivers seem not to support the required OpenGL 3.3 version, switching to ANGLE."); + if (show_warning) { + WARN_PRINT("Your video card drivers seem not to support the required OpenGL 3.3 version, switching to ANGLE."); + } rendering_driver = "opengl3_angle"; } } -#endif if (rendering_driver == "opengl3") { gl_manager_native = memnew(GLManagerNative_Windows); |