Skip to content

Commit 3b83934

Browse files
committed
Added fallback_to_opengl3
1 parent 84dcdde commit 3b83934

File tree

7 files changed

+68
-20
lines changed

7 files changed

+68
-20
lines changed

doc/classes/ProjectSettings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2795,6 +2795,10 @@
27952795
If [code]true[/code], the forward renderer will fall back to Direct3D 12 if Vulkan is not supported.
27962796
[b]Note:[/b] This setting is implemented only on Windows.
27972797
</member>
2798+
<member name="rendering/rendering_device/fallback_to_opengl3" type="bool" setter="" getter="" default="true">
2799+
If [code]true[/code], the forward renderer will fall back to OpenGL 3 if both Direct3D 12, Metal and Vulkan are not supported.
2800+
[b]Note:[/b] This setting is implemented only on Windows, Android, macOS, iOS, and Linux/X11.
2801+
</member>
27982802
<member name="rendering/rendering_device/fallback_to_vulkan" type="bool" setter="" getter="" default="true">
27992803
If [code]true[/code], the forward renderer will fall back to Vulkan if Direct3D 12 is not supported.
28002804
[b]Note:[/b] This setting is implemented only on Windows.

main/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1977,6 +1977,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
19771977

19781978
GLOBAL_DEF_RST("rendering/rendering_device/fallback_to_vulkan", true);
19791979
GLOBAL_DEF_RST("rendering/rendering_device/fallback_to_d3d12", true);
1980+
GLOBAL_DEF_RST("rendering/rendering_device/fallback_to_opengl3", true);
19801981
}
19811982

19821983
{

platform/android/display_server_android.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -607,11 +607,19 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
607607

608608
if (rendering_context) {
609609
if (rendering_context->initialize() != OK) {
610-
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
611610
memdelete(rendering_context);
612611
rendering_context = nullptr;
613-
r_error = ERR_UNAVAILABLE;
614-
return;
612+
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
613+
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
614+
WARN_PRINT("Your device seem not to support Vulkan, switching to OpenGL 3.");
615+
rendering_driver = "opengl3";
616+
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
617+
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
618+
} else {
619+
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
620+
r_error = ERR_UNAVAILABLE;
621+
return;
622+
}
615623
}
616624

617625
union {

platform/ios/display_server_ios.mm

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,19 @@
107107
#endif
108108
if (rendering_context) {
109109
if (rendering_context->initialize() != OK) {
110-
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
111110
memdelete(rendering_context);
112111
rendering_context = nullptr;
113-
r_error = ERR_UNAVAILABLE;
114-
return;
112+
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
113+
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
114+
WARN_PRINT("Your device seem not to support MoltenVK or Metal, switching to OpenGL 3.");
115+
rendering_driver = "opengl3";
116+
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
117+
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
118+
} else {
119+
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
120+
r_error = ERR_UNAVAILABLE;
121+
return;
122+
}
115123
}
116124

117125
if (rendering_context->window_create(MAIN_WINDOW_ID, &wpd) != OK) {

platform/linuxbsd/x11/display_server_x11.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6160,20 +6160,28 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
61606160
if (rendering_context->initialize() != OK) {
61616161
memdelete(rendering_context);
61626162
rendering_context = nullptr;
6163-
r_error = ERR_CANT_CREATE;
6163+
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
6164+
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
6165+
WARN_PRINT("Your video card drivers seem not to support the required Vulkan version, switching to OpenGL 3.");
6166+
rendering_driver = "opengl3";
6167+
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
6168+
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
6169+
} else {
6170+
r_error = ERR_CANT_CREATE;
6171+
6172+
if (p_rendering_driver == "vulkan") {
6173+
OS::get_singleton()->alert(
6174+
vformat("Your video card drivers seem not to support the required Vulkan version.\n\n"
6175+
"If possible, consider updating your video card drivers or using the OpenGL 3 driver.\n\n"
6176+
"You can enable the OpenGL 3 driver by starting the engine from the\n"
6177+
"command line with the command:\n\n \"%s\" --rendering-driver opengl3\n\n"
6178+
"If you recently updated your video card drivers, try rebooting.",
6179+
executable_name),
6180+
"Unable to initialize Vulkan video driver");
6181+
}
61646182

6165-
if (p_rendering_driver == "vulkan") {
6166-
OS::get_singleton()->alert(
6167-
vformat("Your video card drivers seem not to support the required Vulkan version.\n\n"
6168-
"If possible, consider updating your video card drivers or using the OpenGL 3 driver.\n\n"
6169-
"You can enable the OpenGL 3 driver by starting the engine from the\n"
6170-
"command line with the command:\n\n \"%s\" --rendering-driver opengl3\n\n"
6171-
"If you recently updated your video card drivers, try rebooting.",
6172-
executable_name),
6173-
"Unable to initialize Vulkan video driver");
6183+
ERR_FAIL_MSG(vformat("Could not initialize %s", rendering_driver));
61746184
}
6175-
6176-
ERR_FAIL_MSG(vformat("Could not initialize %s", rendering_driver));
61776185
}
61786186
driver_found = true;
61796187
}

platform/macos/display_server_macos.mm

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3649,8 +3649,16 @@
36493649
if (rendering_context->initialize() != OK) {
36503650
memdelete(rendering_context);
36513651
rendering_context = nullptr;
3652-
r_error = ERR_CANT_CREATE;
3653-
ERR_FAIL_MSG("Could not initialize " + rendering_driver);
3652+
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
3653+
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
3654+
WARN_PRINT("Your device seem not to support MoltenVK or Metal, switching to OpenGL 3.");
3655+
rendering_driver = "opengl3";
3656+
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
3657+
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
3658+
} else {
3659+
r_error = ERR_CANT_CREATE;
3660+
ERR_FAIL_MSG("Could not initialize " + rendering_driver);
3661+
}
36543662
}
36553663
}
36563664
#endif

platform/windows/display_server_windows.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6177,6 +6177,17 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
61776177
}
61786178
}
61796179
#endif
6180+
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
6181+
if (failed && fallback_to_opengl3 && rendering_driver != "opengl3") {
6182+
memdelete(rendering_context);
6183+
rendering_context = nullptr;
6184+
tested_drivers.set_flag(DRIVER_ID_COMPAT_OPENGL3);
6185+
WARN_PRINT("Your video card drivers seem not to support Direct3D 12 or Vulkan, switching to OpenGL 3.");
6186+
rendering_driver = "opengl3";
6187+
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
6188+
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
6189+
failed = false;
6190+
}
61806191
if (failed) {
61816192
memdelete(rendering_context);
61826193
rendering_context = nullptr;

0 commit comments

Comments
 (0)