Browse Source

-several fixes to Android to work better on Tegra 3/4 devices, uses 16 bits FBOs so all 2D shader effects should now work in every single Android device.

Juan Linietsky 9 years ago
parent
commit
4b1f0afb01

+ 17 - 4
drivers/gles2/rasterizer_gles2.cpp

@@ -10353,6 +10353,13 @@ void RasterizerGLES2::_update_framebuffer() {
 	GLuint format_rgba = GL_RGBA;
 	GLuint format_rgb = use_fp16_fb?_GL_RGB16F_EXT:GL_RGB;
 	GLuint format_type = use_fp16_fb?_GL_HALF_FLOAT_OES:GL_UNSIGNED_BYTE;
+	GLuint format_internal=GL_RGBA;
+
+	if (use_16bits_fbo) {
+		format_type=GL_UNSIGNED_SHORT_5_6_5;
+		format_rgba=GL_RGB;
+		format_internal=GL_RGB;
+	}
 	/*GLuint format_luminance = use_fp16_fb?GL_RGB16F:GL_RGBA;
 	GLuint format_luminance_type = use_fp16_fb?(use_fu_GL_HALF_FLOAT_OES):GL_UNSIGNED_BYTE;
 	GLuint format_luminance_components = use_fp16_fb?GL_RGB:GL_RGBA;*/
@@ -10366,7 +10373,7 @@ void RasterizerGLES2::_update_framebuffer() {
 
 	glGenTextures(1, &framebuffer.color);
 	glBindTexture(GL_TEXTURE_2D, framebuffer.color);
-	glTexImage2D(GL_TEXTURE_2D, 0, format_rgba,  framebuffer.width, framebuffer.height, 0, GL_RGBA, format_type, NULL);
+	glTexImage2D(GL_TEXTURE_2D, 0, format_rgba,  framebuffer.width, framebuffer.height, 0, format_internal, format_type, NULL);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 //	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
@@ -10391,7 +10398,7 @@ void RasterizerGLES2::_update_framebuffer() {
 		framebuffer.fbo=0;
 		framebuffer.active=false;
 		//print_line("**************** NO FAMEBUFFEEEERRRR????");
-		WARN_PRINT("Could not create framebuffer!!");
+		WARN_PRINT(String("Could not create framebuffer!!, code: "+itos(status)).ascii().get_data());
 	}
 
 	//sample
@@ -10400,7 +10407,7 @@ void RasterizerGLES2::_update_framebuffer() {
 	glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.sample_fbo);
 	glGenTextures(1, &framebuffer.sample_color);
 	glBindTexture(GL_TEXTURE_2D, framebuffer.sample_color);
-	glTexImage2D(GL_TEXTURE_2D, 0, format_rgba,  framebuffer.width, framebuffer.height, 0, GL_RGBA, format_type, NULL);
+	glTexImage2D(GL_TEXTURE_2D, 0, format_rgba,  framebuffer.width, framebuffer.height, 0, format_internal, format_type, NULL);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 //	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
@@ -10460,7 +10467,7 @@ void RasterizerGLES2::_update_framebuffer() {
 			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 			glTexImage2D(GL_TEXTURE_2D, 0, format_rgba, size, size, 0,
-				     GL_RGBA, format_type, NULL);
+				     format_internal, format_type, NULL);
 			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
 					       GL_TEXTURE_2D, framebuffer.blur[i].color, 0);
 
@@ -11189,6 +11196,11 @@ RasterizerGLES2* RasterizerGLES2::get_singleton() {
 
 int RasterizerGLES2::RenderList::max_elements=RenderList::DEFAULT_MAX_ELEMENTS;
 
+void RasterizerGLES2::set_force_16_bits_fbo(bool p_force) {
+
+	use_16bits_fbo=p_force;
+}
+
 RasterizerGLES2::RasterizerGLES2(bool p_compress_arrays,bool p_keep_ram_copy,bool p_default_fragment_lighting,bool p_use_reload_hooks) {
 
 	_singleton = this;
@@ -11250,6 +11262,7 @@ RasterizerGLES2::RasterizerGLES2(bool p_compress_arrays,bool p_keep_ram_copy,boo
 	framebuffer.active=false;
 	tc0_id_cache=0;
 	tc0_idx=0;
+	use_16bits_fbo=false;
 };
 
 void RasterizerGLES2::restore_framebuffer() {

+ 3 - 0
drivers/gles2/rasterizer_gles2.h

@@ -91,6 +91,7 @@ class RasterizerGLES2 : public Rasterizer {
 	bool srgb_supported;
 	bool float_supported;
 	bool float_linear_supported;
+	bool use_16bits_fbo;
 
 	ShadowFilterTechnique shadow_filter;
 
@@ -1705,6 +1706,8 @@ public:
 
 	static RasterizerGLES2* get_singleton();
 
+	virtual void set_force_16_bits_fbo(bool p_force);
+
 	RasterizerGLES2(bool p_compress_arrays=false,bool p_keep_ram_copy=true,bool p_default_fragment_lighting=true,bool p_use_reload_hooks=false);
 	virtual ~RasterizerGLES2();
 };

+ 1 - 1
platform/android/java/src/com/android/godot/GodotLib.java

@@ -46,7 +46,7 @@ public class GodotLib {
 
      public static native void initialize(Godot p_instance,boolean need_reload_hook,String[] p_cmdline,Object p_asset_manager);
      public static native void resize(int width, int height,boolean reload);
-     public static native void newcontext();
+     public static native void newcontext(boolean p_32_bits);
      public static native void quit();
      public static native void step();
      public static native void touch(int what,int pointer,int howmany, int[] arr);

+ 2 - 1
platform/android/java/src/com/android/godot/GodotView.java

@@ -425,6 +425,7 @@ public class GodotView extends GLSurfaceView {
 			if (ec == null) {
 	  			Log.w(TAG, "Trying ConfigChooser fallback");
 	  			ec = fallback.chooseConfig(egl, display, configs);
+				use_32=false;
 			}
 			return ec;
       		}
@@ -654,7 +655,7 @@ public class GodotView extends GLSurfaceView {
 		}
 
 		public void onSurfaceCreated(GL10 gl, EGLConfig config) {
-			GodotLib.newcontext();
+			GodotLib.newcontext(use_32);
 		}
 	}
 }

+ 7 - 1
platform/android/java_glue.cpp

@@ -920,14 +920,20 @@ JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_resize(JNIEnv * env, jobj
 
 }
 
-JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_newcontext(JNIEnv * env, jobject obj) {
+JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_newcontext(JNIEnv * env, jobject obj,bool p_32_bits) {
 
 	__android_log_print(ANDROID_LOG_INFO,"godot","^_^_^_^_^ newcontext %lld\n",Thread::get_caller_ID());
+
+	if (os_android) {
+		os_android->set_context_is_16_bits(!p_32_bits);
+	}
+
 	if (os_android && step > 0) {
 
 		os_android->reload_gfx();
 	}
 
+
 }
 
 

+ 1 - 1
platform/android/java_glue.h

@@ -38,7 +38,7 @@
 extern "C" {
     JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_initialize(JNIEnv * env, jobject obj, jobject activity,jboolean p_need_reload_hook, jobjectArray p_cmdline,jobject p_asset_manager);
     JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_resize(JNIEnv * env, jobject obj,  jint width, jint height, jboolean reload);
-    JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_newcontext(JNIEnv * env, jobject obj);
+    JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_newcontext(JNIEnv * env, jobject obj, bool p_32_bits);
     JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_step(JNIEnv * env, jobject obj);
     JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_quit(JNIEnv * env, jobject obj);
     JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_touch(JNIEnv * env, jobject obj, jint ev,jint pointer, jint count, jintArray positions);

+ 9 - 0
platform/android/os_android.cpp

@@ -141,6 +141,8 @@ void OS_Android::initialize(const VideoMode& p_desired,int p_video_driver,int p_
 
 	}
 
+	rasterizer->set_force_16_bits_fbo(use_16bits_fbo);
+
 	visual_server = memnew( VisualServerRaster(rasterizer) );
 	if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) {
 
@@ -725,6 +727,13 @@ void OS_Android::native_video_stop() {
 		video_stop_func();
 }
 
+void OS_Android::set_context_is_16_bits(bool p_is_16) {
+
+	use_16bits_fbo=p_is_16;
+	if (rasterizer)
+		rasterizer->set_force_16_bits_fbo(p_is_16);
+}
+
 OS_Android::OS_Android(GFXInitFunc p_gfx_init_func,void*p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetDataDirFunc p_get_data_dir_func,GetLocaleFunc p_get_locale_func,GetModelFunc p_get_model_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk,  SetScreenOrientationFunc p_screen_orient,GetUniqueIDFunc p_get_unique_id,GetSystemDirFunc p_get_sdir_func, VideoPlayFunc p_video_play_func, VideoIsPlayingFunc p_video_is_playing_func, VideoPauseFunc p_video_pause_func, VideoStopFunc p_video_stop_func,bool p_use_apk_expansion) {
 
 

+ 3 - 0
platform/android/os_android.h

@@ -95,6 +95,8 @@ private:
 	bool use_reload_hooks;
 	bool use_apk_expansion;
 
+	bool use_16bits_fbo;
+
 	Rasterizer *rasterizer;
 	VisualServer *visual_server;
 	AudioServerSW *audio_server;
@@ -200,6 +202,7 @@ public:
 	void set_display_size(Size2 p_size);
 
 	void reload_gfx();
+	void set_context_is_16_bits(bool p_is_16);
 
 	void set_need_reload_hooks(bool p_needs_them);
 	virtual void set_screen_orientation(ScreenOrientation p_orientation);

+ 13 - 0
scene/resources/texture.cpp

@@ -329,6 +329,16 @@ void ImageTexture::normal_to_xy() {
 	create_from_image(img,flags);
 }
 
+void ImageTexture::shrink_x2_and_keep_size() {
+
+	Size2 sizeov=get_size();
+	Image img = get_data();
+	img.resize(img.get_width()/2,img.get_height()/2,Image::INTERPOLATE_BILINEAR);
+	create_from_image(img,flags);
+	set_size_override(sizeov);
+
+}
+
 bool ImageTexture::has_alpha() const {
 
 	return ( format==Image::FORMAT_GRAYSCALE_ALPHA || format==Image::FORMAT_INDEXED_ALPHA || format==Image::FORMAT_RGBA );
@@ -424,10 +434,13 @@ void ImageTexture::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("fix_alpha_edges"),&ImageTexture::fix_alpha_edges);
 	ObjectTypeDB::bind_method(_MD("premultiply_alpha"),&ImageTexture::premultiply_alpha);
 	ObjectTypeDB::bind_method(_MD("normal_to_xy"),&ImageTexture::normal_to_xy);
+	ObjectTypeDB::bind_method(_MD("shrink_x2_and_keep_size"),&ImageTexture::shrink_x2_and_keep_size);
+
 	ObjectTypeDB::bind_method(_MD("set_size_override","size"),&ImageTexture::set_size_override);
 	ObjectTypeDB::set_method_flags(get_type_static(),_SCS("fix_alpha_edges"),METHOD_FLAGS_DEFAULT|METHOD_FLAG_EDITOR);
 	ObjectTypeDB::set_method_flags(get_type_static(),_SCS("premultiply_alpha"),METHOD_FLAGS_DEFAULT|METHOD_FLAG_EDITOR);
 	ObjectTypeDB::set_method_flags(get_type_static(),_SCS("normal_to_xy"),METHOD_FLAGS_DEFAULT|METHOD_FLAG_EDITOR);
+	ObjectTypeDB::set_method_flags(get_type_static(),_SCS("shrink_x2_and_keep_size"),METHOD_FLAGS_DEFAULT|METHOD_FLAG_EDITOR);
 	ObjectTypeDB::bind_method(_MD("_reload_hook","rid"),&ImageTexture::_reload_hook);
 
 

+ 1 - 0
scene/resources/texture.h

@@ -148,6 +148,7 @@ public:
 	void fix_alpha_edges();
 	void premultiply_alpha();
 	void normal_to_xy();
+	void shrink_x2_and_keep_size();
 
 
 	void set_size_override(const Size2& p_size);

+ 2 - 0
servers/visual/rasterizer.h

@@ -1029,6 +1029,8 @@ public:
 
 	virtual int get_render_info(VS::RenderInfo p_info)=0;
 
+	virtual void set_force_16_bits_fbo(bool p_force) {}
+
 	Rasterizer();
 	virtual ~Rasterizer() {}
 };