summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-07-30 12:29:13 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-07-30 12:29:13 +0200
commit3e0c10d3931afb62a30f26532a9f7709ee68bf2c (patch)
tree3aeeb76741b9427c02fd42d0f845d8713ae4ae28
parent862d88184320f51763c15e8abb1fea5a3c69e441 (diff)
parentad0ab2f3961bf58135f24802dd37e0a217e7f738 (diff)
downloadredot-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.cpp34
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);