Implement OpenGL ES rasterizer selection logic for Android.

This commit is contained in:
geequlim 2018-06-25 22:43:46 +08:00
parent 25275de50e
commit e2aa777d4d
4 changed files with 38 additions and 14 deletions

View file

@ -32,6 +32,7 @@ package org.godotengine.godot;
import android.R; import android.R;
import android.app.Activity; import android.app.Activity;
import android.content.pm.ConfigurationInfo;
import android.os.Bundle; import android.os.Bundle;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
@ -246,9 +247,11 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
} }
}; };
public void onVideoInit(boolean use_gl2) { public void onVideoInit() {
//mView = new GodotView(getApplication(),io,use_gl2); boolean use_gl3 = getGLESVersionCode() >= 0x00030000;
//mView = new GodotView(getApplication(),io,use_gl3);
//setContentView(mView); //setContentView(mView);
layout = new FrameLayout(this); layout = new FrameLayout(this);
@ -261,7 +264,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
// ...add to FrameLayout // ...add to FrameLayout
layout.addView(edittext); layout.addView(edittext);
mView = new GodotView(getApplication(), io, use_gl2, use_32_bits, this); mView = new GodotView(getApplication(), io, use_gl3, use_32_bits, this);
layout.addView(mView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); layout.addView(mView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
edittext.setView(mView); edittext.setView(mView);
io.setEdit(edittext); io.setEdit(edittext);
@ -338,6 +341,12 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
return Godot._self; return Godot._self;
} }
public int getGLESVersionCode() {
ActivityManager am = (ActivityManager)Godot.getInstance().getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfo deviceInfo = am.getDeviceConfigurationInfo();
return deviceInfo.reqGlEsVersion;
}
private String[] getCommandLine() { private String[] getCommandLine() {
InputStream is; InputStream is;
try { try {

View file

@ -614,6 +614,7 @@ static jmethodID _hideKeyboard = 0;
static jmethodID _setScreenOrientation = 0; static jmethodID _setScreenOrientation = 0;
static jmethodID _getUniqueID = 0; static jmethodID _getUniqueID = 0;
static jmethodID _getSystemDir = 0; static jmethodID _getSystemDir = 0;
static jmethodID _getGLESVersionCode = 0;
static jmethodID _playVideo = 0; static jmethodID _playVideo = 0;
static jmethodID _isVideoPlaying = 0; static jmethodID _isVideoPlaying = 0;
static jmethodID _pauseVideo = 0; static jmethodID _pauseVideo = 0;
@ -685,6 +686,11 @@ static String _get_system_dir(int p_dir) {
return String(env->GetStringUTFChars(s, NULL)); return String(env->GetStringUTFChars(s, NULL));
} }
static int _get_gles_version_code() {
JNIEnv *env = ThreadAndroid::get_env();
return env->CallIntMethod(_godot_instance, _getGLESVersionCode);
}
static void _hide_vk() { static void _hide_vk() {
JNIEnv *env = ThreadAndroid::get_env(); JNIEnv *env = ThreadAndroid::get_env();
@ -764,9 +770,10 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *en
godot_io = gob; godot_io = gob;
_on_video_init = env->GetMethodID(cls, "onVideoInit", "(Z)V"); _on_video_init = env->GetMethodID(cls, "onVideoInit", "()V");
_setKeepScreenOn = env->GetMethodID(cls, "setKeepScreenOn", "(Z)V"); _setKeepScreenOn = env->GetMethodID(cls, "setKeepScreenOn", "(Z)V");
_alertDialog = env->GetMethodID(cls, "alert", "(Ljava/lang/String;Ljava/lang/String;)V"); _alertDialog = env->GetMethodID(cls, "alert", "(Ljava/lang/String;Ljava/lang/String;)V");
_getGLESVersionCode = env->GetMethodID(cls, "getGLESVersionCode", "()I");
jclass clsio = env->FindClass("org/godotengine/godot/Godot"); jclass clsio = env->FindClass("org/godotengine/godot/Godot");
if (cls) { if (cls) {
@ -800,16 +807,13 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *en
AudioDriverAndroid::setup(gob); AudioDriverAndroid::setup(gob);
} }
os_android = new OS_Android(_gfx_init_func, env, _open_uri, _get_user_data_dir, _get_locale, _get_model, _get_screen_dpi, _show_vk, _hide_vk, _get_vk_height, _set_screen_orient, _get_unique_id, _get_system_dir, _play_video, _is_video_playing, _pause_video, _stop_video, _set_keep_screen_on, _alert, p_use_apk_expansion); os_android = new OS_Android(_gfx_init_func, env, _open_uri, _get_user_data_dir, _get_locale, _get_model, _get_screen_dpi, _show_vk, _hide_vk, _get_vk_height, _set_screen_orient, _get_unique_id, _get_system_dir, _get_gles_version_code, _play_video, _is_video_playing, _pause_video, _stop_video, _set_keep_screen_on, _alert, p_use_apk_expansion);
os_android->set_need_reload_hooks(p_need_reload_hook); os_android->set_need_reload_hooks(p_need_reload_hook);
char wd[500]; char wd[500];
getcwd(wd, 500); getcwd(wd, 500);
//video driver is determined here, because once initialized, it can't be changed env->CallVoidMethod(_godot_instance, _on_video_init);
// String vd = ProjectSettings::get_singleton()->get("display/driver");
env->CallVoidMethod(_godot_instance, _on_video_init, (jboolean) true);
} }
static void _initialize_java_modules() { static void _initialize_java_modules() {

View file

@ -32,6 +32,7 @@
#include "core/io/file_access_buffered_fa.h" #include "core/io/file_access_buffered_fa.h"
#include "core/project_settings.h" #include "core/project_settings.h"
#include "drivers/gles2/rasterizer_gles2.h"
#include "drivers/gles3/rasterizer_gles3.h" #include "drivers/gles3/rasterizer_gles3.h"
#include "drivers/unix/dir_access_unix.h" #include "drivers/unix/dir_access_unix.h"
#include "drivers/unix/file_access_unix.h" #include "drivers/unix/file_access_unix.h"
@ -125,13 +126,20 @@ void OS_Android::set_opengl_extensions(const char *p_gl_extensions) {
Error OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) { Error OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
use_gl2 = p_video_driver != 1; bool use_gl3 = get_gl_version_code_func() >= 0x00030000;
use_gl3 = use_gl3 && (GLOBAL_GET("rendering/quality/driver/driver_name") == "GLES3");
use_gl2 = !use_gl3;
if (gfx_init_func) if (gfx_init_func)
gfx_init_func(gfx_init_ud, use_gl2); gfx_init_func(gfx_init_ud, use_gl2);
if (use_gl2) {
RasterizerGLES2::register_config();
RasterizerGLES2::make_current();
} else {
RasterizerGLES3::register_config(); RasterizerGLES3::register_config();
RasterizerGLES3::make_current(); RasterizerGLES3::make_current();
}
visual_server = memnew(VisualServerRaster); visual_server = memnew(VisualServerRaster);
/* if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) { /* if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) {
@ -684,7 +692,7 @@ bool OS_Android::_check_internal_feature_support(const String &p_feature) {
return false; return false;
} }
OS_Android::OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetUserDataDirFunc p_get_user_data_dir_func, GetLocaleFunc p_get_locale_func, GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, VirtualKeyboardHeightFunc p_vk_height_func, 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, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, bool p_use_apk_expansion) { OS_Android::OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetUserDataDirFunc p_get_user_data_dir_func, GetLocaleFunc p_get_locale_func, GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, VirtualKeyboardHeightFunc p_vk_height_func, SetScreenOrientationFunc p_screen_orient, GetUniqueIDFunc p_get_unique_id, GetSystemDirFunc p_get_sdir_func, GetGLVersionCodeFunc p_get_gl_version_func, VideoPlayFunc p_video_play_func, VideoIsPlayingFunc p_video_is_playing_func, VideoPauseFunc p_video_pause_func, VideoStopFunc p_video_stop_func, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, bool p_use_apk_expansion) {
use_apk_expansion = p_use_apk_expansion; use_apk_expansion = p_use_apk_expansion;
default_videomode.width = 800; default_videomode.width = 800;
@ -706,6 +714,7 @@ OS_Android::OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURI
get_screen_dpi_func = p_get_screen_dpi_func; get_screen_dpi_func = p_get_screen_dpi_func;
get_unique_id_func = p_get_unique_id; get_unique_id_func = p_get_unique_id;
get_system_dir_func = p_get_sdir_func; get_system_dir_func = p_get_sdir_func;
get_gl_version_code_func = p_get_gl_version_func;
video_play_func = p_video_play_func; video_play_func = p_video_play_func;
video_is_playing_func = p_video_is_playing_func; video_is_playing_func = p_video_is_playing_func;

View file

@ -58,6 +58,7 @@ typedef void (*ShowVirtualKeyboardFunc)(const String &);
typedef void (*HideVirtualKeyboardFunc)(); typedef void (*HideVirtualKeyboardFunc)();
typedef void (*SetScreenOrientationFunc)(int); typedef void (*SetScreenOrientationFunc)(int);
typedef String (*GetSystemDirFunc)(int); typedef String (*GetSystemDirFunc)(int);
typedef int (*GetGLVersionCodeFunc)();
typedef void (*VideoPlayFunc)(const String &); typedef void (*VideoPlayFunc)(const String &);
typedef bool (*VideoIsPlayingFunc)(); typedef bool (*VideoIsPlayingFunc)();
@ -126,6 +127,7 @@ private:
SetScreenOrientationFunc set_screen_orientation_func; SetScreenOrientationFunc set_screen_orientation_func;
GetUniqueIDFunc get_unique_id_func; GetUniqueIDFunc get_unique_id_func;
GetSystemDirFunc get_system_dir_func; GetSystemDirFunc get_system_dir_func;
GetGLVersionCodeFunc get_gl_version_code_func;
VideoPlayFunc video_play_func; VideoPlayFunc video_play_func;
VideoIsPlayingFunc video_is_playing_func; VideoIsPlayingFunc video_is_playing_func;
@ -239,7 +241,7 @@ public:
void joy_connection_changed(int p_device, bool p_connected, String p_name); void joy_connection_changed(int p_device, bool p_connected, String p_name);
virtual bool _check_internal_feature_support(const String &p_feature); virtual bool _check_internal_feature_support(const String &p_feature);
OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetUserDataDirFunc p_get_user_data_dir_func, GetLocaleFunc p_get_locale_func, GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, VirtualKeyboardHeightFunc p_vk_height_func, 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, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, bool p_use_apk_expansion); OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetUserDataDirFunc p_get_user_data_dir_func, GetLocaleFunc p_get_locale_func, GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, VirtualKeyboardHeightFunc p_vk_height_func, SetScreenOrientationFunc p_screen_orient, GetUniqueIDFunc p_get_unique_id, GetSystemDirFunc p_get_sdir_func, GetGLVersionCodeFunc p_get_gl_version_func, VideoPlayFunc p_video_play_func, VideoIsPlayingFunc p_video_is_playing_func, VideoPauseFunc p_video_pause_func, VideoStopFunc p_video_stop_func, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, bool p_use_apk_expansion);
~OS_Android(); ~OS_Android();
}; };