Skip to content

Commit ad0ab2f

Browse files
committed
[Windows] Improve OpenGL/ANGLE switching on ARM64.
1 parent 0e9caa2 commit ad0ab2f

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

platform/windows/display_server_windows.cpp

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5984,13 +5984,32 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
59845984
// Init context and rendering device
59855985
#if defined(GLES3_ENABLED)
59865986

5987-
#if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) || defined(_M_ARM64)
5988-
// There's no native OpenGL drivers on Windows for ARM, switch to ANGLE over DX.
5987+
bool fallback = GLOBAL_GET("rendering/gl_compatibility/fallback_to_angle");
5988+
bool show_warning = true;
5989+
59895990
if (rendering_driver == "opengl3") {
5990-
rendering_driver = "opengl3_angle";
5991+
// There's no native OpenGL drivers on Windows for ARM, always enable fallback.
5992+
#if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) || defined(_M_ARM64)
5993+
fallback = true;
5994+
show_warning = false;
5995+
#else
5996+
typedef BOOL(WINAPI * IsWow64Process2Ptr)(HANDLE, USHORT *, USHORT *);
5997+
5998+
IsWow64Process2Ptr IsWow64Process2 = (IsWow64Process2Ptr)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process2");
5999+
if (IsWow64Process2) {
6000+
USHORT process_arch = 0;
6001+
USHORT machine_arch = 0;
6002+
if (!IsWow64Process2(GetCurrentProcess(), &process_arch, &machine_arch)) {
6003+
machine_arch = 0;
6004+
}
6005+
if (machine_arch == 0xAA64) {
6006+
fallback = true;
6007+
show_warning = false;
6008+
}
6009+
}
6010+
#endif
59916011
}
5992-
#elif defined(EGL_STATIC)
5993-
bool fallback = GLOBAL_GET("rendering/gl_compatibility/fallback_to_angle");
6012+
59946013
if (fallback && (rendering_driver == "opengl3")) {
59956014
Dictionary gl_info = detect_wgl();
59966015

@@ -6016,11 +6035,12 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
60166035
}
60176036

60186037
if (force_angle || (gl_info["version"].operator int() < 30003)) {
6019-
WARN_PRINT("Your video card drivers seem not to support the required OpenGL 3.3 version, switching to ANGLE.");
6038+
if (show_warning) {
6039+
WARN_PRINT("Your video card drivers seem not to support the required OpenGL 3.3 version, switching to ANGLE.");
6040+
}
60206041
rendering_driver = "opengl3_angle";
60216042
}
60226043
}
6023-
#endif
60246044

60256045
if (rendering_driver == "opengl3") {
60266046
gl_manager_native = memnew(GLManagerNative_Windows);

0 commit comments

Comments
 (0)