1
0
Fork 0
This commit is contained in:
憨憨羊の宇航鸽鸽 2025-02-28 01:36:23 +01:00 committed by GitHub
commit 1a55d3324b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 50 additions and 6 deletions

View File

@ -3035,6 +3035,10 @@
If [code]true[/code], the forward renderer will fall back to Direct3D 12 if Vulkan is not supported. The fallback is always attempted regardless of this setting if Vulkan driver support was disabled at compile time.
[b]Note:[/b] This setting is implemented only on Windows.
</member>
<member name="rendering/rendering_device/fallback_to_metal" type="bool" setter="" getter="" default="true">
If [code]true[/code], the forward renderer will fall back to Metal if Vulkan is not supported.
[b]Note:[/b] This setting is implemented only on macOS and iOS.
</member>
<member name="rendering/rendering_device/fallback_to_opengl3" type="bool" setter="" getter="" default="true">
If [code]true[/code], the forward renderer will fall back to OpenGL 3 if Direct3D 12, Metal, and Vulkan are not supported.
[b]Note:[/b] This setting is implemented only on Windows, Android, macOS, iOS, and Linux/X11.

View File

@ -2081,6 +2081,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
GLOBAL_DEF_RST("rendering/rendering_device/fallback_to_vulkan", true);
GLOBAL_DEF_RST("rendering/rendering_device/fallback_to_d3d12", true);
GLOBAL_DEF_RST("rendering/rendering_device/fallback_to_metal", true);
GLOBAL_DEF_RST("rendering/rendering_device/fallback_to_opengl3", true);
}

View File

@ -109,18 +109,39 @@ DisplayServerIOS::DisplayServerIOS(const String &p_rendering_driver, WindowMode
#endif
if (rendering_context) {
if (rendering_context->initialize() != OK) {
bool failed = true;
memdelete(rendering_context);
rendering_context = nullptr;
#if defined(METAL_ENABLED)
bool fallback_to_metal = GLOBAL_GET("rendering/rendering_device/fallback_to_metal");
if (failed && fallback_to_metal && rendering_driver != "metal") {
if (@available(iOS 14.0, *)) {
memdelete(rendering_context);
layer = [AppDelegate.viewController.godotView initializeRenderingForDriver:@"metal"];
wpd.metal.layer = (CAMetalLayer *)layer;
rendering_context = memnew(RenderingContextDriverMetal);
if (rendering_context->initialize() == OK) {
WARN_PRINT("Your device seem not to support MoltenVK, switching to Metal.");
rendering_driver = "metal";
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
failed = false;
}
}
}
#endif
#if defined(GLES3_ENABLED)
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
if (failed && fallback_to_opengl3 && rendering_driver != "opengl3") {
failed = false;
memdelete(rendering_context);
rendering_context = nullptr;
WARN_PRINT("Your device seem not to support MoltenVK or Metal, switching to OpenGL 3.");
rendering_driver = "opengl3";
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
} else
}
#endif
{
if (failed) {
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
r_error = ERR_UNAVAILABLE;
return;

View File

@ -3812,18 +3812,36 @@ DisplayServerMacOS::DisplayServerMacOS(const String &p_rendering_driver, WindowM
if (rendering_context) {
if (rendering_context->initialize() != OK) {
bool failed = true;
memdelete(rendering_context);
rendering_context = nullptr;
#if defined(METAL_ENABLED)
bool fallback_to_metal = GLOBAL_GET("rendering/rendering_device/fallback_to_metal");
if (failed && fallback_to_metal && rendering_driver != "metal") {
memdelete(rendering_context);
rendering_context = memnew(RenderingContextDriverMetal);
rendering_driver = "metal";
if (rendering_context->initialize() == OK) {
WARN_PRINT("Your device seem not to support MoltenVK, switching to Metal.");
rendering_driver = "metal";
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
failed = false;
}
}
#endif
#if defined(GLES3_ENABLED)
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
if (failed && fallback_to_opengl3 && rendering_driver != "opengl3") {
failed = false;
memdelete(rendering_context);
rendering_context = nullptr;
WARN_PRINT("Your device seem not to support MoltenVK or Metal, switching to OpenGL 3.");
rendering_driver = "opengl3";
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
} else
}
#endif
{
if (failed) {
r_error = ERR_CANT_CREATE;
ERR_FAIL_MSG("Could not initialize " + rendering_driver);
}