Skip to content

Commit 05a4620

Browse files
committed
Merge pull request godotengine#98615 from Summersay415/three-opengls-please
Fix fallbacks to OpenGL
2 parents 73830b3 + 6d14cd6 commit 05a4620

File tree

7 files changed

+76
-42
lines changed

7 files changed

+76
-42
lines changed

platform/android/display_server_android.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -625,12 +625,6 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
625625

626626
native_menu = memnew(NativeMenu);
627627

628-
#if defined(GLES3_ENABLED)
629-
if (rendering_driver == "opengl3") {
630-
RasterizerGLES3::make_current(false);
631-
}
632-
#endif
633-
634628
#if defined(RD_ENABLED)
635629
rendering_context = nullptr;
636630
rendering_device = nullptr;
@@ -645,19 +639,24 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
645639
if (rendering_context->initialize() != OK) {
646640
memdelete(rendering_context);
647641
rendering_context = nullptr;
642+
#if defined(GLES3_ENABLED)
648643
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
649644
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
650645
WARN_PRINT("Your device seem not to support Vulkan, switching to OpenGL 3.");
651646
rendering_driver = "opengl3";
652647
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
653648
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
654-
} else {
649+
} else
650+
#endif
651+
{
655652
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
656653
r_error = ERR_UNAVAILABLE;
657654
return;
658655
}
659656
}
657+
}
660658

659+
if (rendering_context) {
661660
union {
662661
#ifdef VULKAN_ENABLED
663662
RenderingContextDriverVulkanAndroid::WindowPlatformData vulkan;
@@ -697,6 +696,12 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
697696
}
698697
#endif
699698

699+
#if defined(GLES3_ENABLED)
700+
if (rendering_driver == "opengl3") {
701+
RasterizerGLES3::make_current(false);
702+
}
703+
#endif
704+
700705
Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events);
701706

702707
r_error = OK;

platform/android/java/lib/src/org/godotengine/godot/Godot.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -479,12 +479,17 @@ class Godot(private val context: Context) {
479479
// ...add to FrameLayout
480480
containerLayout?.addView(editText)
481481
renderView = if (usesVulkan()) {
482-
if (!meetsVulkanRequirements(activity.packageManager)) {
482+
if (meetsVulkanRequirements(activity.packageManager)) {
483+
GodotVulkanRenderView(host, this, godotInputHandler)
484+
} else if (canFallbackToOpenGL()) {
485+
// Fallback to OpenGl.
486+
GodotGLRenderView(host, this, godotInputHandler, xrMode, useDebugOpengl)
487+
} else {
483488
throw IllegalStateException(activity.getString(R.string.error_missing_vulkan_requirements_message))
484489
}
485-
GodotVulkanRenderView(host, this, godotInputHandler)
490+
486491
} else {
487-
// Fallback to openGl
492+
// Fallback to OpenGl.
488493
GodotGLRenderView(host, this, godotInputHandler, xrMode, useDebugOpengl)
489494
}
490495

@@ -818,6 +823,13 @@ class Godot(private val context: Context) {
818823
return ("forward_plus" == renderer || "mobile" == renderer) && "vulkan" == renderingDevice
819824
}
820825

826+
/**
827+
* Returns true if can fallback to OpenGL.
828+
*/
829+
private fun canFallbackToOpenGL(): Boolean {
830+
return java.lang.Boolean.parseBoolean(GodotLib.getGlobal("rendering/rendering_device/fallback_to_opengl3"))
831+
}
832+
821833
/**
822834
* Returns true if the device meets the base requirements for Vulkan support, false otherwise.
823835
*/

platform/ios/display_server_ios.mm

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,19 +111,24 @@
111111
if (rendering_context->initialize() != OK) {
112112
memdelete(rendering_context);
113113
rendering_context = nullptr;
114+
#if defined(GLES3_ENABLED)
114115
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
115116
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
116117
WARN_PRINT("Your device seem not to support MoltenVK or Metal, switching to OpenGL 3.");
117118
rendering_driver = "opengl3";
118119
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
119120
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
120-
} else {
121+
} else
122+
#endif
123+
{
121124
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
122125
r_error = ERR_UNAVAILABLE;
123126
return;
124127
}
125128
}
129+
}
126130

