aboutsummaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
Diffstat (limited to 'backends')
-rw-r--r--backends/platform/android/android.cpp55
-rw-r--r--backends/platform/android/android.h5
-rw-r--r--backends/platform/android/gfx.cpp63
3 files changed, 81 insertions, 42 deletions
diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp
index 35a6421ede..239ecd4138 100644
--- a/backends/platform/android/android.cpp
+++ b/backends/platform/android/android.cpp
@@ -323,7 +323,8 @@ void OSystem_Android::initBackend() {
_audio_thread_exit = false;
pthread_create(&_audio_thread, 0, audioThreadFunc, this);
- setupSurface();
+ initSurface();
+ initViewport();
_game_texture = new GLESPaletteTexture();
_overlay_texture = new GLES4444Texture();
@@ -404,42 +405,38 @@ bool OSystem_Android::pollEvent(Common::Event &event) {
if (pthread_self() == _main_thread) {
if (_screen_changeid != JNI::surface_changeid) {
if (JNI::egl_surface_width > 0 && JNI::egl_surface_height > 0) {
- LOGD("initializing surface");
+ if (_egl_surface_width > 0 && _egl_surface_height > 0) {
+ // surface still alive but changed
+ _screen_changeid = JNI::surface_changeid;
+ _egl_surface_width = JNI::egl_surface_width;
+ _egl_surface_height = JNI::egl_surface_height;
- _game_texture->release();
- _overlay_texture->release();
- _mouse_texture->release();
+ initViewport();
+ // double buffered, flip twice
+ _force_redraw = true;
+ updateScreen();
+ _force_redraw = true;
- JNI::deinitSurface();
- setupSurface();
+ event.type = Common::EVENT_SCREEN_CHANGED;
- _game_texture->reinit();
- _overlay_texture->reinit();
- _mouse_texture->reinit();
+ return true;
+ } else {
+ // new surface
+ initSurface();
+ _force_redraw = true;
- event.type = Common::EVENT_SCREEN_CHANGED;
+ event.type = Common::EVENT_SCREEN_CHANGED;
- return true;
+ return true;
+ }
+ } else {
+ // surface lost
+ deinitSurface();
}
-
- LOGD("deinitialiting surface");
-
- _game_texture->release();
- _overlay_texture->release();
- _mouse_texture->release();
-
- _screen_changeid = JNI::surface_changeid;
- JNI::deinitSurface();
}
if (JNI::pause) {
- // release some resources
- _game_texture->release();
- _overlay_texture->release();
- _mouse_texture->release();
-
- LOGD("deinitialiting surface");
- JNI::deinitSurface();
+ deinitSurface();
LOGD("main thread going to sleep");
sem_wait(&JNI::pause_sem);
@@ -596,7 +593,7 @@ void OSystem_Android::quit() {
delete _overlay_texture;
delete _mouse_texture;
- JNI::deinitSurface();
+ deinitSurface();
}
void OSystem_Android::setWindowCaption(const char *caption) {
diff --git a/backends/platform/android/android.h b/backends/platform/android/android.h
index 5db10fb180..bf72f98b01 100644
--- a/backends/platform/android/android.h
+++ b/backends/platform/android/android.h
@@ -140,7 +140,10 @@ private:
FilesystemFactory *_fsFactory;
timeval _startTime;
- void setupSurface();
+ void initSurface();
+ void deinitSurface();
+ void initViewport();
+
void setupKeymapper();
void _setCursorPalette(const byte *colors, uint start, uint num);
diff --git a/backends/platform/android/gfx.cpp b/backends/platform/android/gfx.cpp
index e2cc854a1d..31e8c4be18 100644
--- a/backends/platform/android/gfx.cpp
+++ b/backends/platform/android/gfx.cpp
@@ -62,20 +62,60 @@ int OSystem_Android::getGraphicsMode() const {
return 1;
}
-void OSystem_Android::setupSurface() {
- ENTER();
+void OSystem_Android::initSurface() {
+ LOGD("initializing surface");
- _screen_changeid = JNI::surface_changeid;
- JNI::initSurface();
+ assert(!JNI::haveSurface());
+ _screen_changeid = JNI::surface_changeid;
_egl_surface_width = JNI::egl_surface_width;
_egl_surface_height = JNI::egl_surface_height;
assert(_egl_surface_width > 0 && _egl_surface_height > 0);
- // EGL set up with a new surface. Initialise OpenGLES context.
+ JNI::initSurface();
+
+ // Initialise OpenGLES context.
GLESTexture::initGLExtensions();
+ if (_game_texture)
+ _game_texture->reinit();
+
+ if (_overlay_texture)
+ _overlay_texture->reinit();
+
+ if (_mouse_texture)
+ _mouse_texture->reinit();
+}
+
+void OSystem_Android::deinitSurface() {
+ if (!JNI::haveSurface())
+ return;
+
+ LOGD("deinitializing surface");
+
+ _screen_changeid = JNI::surface_changeid;
+ _egl_surface_width = 0;
+ _egl_surface_height = 0;
+
+ // release texture resources
+ if (_game_texture)
+ _game_texture->release();
+
+ if (_overlay_texture)
+ _overlay_texture->release();
+
+ if (_mouse_texture)
+ _mouse_texture->release();
+
+ JNI::deinitSurface();
+}
+
+void OSystem_Android::initViewport() {
+ LOGD("initializing viewport");
+
+ assert(JNI::haveSurface());
+
// Turn off anything that looks like 3D ;)
GLCALL(glDisable(GL_CULL_FACE));
GLCALL(glDisable(GL_DEPTH_TEST));
@@ -210,8 +250,8 @@ void OSystem_Android::updateScreen() {
}
if (_focus_rect.isEmpty()) {
- _game_texture->drawTexture(0, 0,
- _egl_surface_width, _egl_surface_height);
+ _game_texture->drawTexture(0, 0, _egl_surface_width,
+ _egl_surface_height);
} else {
GLCALL(glPushMatrix());
GLCALL(glScalex(xdiv(_egl_surface_width, _focus_rect.width()),
@@ -223,8 +263,8 @@ void OSystem_Android::updateScreen() {
xdiv(_game_texture->height(), _egl_surface_height),
1 << 16));
- _game_texture->drawTexture(0, 0,
- _egl_surface_width, _egl_surface_height);
+ _game_texture->drawTexture(0, 0, _egl_surface_width,
+ _egl_surface_height);
GLCALL(glPopMatrix());
}
@@ -234,9 +274,8 @@ void OSystem_Android::updateScreen() {
// ugly, but the modern theme sets a wacko factor, only god knows why
cs = 1;
- GLCALL(_overlay_texture->drawTexture(0, 0,
- _egl_surface_width,
- _egl_surface_height));
+ GLCALL(_overlay_texture->drawTexture(0, 0, _egl_surface_width,
+ _egl_surface_height));
}
if (_show_mouse) {