You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-09 12:50:35 +00:00
Merge pull request #98615 from Summersay415/three-opengls-please
Fix fallbacks to OpenGL
This commit is contained in:
@@ -625,12 +625,6 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
|
|||||||
|
|
||||||
native_menu = memnew(NativeMenu);
|
native_menu = memnew(NativeMenu);
|
||||||
|
|
||||||
#if defined(GLES3_ENABLED)
|
|
||||||
if (rendering_driver == "opengl3") {
|
|
||||||
RasterizerGLES3::make_current(false);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(RD_ENABLED)
|
#if defined(RD_ENABLED)
|
||||||
rendering_context = nullptr;
|
rendering_context = nullptr;
|
||||||
rendering_device = nullptr;
|
rendering_device = nullptr;
|
||||||
@@ -645,19 +639,24 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
|
|||||||
if (rendering_context->initialize() != OK) {
|
if (rendering_context->initialize() != OK) {
|
||||||
memdelete(rendering_context);
|
memdelete(rendering_context);
|
||||||
rendering_context = nullptr;
|
rendering_context = nullptr;
|
||||||
|
#if defined(GLES3_ENABLED)
|
||||||
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
||||||
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
|
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
|
||||||
WARN_PRINT("Your device seem not to support Vulkan, switching to OpenGL 3.");
|
WARN_PRINT("Your device seem not to support Vulkan, switching to OpenGL 3.");
|
||||||
rendering_driver = "opengl3";
|
rendering_driver = "opengl3";
|
||||||
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
|
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
|
||||||
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
|
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
|
||||||
} else {
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
|
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
|
||||||
r_error = ERR_UNAVAILABLE;
|
r_error = ERR_UNAVAILABLE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rendering_context) {
|
||||||
union {
|
union {
|
||||||
#ifdef VULKAN_ENABLED
|
#ifdef VULKAN_ENABLED
|
||||||
RenderingContextDriverVulkanAndroid::WindowPlatformData vulkan;
|
RenderingContextDriverVulkanAndroid::WindowPlatformData vulkan;
|
||||||
@@ -697,6 +696,12 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLES3_ENABLED)
|
||||||
|
if (rendering_driver == "opengl3") {
|
||||||
|
RasterizerGLES3::make_current(false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events);
|
Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events);
|
||||||
|
|
||||||
r_error = OK;
|
r_error = OK;
|
||||||
|
|||||||
@@ -479,12 +479,17 @@ class Godot(private val context: Context) {
|
|||||||
// ...add to FrameLayout
|
// ...add to FrameLayout
|
||||||
containerLayout?.addView(editText)
|
containerLayout?.addView(editText)
|
||||||
renderView = if (usesVulkan()) {
|
renderView = if (usesVulkan()) {
|
||||||
if (!meetsVulkanRequirements(activity.packageManager)) {
|
if (meetsVulkanRequirements(activity.packageManager)) {
|
||||||
|
GodotVulkanRenderView(host, this, godotInputHandler)
|
||||||
|
} else if (canFallbackToOpenGL()) {
|
||||||
|
// Fallback to OpenGl.
|
||||||
|
GodotGLRenderView(host, this, godotInputHandler, xrMode, useDebugOpengl)
|
||||||
|
} else {
|
||||||
throw IllegalStateException(activity.getString(R.string.error_missing_vulkan_requirements_message))
|
throw IllegalStateException(activity.getString(R.string.error_missing_vulkan_requirements_message))
|
||||||
}
|
}
|
||||||
GodotVulkanRenderView(host, this, godotInputHandler)
|
|
||||||
} else {
|
} else {
|
||||||
// Fallback to openGl
|
// Fallback to OpenGl.
|
||||||
GodotGLRenderView(host, this, godotInputHandler, xrMode, useDebugOpengl)
|
GodotGLRenderView(host, this, godotInputHandler, xrMode, useDebugOpengl)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -818,6 +823,13 @@ class Godot(private val context: Context) {
|
|||||||
return ("forward_plus" == renderer || "mobile" == renderer) && "vulkan" == renderingDevice
|
return ("forward_plus" == renderer || "mobile" == renderer) && "vulkan" == renderingDevice
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if can fallback to OpenGL.
|
||||||
|
*/
|
||||||
|
private fun canFallbackToOpenGL(): Boolean {
|
||||||
|
return java.lang.Boolean.parseBoolean(GodotLib.getGlobal("rendering/rendering_device/fallback_to_opengl3"))
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the device meets the base requirements for Vulkan support, false otherwise.
|
* Returns true if the device meets the base requirements for Vulkan support, false otherwise.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -111,19 +111,24 @@ DisplayServerIOS::DisplayServerIOS(const String &p_rendering_driver, WindowMode
|
|||||||
if (rendering_context->initialize() != OK) {
|
if (rendering_context->initialize() != OK) {
|
||||||
memdelete(rendering_context);
|
memdelete(rendering_context);
|
||||||
rendering_context = nullptr;
|
rendering_context = nullptr;
|
||||||
|
#if defined(GLES3_ENABLED)
|
||||||
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
||||||
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
|
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
|
||||||
WARN_PRINT("Your device seem not to support MoltenVK or Metal, switching to OpenGL 3.");
|
WARN_PRINT("Your device seem not to support MoltenVK or Metal, switching to OpenGL 3.");
|
||||||
rendering_driver = "opengl3";
|
rendering_driver = "opengl3";
|
||||||
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
|
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
|
||||||
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
|
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
|
||||||
} else {
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
|
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
|
||||||
r_error = ERR_UNAVAILABLE;
|
r_error = ERR_UNAVAILABLE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rendering_context) {
|
||||||
if (rendering_context->window_create(MAIN_WINDOW_ID, &wpd) != OK) {
|
if (rendering_context->window_create(MAIN_WINDOW_ID, &wpd) != OK) {
|
||||||
ERR_PRINT(vformat("Failed to create %s window.", rendering_driver));
|
ERR_PRINT(vformat("Failed to create %s window.", rendering_driver));
|
||||||
memdelete(rendering_context);
|
memdelete(rendering_context);
|
||||||
|
|||||||
@@ -1356,13 +1356,16 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
|
|||||||
if (rendering_context->initialize() != OK) {
|
if (rendering_context->initialize() != OK) {
|
||||||
memdelete(rendering_context);
|
memdelete(rendering_context);
|
||||||
rendering_context = nullptr;
|
rendering_context = nullptr;
|
||||||
|
#if defined(GLES3_ENABLED)
|
||||||
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
||||||
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
|
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
|
||||||
WARN_PRINT("Your video card drivers seem not to support the required Vulkan version, switching to OpenGL 3.");
|
WARN_PRINT("Your video card drivers seem not to support the required Vulkan version, switching to OpenGL 3.");
|
||||||
rendering_driver = "opengl3";
|
rendering_driver = "opengl3";
|
||||||
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
|
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
|
||||||
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
|
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
|
||||||
} else {
|
} else
|
||||||
|
#endif // GLES3_ENABLED
|
||||||
|
{
|
||||||
r_error = ERR_CANT_CREATE;
|
r_error = ERR_CANT_CREATE;
|
||||||
|
|
||||||
if (p_rendering_driver == "vulkan") {
|
if (p_rendering_driver == "vulkan") {
|
||||||
|
|||||||
@@ -6168,13 +6168,16 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
|
|||||||
if (rendering_context->initialize() != OK) {
|
if (rendering_context->initialize() != OK) {
|
||||||
memdelete(rendering_context);
|
memdelete(rendering_context);
|
||||||
rendering_context = nullptr;
|
rendering_context = nullptr;
|
||||||
|
#if defined(GLES3_ENABLED)
|
||||||
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
||||||
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
|
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
|
||||||
WARN_PRINT("Your video card drivers seem not to support the required Vulkan version, switching to OpenGL 3.");
|
WARN_PRINT("Your video card drivers seem not to support the required Vulkan version, switching to OpenGL 3.");
|
||||||
rendering_driver = "opengl3";
|
rendering_driver = "opengl3";
|
||||||
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
|
OS::get_singleton()->set_current_rendering_method("gl_compatibility");
|
||||||
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
|
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
|
||||||
} else {
|
} else
|
||||||
|
#endif // GLES3_ENABLED
|
||||||
|
{
|
||||||
r_error = ERR_CANT_CREATE;
|
r_error = ERR_CANT_CREATE;
|
||||||
|
|
||||||
if (p_rendering_driver == "vulkan") {
|
if (p_rendering_driver == "vulkan") {
|
||||||
|
|||||||
@@ -3623,6 +3623,39 @@ DisplayServerMacOS::DisplayServerMacOS(const String &p_rendering_driver, WindowM
|
|||||||
//TODO - do Vulkan and OpenGL support checks, driver selection and fallback
|
//TODO - do Vulkan and OpenGL support checks, driver selection and fallback
|
||||||
rendering_driver = p_rendering_driver;
|
rendering_driver = p_rendering_driver;
|
||||||
|
|
||||||
|
#if defined(RD_ENABLED)
|
||||||
|
#if defined(VULKAN_ENABLED)
|
||||||
|
if (rendering_driver == "vulkan") {
|
||||||
|
rendering_context = memnew(RenderingContextDriverVulkanMacOS);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(METAL_ENABLED)
|
||||||
|
if (rendering_driver == "metal") {
|
||||||
|
rendering_context = memnew(RenderingContextDriverMetal);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (rendering_context) {
|
||||||
|
if (rendering_context->initialize() != OK) {
|
||||||
|
memdelete(rendering_context);
|
||||||
|
rendering_context = nullptr;
|
||||||
|
#if defined(GLES3_ENABLED)
|
||||||
|
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
||||||
|
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
|
||||||
|
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
|
||||||
|
{
|
||||||
|
r_error = ERR_CANT_CREATE;
|
||||||
|
ERR_FAIL_MSG("Could not initialize " + rendering_driver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(GLES3_ENABLED)
|
#if defined(GLES3_ENABLED)
|
||||||
if (rendering_driver == "opengl3_angle") {
|
if (rendering_driver == "opengl3_angle") {
|
||||||
gl_manager_angle = memnew(GLManagerANGLE_MacOS);
|
gl_manager_angle = memnew(GLManagerANGLE_MacOS);
|
||||||
@@ -3655,35 +3688,6 @@ DisplayServerMacOS::DisplayServerMacOS(const String &p_rendering_driver, WindowM
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(RD_ENABLED)
|
|
||||||
#if defined(VULKAN_ENABLED)
|
|
||||||
if (rendering_driver == "vulkan") {
|
|
||||||
rendering_context = memnew(RenderingContextDriverVulkanMacOS);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(METAL_ENABLED)
|
|
||||||
if (rendering_driver == "metal") {
|
|
||||||
rendering_context = memnew(RenderingContextDriverMetal);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (rendering_context) {
|
|
||||||
if (rendering_context->initialize() != OK) {
|
|
||||||
memdelete(rendering_context);
|
|
||||||
rendering_context = nullptr;
|
|
||||||
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
|
||||||
if (fallback_to_opengl3 && rendering_driver != "opengl3") {
|
|
||||||
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 {
|
|
||||||
r_error = ERR_CANT_CREATE;
|
|
||||||
ERR_FAIL_MSG("Could not initialize " + rendering_driver);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Point2i window_position;
|
Point2i window_position;
|
||||||
if (p_position != nullptr) {
|
if (p_position != nullptr) {
|
||||||
|
|||||||
@@ -6238,6 +6238,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(GLES3_ENABLED)
|
||||||
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
bool fallback_to_opengl3 = GLOBAL_GET("rendering/rendering_device/fallback_to_opengl3");
|
||||||
if (failed && fallback_to_opengl3 && rendering_driver != "opengl3") {
|
if (failed && fallback_to_opengl3 && rendering_driver != "opengl3") {
|
||||||
memdelete(rendering_context);
|
memdelete(rendering_context);
|
||||||
@@ -6249,6 +6250,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
|||||||
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
|
OS::get_singleton()->set_current_rendering_driver_name(rendering_driver);
|
||||||
failed = false;
|
failed = false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (failed) {
|
if (failed) {
|
||||||
memdelete(rendering_context);
|
memdelete(rendering_context);
|
||||||
rendering_context = nullptr;
|
rendering_context = nullptr;
|
||||||
|
|||||||
Reference in New Issue
Block a user