131+
if (rendering_context) {
127132
if (rendering_context->window_create(MAIN_WINDOW_ID, &wpd) != OK) {
128133
ERR_PRINT(vformat("Failed to create %s window.", rendering_driver));
129134
memdelete(rendering_context);

platform/linuxbsd/wayland/display_server_wayland.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1356,13 +1356,16 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
13561356
if (rendering_context->initialize() != OK) {
13571357
memdelete(rendering_context);
13581358
rendering_context = nullptr;
1359+
#if defined(GLES3_ENABLED)
13591360
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
13601361
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
13611362
WARN_PRINT("Your video card drivers seem not to support the required Vulkan version, switching to OpenGL 3.");
13621363
rendering_driver = "opengl3";
13631364
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
13641365
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
1365-
} else {
1366+
} else
1367+
#endif // GLES3_ENABLED
1368+
{
13661369
r_error = ERR_CANT_CREATE;
13671370

13681371
if (p_rendering_driver == "vulkan") {

platform/linuxbsd/x11/display_server_x11.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6168,13 +6168,16 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
61686168
if (rendering_context->initialize() != OK) {
61696169
memdelete(rendering_context);
61706170
rendering_context = nullptr;
6171+
#if defined(GLES3_ENABLED)
61716172
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
61726173
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
61736174
WARN_PRINT("Your video card drivers seem not to support the required Vulkan version, switching to OpenGL 3.");
61746175
rendering_driver = "opengl3";
61756176
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
61766177
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
6177-
} else {
6178+
} else
6179+
#endif // GLES3_ENABLED
6180+
{
61786181
r_error = ERR_CANT_CREATE;
61796182

61806183
if (p_rendering_driver == "vulkan") {

platform/macos/display_server_macos.mm

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3623,6 +3623,39 @@
36233623
//TODO - do Vulkan and OpenGL support checks, driver selection and fallback
36243624
rendering_driver = p_rendering_driver;
36253625

3626+
#if defined(RD_ENABLED)
3627+
#if defined(VULKAN_ENABLED)
3628+
if (rendering_driver == "vulkan") {
3629+
rendering_context = memnew(RenderingContextDriverVulkanMacOS);
3630+
}
3631+
#endif
3632+
#if defined(METAL_ENABLED)
3633+
if (rendering_driver == "metal") {
3634+
rendering_context = memnew(RenderingContextDriverMetal);
3635+
}
3636+
#endif
3637+
3638+
if (rendering_context) {
3639+
if (rendering_context->initialize() != OK) {
3640+
memdelete(rendering_context);
3641+
rendering_context = nullptr;
3642+
#if defined(GLES3_ENABLED)
3643+
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
3644+
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
3645+
WARN_PRINT("Your device seem not to support MoltenVK or Metal, switching to OpenGL 3.");
3646+
rendering_driver = "opengl3";
3647+
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
3648+
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
3649+
} else
3650+
#endif
3651+
{
3652+
r_error = ERR_CANT_CREATE;
3653+
ERR_FAIL_MSG("Could not initialize " + rendering_driver);
3654+
}
3655+
}
3656+
}
3657+
#endif
3658+
36263659
#if defined(GLES3_ENABLED)
36273660
if (rendering_driver == "opengl3_angle") {
36283661
gl_manager_angle = memnew(GLManagerANGLE_MacOS);
@@ -3655,35 +3688,6 @@
36553688
}
36563689
}
36573690
#endif
3658-
#if defined(RD_ENABLED)
3659-
#if defined(VULKAN_ENABLED)
3660-
if (rendering_driver == "vulkan") {
3661-
rendering_context = memnew(RenderingContextDriverVulkanMacOS);
3662-
}
3663-
#endif
3664-
#if defined(METAL_ENABLED)
3665-
if (rendering_driver == "metal") {
3666-
rendering_context = memnew(RenderingContextDriverMetal);
3667-
}
3668-
#endif
3669-
3670-
if (rendering_context) {
3671-
if (rendering_context->initialize() != OK) {
3672-
memdelete(rendering_context);
3673-
rendering_context = nullptr;
3674-
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
3675-
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
3676-
WARN_PRINT("Your device seem not to support MoltenVK or Metal, switching to OpenGL 3.");
3677-
rendering_driver = "opengl3";
3678-
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
3679-
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
3680-
} else {
3681-
r_error = ERR_CANT_CREATE;
3682-
ERR_FAIL_MSG("Could not initialize " + rendering_driver);
3683-
}
3684-
}
3685-
}
3686-
#endif
36873691

36883692
Point2i window_position;
36893693
if (p_position != nullptr) {

platform/windows/display_server_windows.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6238,6 +6238,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
62386238
}
62396239
}
62406240
#endif
6241+
#if defined(GLES3_ENABLED)
62416242
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
62426243
if (failed && fallback_to_opengl3 && rendering_driver != "opengl3") {
62436244
memdelete(rendering_context);
@@ -6249,6 +6250,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
62496250
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
62506251
failed = false;
62516252
}
6253+
#endif
62526254
if (failed) {
62536255
memdelete(rendering_context);
62546256
rendering_context = nullptr;

0 commit comments

Comments
 (0)