Browse Source

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.
Holger Dammertz 5 years ago
parent
commit
efe6b50f17
3 changed files with 12 additions and 0 deletions
  1. 4 0
      doc/classes/ProjectSettings.xml
  2. 7 0
      drivers/gles2/shader_gles2.cpp
  3. 1 0
      servers/visual_server.cpp

+ 4 - 0
doc/classes/ProjectSettings.xml

@@ -1134,6 +1134,10 @@
 		<member name="rendering/quality/shading/force_lambert_over_burley.mobile" type="bool" setter="" getter="" default="true">
 		<member name="rendering/quality/shading/force_lambert_over_burley.mobile" type="bool" setter="" getter="" default="true">
 			Lower-end override for [member rendering/quality/shading/force_lambert_over_burley] on mobile devices, due to performance concerns or driver support.
 			Lower-end override for [member rendering/quality/shading/force_lambert_over_burley] on mobile devices, due to performance concerns or driver support.
 		</member>
 		</member>
+		<member name="rendering/gles2/compatibility/enable_high_float.Android" type="bool" setter="" getter="" default="false">
+			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.
+		</member>
 		<member name="rendering/quality/shading/force_vertex_shading" type="bool" setter="" getter="" default="false">
 		<member name="rendering/quality/shading/force_vertex_shading" type="bool" setter="" getter="" default="false">
 			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.
 			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.
 		</member>
 		</member>

+ 7 - 0
drivers/gles2/shader_gles2.cpp

@@ -32,6 +32,7 @@
 
 
 #include "core/os/memory.h"
 #include "core/os/memory.h"
 #include "core/print_string.h"
 #include "core/print_string.h"
+#include "core/project_settings.h"
 #include "core/string_builder.h"
 #include "core/string_builder.h"
 #include "rasterizer_gles2.h"
 #include "rasterizer_gles2.h"
 #include "rasterizer_storage_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");
 	strings.push_back("#define USE_HIGHP_PRECISION\n");
 #endif
 #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
 #endif
 
 
 #ifdef ANDROID_ENABLED
 #ifdef ANDROID_ENABLED

+ 1 - 0
servers/visual_server.cpp

@@ -2444,6 +2444,7 @@ VisualServer::VisualServer() {
 	GLOBAL_DEF("rendering/batching/debug/flash_batching", false);
 	GLOBAL_DEF("rendering/batching/debug/flash_batching", false);
 	GLOBAL_DEF("rendering/batching/debug/diagnose_frame", false);
 	GLOBAL_DEF("rendering/batching/debug/diagnose_frame", false);
 	GLOBAL_DEF("rendering/gles2/compatibility/disable_half_float", 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", false);
 	GLOBAL_DEF("rendering/batching/precision/uv_contract_amount", 100);
 	GLOBAL_DEF("rendering/batching/precision/uv_contract_amount", 100);