aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/android
diff options
context:
space:
mode:
authordhewg2011-03-02 19:38:40 +0100
committerdhewg2011-03-02 23:18:34 +0100
commit82a9beff2b52b2dd3eb7368dd46d8d50cb9f2d9f (patch)
tree7f333ebcd8d9a75dd0c9d17cd501844ea53414fc /backends/platform/android
parentbd7e3e9bb20dada6d40143557c473fabd373b5ed (diff)
downloadscummvm-rg350-82a9beff2b52b2dd3eb7368dd46d8d50cb9f2d9f.tar.gz
scummvm-rg350-82a9beff2b52b2dd3eb7368dd46d8d50cb9f2d9f.tar.bz2
scummvm-rg350-82a9beff2b52b2dd3eb7368dd46d8d50cb9f2d9f.zip
ANDROID: Move swapBuffers to the native side
Diffstat (limited to 'backends/platform/android')
-rw-r--r--backends/platform/android/gfx.cpp6
-rw-r--r--backends/platform/android/jni.cpp54
-rw-r--r--backends/platform/android/jni.h21
-rw-r--r--backends/platform/android/org/inodes/gus/scummvm/ScummVM.java15
4 files changed, 67 insertions, 29 deletions
diff --git a/backends/platform/android/gfx.cpp b/backends/platform/android/gfx.cpp
index 7fbe896d82..96ba5e729a 100644
--- a/backends/platform/android/gfx.cpp
+++ b/backends/platform/android/gfx.cpp
@@ -288,10 +288,8 @@ void OSystem_Android::updateScreen() {
GLCALL(glPopMatrix());
- int res = JNI::swapBuffers();
-
- if (res)
- warning("swapBuffers returned 0x%x", res);
+ if (!JNI::swapBuffers())
+ LOGW("swapBuffers failed: 0x%x", glGetError());
}
Graphics::Surface *OSystem_Android::lockScreen() {
diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp
index 28a03d0555..3c2324dea1 100644
--- a/backends/platform/android/jni.cpp
+++ b/backends/platform/android/jni.cpp
@@ -40,6 +40,9 @@ jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
JavaVM *JNI::_vm = 0;
jobject JNI::_jobj = 0;
jobject JNI::_jobj_audio_track = 0;
+jobject JNI::_jobj_egl = 0;
+jobject JNI::_jobj_egl_display = 0;
+jobject JNI::_jobj_egl_surface = 0;
Common::Archive *JNI::_asset_archive = 0;
OSystem_Android *JNI::_system = 0;
@@ -63,10 +66,11 @@ jmethodID JNI::_MID_setWindowCaption = 0;
jmethodID JNI::_MID_showVirtualKeyboard = 0;
jmethodID JNI::_MID_getSysArchives = 0;
jmethodID JNI::_MID_getPluginDirectories = 0;
-jmethodID JNI::_MID_swapBuffers = 0;
jmethodID JNI::_MID_initSurface = 0;
jmethodID JNI::_MID_deinitSurface = 0;
+jmethodID JNI::_MID_EGL10_eglSwapBuffers = 0;
+
jmethodID JNI::_MID_AudioTrack_flush = 0;
jmethodID JNI::_MID_AudioTrack_pause = 0;
jmethodID JNI::_MID_AudioTrack_play = 0;
@@ -75,6 +79,8 @@ jmethodID JNI::_MID_AudioTrack_write = 0;
const JNINativeMethod JNI::_natives[] = {
{ "create", "(Landroid/content/res/AssetManager;"
+ "Ljavax/microedition/khronos/egl/EGL10;"
+ "Ljavax/microedition/khronos/egl/EGLDisplay;"
"Landroid/media/AudioTrack;II)V",
(void *)JNI::create },
{ "destroy", "()V",
@@ -318,17 +324,23 @@ void JNI::getPluginDirectories(Common::FSList &dirs) {
}
}
-void JNI::initSurface() {
+bool JNI::initSurface() {
JNIEnv *env = JNI::getEnv();
- env->CallVoidMethod(_jobj, _MID_initSurface);
+ jobject obj = env->CallObjectMethod(_jobj, _MID_initSurface);
- if (env->ExceptionCheck()) {
+ if (!obj || env->ExceptionCheck()) {
LOGE("initSurface failed");
env->ExceptionDescribe();
env->ExceptionClear();
+
+ return false;
}
+
+ _jobj_egl_surface = env->NewGlobalRef(obj);
+
+ return true;
}
void JNI::deinitSurface() {
@@ -342,6 +354,9 @@ void JNI::deinitSurface() {
env->ExceptionDescribe();
env->ExceptionClear();
}
+
+ env->DeleteGlobalRef(_jobj_egl_surface);
+ _jobj_egl_surface = 0;
}
void JNI::setAudioPause() {
@@ -394,11 +409,12 @@ void JNI::setAudioStop() {
// natives for the dark side
-void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at,
- jint audio_sample_rate, jint audio_buffer_size) {
+void JNI::create(JNIEnv *env, jobject self, jobject asset_manager,
+ jobject egl, jobject egl_display,
+ jobject at, jint audio_sample_rate, jint audio_buffer_size) {
assert(!_system);
- _asset_archive = new AndroidAssetArchive(am);
+ _asset_archive = new AndroidAssetArchive(asset_manager);
assert(_asset_archive);
_system = new OSystem_Android(audio_sample_rate, audio_buffer_size);
@@ -407,6 +423,7 @@ void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at,
// weak global ref to allow class to be unloaded
// ... except dalvik implements NewWeakGlobalRef only on froyo
//_jobj = env->NewWeakGlobalRef(self);
+
_jobj = env->NewGlobalRef(self);
jclass cls = env->GetObjectClass(_jobj);
@@ -422,12 +439,28 @@ void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at,
FIND_METHOD(showVirtualKeyboard, "(Z)V");
FIND_METHOD(getSysArchives, "()[Ljava/lang/String;");
FIND_METHOD(getPluginDirectories, "()[Ljava/lang/String;");
- FIND_METHOD(swapBuffers, "()I");
- FIND_METHOD(initSurface, "()V");
+ FIND_METHOD(initSurface, "()Ljavax/microedition/khronos/egl/EGLSurface;");
FIND_METHOD(deinitSurface, "()V");
#undef FIND_METHOD
+ _jobj_egl = env->NewGlobalRef(egl);
+ _jobj_egl_display = env->NewGlobalRef(egl_display);
+
+ cls = env->GetObjectClass(_jobj_egl);
+
+#define FIND_METHOD(name, signature) do { \
+ _MID_EGL10_ ## name = env->GetMethodID(cls, #name, signature); \
+ if (_MID_EGL10_ ## name == 0) \
+ return; \
+ } while (0)
+
+ FIND_METHOD(eglSwapBuffers, "(Ljavax/microedition/khronos/egl/EGLDisplay;"
+ "Ljavax/microedition/khronos/egl/EGLSurface;"
+ ")Z");
+
+#undef FIND_METHOD
+
_jobj_audio_track = env->NewGlobalRef(at);
cls = env->GetObjectClass(_jobj_audio_track);
@@ -459,6 +492,9 @@ void JNI::destroy(JNIEnv *env, jobject self) {
// see above
//JNI::getEnv()->DeleteWeakGlobalRef(_jobj);
+
+ JNI::getEnv()->DeleteGlobalRef(_jobj_egl_display);
+ JNI::getEnv()->DeleteGlobalRef(_jobj_egl);
JNI::getEnv()->DeleteGlobalRef(_jobj_audio_track);
JNI::getEnv()->DeleteGlobalRef(_jobj);
}
diff --git a/backends/platform/android/jni.h b/backends/platform/android/jni.h
index 0005136966..2a1405dfcc 100644
--- a/backends/platform/android/jni.h
+++ b/backends/platform/android/jni.h
@@ -60,8 +60,8 @@ public:
static void showVirtualKeyboard(bool enable);
static void addSysArchivesToSearchSet(Common::SearchSet &s, int priority);
- static inline int swapBuffers();
- static void initSurface();
+ static inline bool swapBuffers();
+ static bool initSurface();
static void deinitSurface();
static void setAudioPause();
@@ -76,6 +76,9 @@ private:
// back pointer to (java) peer instance
static jobject _jobj;
static jobject _jobj_audio_track;
+ static jobject _jobj_egl;
+ static jobject _jobj_egl_display;
+ static jobject _jobj_egl_surface;
static Common::Archive *_asset_archive;
static OSystem_Android *_system;
@@ -97,10 +100,11 @@ private:
static jmethodID _MID_showVirtualKeyboard;
static jmethodID _MID_getSysArchives;
static jmethodID _MID_getPluginDirectories;
- static jmethodID _MID_swapBuffers;
static jmethodID _MID_initSurface;
static jmethodID _MID_deinitSurface;
+ static jmethodID _MID_EGL10_eglSwapBuffers;
+
static jmethodID _MID_AudioTrack_flush;
static jmethodID _MID_AudioTrack_pause;
static jmethodID _MID_AudioTrack_play;
@@ -113,8 +117,10 @@ private:
static void throwRuntimeException(JNIEnv *env, const char *msg);
// natives for the dark side
- static void create(JNIEnv *env, jobject self, jobject am, jobject at,
- jint sample_rate, jint buffer_size);
+ static void create(JNIEnv *env, jobject self, jobject asset_manager,
+ jobject egl, jobject egl_display,
+ jobject at, jint audio_sample_rate,
+ jint audio_buffer_size);
static void destroy(JNIEnv *env, jobject self);
static void setSurface(JNIEnv *env, jobject self, jint width, jint height);
@@ -124,10 +130,11 @@ private:
static void enableZoning(JNIEnv *env, jobject self, jboolean enable);
};
-inline int JNI::swapBuffers() {
+inline bool JNI::swapBuffers() {
JNIEnv *env = JNI::getEnv();
- return env->CallIntMethod(_jobj, _MID_swapBuffers);
+ return env->CallBooleanMethod(_jobj_egl, _MID_EGL10_eglSwapBuffers,
+ _jobj_egl_display, _jobj_egl_surface);
}
inline int JNI::writeAudio(JNIEnv *env, jbyteArray &data, int offset, int size) {
diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java
index db83303c7d..75407c66cc 100644
--- a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java
+++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java
@@ -38,6 +38,7 @@ public abstract class ScummVM implements SurfaceHolder.Callback, Runnable {
private String[] args;
final private native void create(AssetManager asset_manager,
+ EGL10 egl, EGLDisplay eglDisplay,
AudioTrack audio_track,
int sample_rate, int buffer_size);
final private native void destroy();
@@ -56,13 +57,6 @@ public abstract class ScummVM implements SurfaceHolder.Callback, Runnable {
abstract protected void showVirtualKeyboard(boolean enable);
abstract protected String[] getSysArchives();
- final protected int swapBuffers() {
- if (!egl.eglSwapBuffers(eglDisplay, eglSurface))
- return egl.eglGetError();
-
- return 0;
- }
-
public ScummVM(AssetManager asset_manager, SurfaceHolder holder) {
this.asset_manager = asset_manager;
sem_surface = new Object();
@@ -126,7 +120,8 @@ public abstract class ScummVM implements SurfaceHolder.Callback, Runnable {
throw new RuntimeException("Error preparing the ScummVM thread", e);
}
- create(asset_manager, audio_track, sample_rate, buffer_size);
+ create(asset_manager, egl, eglDisplay,
+ audio_track, sample_rate, buffer_size);
int res = main(args);
@@ -192,7 +187,7 @@ public abstract class ScummVM implements SurfaceHolder.Callback, Runnable {
}
// Callback from C++ peer instance
- final protected void initSurface() throws Exception {
+ final protected EGLSurface initSurface() throws Exception {
eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig,
surface_holder, null);
@@ -210,6 +205,8 @@ public abstract class ScummVM implements SurfaceHolder.Callback, Runnable {
gl.glGetString(GL10.GL_VERSION),
gl.glGetString(GL10.GL_RENDERER),
gl.glGetString(GL10.GL_VENDOR)));
+
+ return eglSurface;
}
// Callback from C++ peer instance