Skip to content

Commit 28a72fa

Browse files
authored
Merge pull request #95934 from bruvzg/win_ang_fb
Enable fallback from ANGLE to native and improve ANGLE error messages.
2 parents 4cb6e99 + f8a6c0e commit 28a72fa

File tree

4 files changed

+40
-18
lines changed

4 files changed

+40
-18
lines changed

doc/classes/ProjectSettings.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -2526,8 +2526,8 @@
25262526
[b]Note:[/b] This setting is implemented only on Linux/X11.
25272527
</member>
25282528
<member name="rendering/gl_compatibility/fallback_to_native" type="bool" setter="" getter="" default="true">
2529-
If [code]true[/code], the compatibility renderer will fall back to native OpenGL if ANGLE over Metal is not supported.
2530-
[b]Note:[/b] This setting is implemented only on macOS.
2529+
If [code]true[/code], the compatibility renderer will fall back to native OpenGL if ANGLE is not supported, or ANGLE dynamic libraries aren't found.
2530+
[b]Note:[/b] This setting is implemented on macOS and Windows.
25312531
</member>
25322532
<member name="rendering/gl_compatibility/force_angle_on_devices" type="Array" setter="" getter="">
25332533
An [Array] of devices which should always use the ANGLE renderer.

drivers/egl/egl_manager.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ Error EGLManager::initialize(void *p_native_display) {
357357
// have to temporarily get a proper display and reload EGL once again to
358358
// initialize everything else.
359359
if (!gladLoaderLoadEGL(EGL_NO_DISPLAY)) {
360-
ERR_FAIL_V_MSG(ERR_UNAVAILABLE, "Can't load EGL.");
360+
ERR_FAIL_V_MSG(ERR_UNAVAILABLE, "Can't load EGL dynamic library.");
361361
}
362362

363363
EGLDisplay tmp_display = EGL_NO_DISPLAY;
@@ -387,7 +387,7 @@ Error EGLManager::initialize(void *p_native_display) {
387387
int version = gladLoaderLoadEGL(tmp_display);
388388
if (!version) {
389389
eglTerminate(tmp_display);
390-
ERR_FAIL_V_MSG(ERR_UNAVAILABLE, "Can't load EGL.");
390+
ERR_FAIL_V_MSG(ERR_UNAVAILABLE, "Can't load EGL dynamic library.");
391391
}
392392

393393
int major = GLAD_VERSION_MAJOR(version);

platform/macos/display_server_macos.mm

+5-1
Original file line numberDiff line numberDiff line change
@@ -3609,7 +3609,11 @@
36093609
gl_manager_angle = nullptr;
36103610
bool fallback = GLOBAL_GET("rendering/gl_compatibility/fallback_to_native");
36113611
if (fallback) {
3612-
WARN_PRINT("Your video card drivers seem not to support the required Metal version, switching to native OpenGL.");
3612+
#ifdef EGL_STATIC
3613+
WARN_PRINT("Your video card drivers seem not to support GLES3 / ANGLE, switching to native OpenGL.");
3614+
#else
3615+
WARN_PRINT("Your video card drivers seem not to support GLES3 / ANGLE or ANGLE dynamic libraries (libEGL.dylib and libGLESv2.dylib) are missing, switching to native OpenGL.");
3616+
#endif
36133617
rendering_driver = "opengl3";
36143618
} else {
36153619
r_error = ERR_UNAVAILABLE;

platform/windows/display_server_windows.cpp

+31-13
Original file line numberDiff line numberDiff line change
@@ -6183,10 +6183,12 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
61836183
#endif
61846184
}
61856185

6186+
bool gl_supported = true;
61866187
if (fallback && (rendering_driver == "opengl3")) {
61876188
Dictionary gl_info = detect_wgl();
61886189

61896190
bool force_angle = false;
6191+
gl_supported = gl_info["version"].operator int() >= 30003;
61906192

61916193
Vector2i device_id = _get_device_ids(gl_info["name"]);
61926194
Array device_list = GLOBAL_GET("rendering/gl_compatibility/force_angle_on_devices");
@@ -6210,12 +6212,37 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
62106212
if (force_angle || (gl_info["version"].operator int() < 30003)) {
62116213
tested_drivers.set_flag(DRIVER_ID_COMPAT_OPENGL3);
62126214
if (show_warning) {
6213-
WARN_PRINT("Your video card drivers seem not to support the required OpenGL 3.3 version, switching to ANGLE.");
6215+
if (gl_info["version"].operator int() < 30003) {
6216+
WARN_PRINT("Your video card drivers seem not to support the required OpenGL 3.3 version, switching to ANGLE.");
6217+
} else {
6218+
WARN_PRINT("Your video card drivers are known to have low quality OpenGL 3.3 support, switching to ANGLE.");
6219+
}
62146220
}
62156221
rendering_driver = "opengl3_angle";
62166222
}
62176223
}
62186224

6225+
if (rendering_driver == "opengl3_angle") {
6226+
gl_manager_angle = memnew(GLManagerANGLE_Windows);
6227+
tested_drivers.set_flag(DRIVER_ID_COMPAT_ANGLE_D3D11);
6228+
6229+
if (gl_manager_angle->initialize() != OK) {
6230+
memdelete(gl_manager_angle);
6231+
gl_manager_angle = nullptr;
6232+
bool fallback_to_native = GLOBAL_GET("rendering/gl_compatibility/fallback_to_native");
6233+
if (fallback_to_native && gl_supported) {
6234+
#ifdef EGL_STATIC
6235+
WARN_PRINT("Your video card drivers seem not to support GLES3 / ANGLE, switching to native OpenGL.");
6236+
#else
6237+
WARN_PRINT("Your video card drivers seem not to support GLES3 / ANGLE or ANGLE dynamic libraries (libEGL.dll and libGLESv2.dll) are missing, switching to native OpenGL.");
6238+
#endif
6239+
rendering_driver = "opengl3";
6240+
} else {
6241+
r_error = ERR_UNAVAILABLE;
6242+
ERR_FAIL_MSG("Could not initialize ANGLE OpenGL.");
6243+
}
6244+
}
6245+
}
62196246
if (rendering_driver == "opengl3") {
62206247
gl_manager_native = memnew(GLManagerNative_Windows);
62216248
tested_drivers.set_flag(DRIVER_ID_COMPAT_OPENGL3);
@@ -6224,26 +6251,17 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
62246251
memdelete(gl_manager_native);
62256252
gl_manager_native = nullptr;
62266253
r_error = ERR_UNAVAILABLE;
6227-
return;
6254+
ERR_FAIL_MSG("Could not initialize native OpenGL.");
62286255
}
6256+
}
62296257

6258+
if (rendering_driver == "opengl3") {
62306259
RasterizerGLES3::make_current(true);
62316260
}
62326261
if (rendering_driver == "opengl3_angle") {
6233-
gl_manager_angle = memnew(GLManagerANGLE_Windows);
6234-
tested_drivers.set_flag(DRIVER_ID_COMPAT_ANGLE_D3D11);
6235-
6236-
if (gl_manager_angle->initialize() != OK) {
6237-
memdelete(gl_manager_angle);
6238-
gl_manager_angle = nullptr;
6239-
r_error = ERR_UNAVAILABLE;
6240-
return;
6241-
}
6242-
62436262
RasterizerGLES3::make_current(false);
62446263
}
62456264
#endif
6246-
62476265
String appname;
62486266
if (Engine::get_singleton()->is_editor_hint()) {
62496267
appname = "Godot.GodotEditor." + String(VERSION_FULL_CONFIG);

0 commit comments

Comments
 (0)