mirror of
https://github.com/godotengine/godot.git
synced 2026-02-07 19:32:36 +00:00
Merge pull request #114922 from DarioSamo/android-platform-gl3-fallback-fix
Fix fallback to OpenGL3 from Vulkan initialization on Android.
This commit is contained in:
@@ -565,19 +565,14 @@ class Godot private constructor(val context: Context) {
|
||||
!isEditorHint() &&
|
||||
java.lang.Boolean.parseBoolean(GodotLib.getGlobal("display/window/per_pixel_transparency/allowed"))
|
||||
Log.d(TAG, "Render view should be transparent: $shouldBeTransparent")
|
||||
renderView = if (usesVulkan()) {
|
||||
if (meetsVulkanRequirements(context.packageManager)) {
|
||||
GodotVulkanRenderView(this, godotInputHandler, shouldBeTransparent)
|
||||
} else if (canFallbackToOpenGL()) {
|
||||
// Fallback to OpenGl.
|
||||
GodotGLRenderView(this, godotInputHandler, xrMode, useDebugOpengl, shouldBeTransparent)
|
||||
} else {
|
||||
throw IllegalStateException(context.getString(R.string.error_missing_vulkan_requirements_message))
|
||||
}
|
||||
|
||||
val nativeRenderer = getNativeRenderer();
|
||||
if (nativeRenderer == "vulkan") {
|
||||
renderView = GodotVulkanRenderView(this, godotInputHandler, shouldBeTransparent)
|
||||
} else if (nativeRenderer == "opengl3") {
|
||||
renderView = GodotGLRenderView(this, godotInputHandler, xrMode, useDebugOpengl, shouldBeTransparent)
|
||||
} else {
|
||||
// Fallback to OpenGl.
|
||||
GodotGLRenderView(this, godotInputHandler, xrMode, useDebugOpengl, shouldBeTransparent)
|
||||
throw IllegalStateException("No native renderer is available.")
|
||||
}
|
||||
|
||||
renderView?.let {
|
||||
@@ -932,31 +927,25 @@ class Godot private constructor(val context: Context) {
|
||||
*/
|
||||
private fun isOnUiThread() = Looper.myLooper() == Looper.getMainLooper()
|
||||
|
||||
/**
|
||||
* Returns true if `Vulkan` is used for rendering.
|
||||
/**
|
||||
* Returns the native rendering driver.
|
||||
*/
|
||||
private fun usesVulkan(): Boolean {
|
||||
val rendererInfo = GodotLib.getRendererInfo()
|
||||
var renderingDeviceSource = "ProjectSettings"
|
||||
var renderingDevice = rendererInfo[0]
|
||||
var rendererSource = "ProjectSettings"
|
||||
var renderer = rendererInfo[1]
|
||||
val cmdline = commandLine
|
||||
var index = cmdline.indexOf("--rendering-method")
|
||||
if (index > -1 && cmdline.size > index + 1) {
|
||||
rendererSource = "CommandLine"
|
||||
renderer = cmdline.get(index + 1)
|
||||
private fun getNativeRenderer(): String {
|
||||
val rendererInfo = GodotLib.getRendererInfo(meetsVulkanRequirements(context.packageManager))
|
||||
var renderingDriverChosen = rendererInfo[0]
|
||||
var renderingDriverOriginal = rendererInfo[1]
|
||||
var renderingMethod = rendererInfo[2]
|
||||
var renderingDriverSource = rendererInfo[3]
|
||||
var renderingMethodSource = rendererInfo[4]
|
||||
Log.d(TAG, """renderingDevice: ${renderingDriverChosen} (${renderingDriverSource})
|
||||
renderer: ${renderingMethod} (${renderingMethodSource})""")
|
||||
|
||||
if (renderingDriverOriginal == "vulkan" && renderingDriverChosen == "") {
|
||||
// Throw the exception for the case where Vulkan failed to create and no fallback was available.
|
||||
throw IllegalStateException(context.getString(R.string.error_missing_vulkan_requirements_message))
|
||||
}
|
||||
index = cmdline.indexOf("--rendering-driver")
|
||||
if (index > -1 && cmdline.size > index + 1) {
|
||||
renderingDeviceSource = "CommandLine"
|
||||
renderingDevice = cmdline.get(index + 1)
|
||||
}
|
||||
val result = ("forward_plus" == renderer || "mobile" == renderer) && "vulkan" == renderingDevice
|
||||
Log.d(TAG, """usesVulkan(): ${result}
|
||||
renderingDevice: ${renderingDevice} (${renderingDeviceSource})
|
||||
renderer: ${renderer} (${rendererSource})""")
|
||||
return result
|
||||
|
||||
return renderingDriverChosen;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -192,11 +192,14 @@ public class GodotLib {
|
||||
/**
|
||||
* Used to get info about the current rendering system.
|
||||
*
|
||||
* @return A String array with two elements:
|
||||
* [0] Rendering driver name.
|
||||
* [1] Rendering method.
|
||||
* @return A String array with three elements:
|
||||
* [0] Rendering driver name chosen for rendering.
|
||||
* [1] Rendering driver name chosen before any fallbacks were applied.
|
||||
* [2] Rendering method.
|
||||
* [3] Source where the rendering driver was chosen from.
|
||||
* [4] Source where the rendering method was chosen from.
|
||||
*/
|
||||
public static native String[] getRendererInfo();
|
||||
public static native String[] getRendererInfo(boolean p_vulkan_requirements_met);
|
||||
|
||||
/**
|
||||
* Used to access Godot's editor settings.
|
||||
|
||||
Reference in New Issue
Block a user