diff options
Diffstat (limited to 'backends')
-rw-r--r-- | backends/platform/android/android.cpp | 55 | ||||
-rw-r--r-- | backends/platform/android/android.h | 5 | ||||
-rw-r--r-- | backends/platform/android/gfx.cpp | 63 |
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) { |