-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.
This commit is contained in:
parent
7ac31a7209
commit
4b1f0afb01
11 changed files with 59 additions and 8 deletions
|
@ -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() {
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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() {}
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue