From efe6b50f1789c44b815e0c0145a366e69ff03932 Mon Sep 17 00:00:00 2001 From: Holger Dammertz Date: Fri, 15 Nov 2019 19:12:46 +0100 Subject: [PATCH] Added option to enable high precision float in GLES2 An additional project setting under rendering/gles2/compatibility with the name enable_high_float.Android is introduced that enables #define USE_HIGHP_PRECISION in GLES2 shader on Android when it is supported by the shader compiler. This fixes #33633 and #32813 and also https://github.com/GodotVR/godot_oculus_mobile/issues/60 and https://github.com/GodotVR/godot_oculus_mobile/issues/68 on devices that support the highp (high precision) modifier. --- doc/classes/ProjectSettings.xml | 4 ++++ drivers/gles2/shader_gles2.cpp | 7 +++++++ servers/visual_server.cpp | 1 + 3 files changed, 12 insertions(+) diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 8e86a7a0406..8ba77f36acf 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -1134,6 +1134,10 @@ Lower-end override for [member rendering/quality/shading/force_lambert_over_burley] on mobile devices, due to performance concerns or driver support. + + If [code]true[/code] and available on the target device, enables high floating point precision for all shader computations in GLES2. + [b]Warning:[/b] High floating point precision can be extremely slow on older devices and is often not available at all. Use with caution. + If [code]true[/code], forces vertex shading for all rendering. This can increase performance a lot, but also reduces quality immensely. Can be used to optimize performance on low-end mobile devices. diff --git a/drivers/gles2/shader_gles2.cpp b/drivers/gles2/shader_gles2.cpp index dc422f70a8f..8f1d40358c5 100644 --- a/drivers/gles2/shader_gles2.cpp +++ b/drivers/gles2/shader_gles2.cpp @@ -32,6 +32,7 @@ #include "core/os/memory.h" #include "core/print_string.h" +#include "core/project_settings.h" #include "core/string_builder.h" #include "rasterizer_gles2.h" #include "rasterizer_storage_gles2.h" @@ -180,6 +181,12 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() { strings.push_back("#define USE_HIGHP_PRECISION\n"); #endif + if (GLOBAL_GET("rendering/gles2/compatibility/enable_high_float.Android")) { + // enable USE_HIGHP_PRECISION but safeguarded by an availability check as highp support is optional in GLES2 + // see Section 4.5.4 of the GLSL_ES_Specification_1.00 + strings.push_back("#ifdef GL_FRAGMENT_PRECISION_HIGH\n #define USE_HIGHP_PRECISION\n#endif\n"); + } + #endif #ifdef ANDROID_ENABLED diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp index 71502cad741..d88ef711da7 100644 --- a/servers/visual_server.cpp +++ b/servers/visual_server.cpp @@ -2444,6 +2444,7 @@ VisualServer::VisualServer() { GLOBAL_DEF("rendering/batching/debug/flash_batching", false); GLOBAL_DEF("rendering/batching/debug/diagnose_frame", false); GLOBAL_DEF("rendering/gles2/compatibility/disable_half_float", false); + GLOBAL_DEF("rendering/gles2/compatibility/enable_high_float.Android", false); GLOBAL_DEF("rendering/batching/precision/uv_contract", false); GLOBAL_DEF("rendering/batching/precision/uv_contract_amount", 100);