Android: when event loop is not blocking in pause, backup EGL context (Bug 4578) Backup the EGL context when SDL_APP_DIDENTERBACKGROUND has been removed from the event queue.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
diff --git a/src/video/android/SDL_androidevents.c b/src/video/android/SDL_androidevents.c
index e13916f..24a09ff 100644
--- a/src/video/android/SDL_androidevents.c
+++ b/src/video/android/SDL_androidevents.c
@@ -130,8 +130,7 @@ Android_PumpEvents_Blocking(_THIS)
* has reached the app */
if (SDL_NumberOfEvents(SDL_APP_DIDENTERBACKGROUND) > SDL_SemValue(Android_PauseSem)) {
videodata->isPausing = 1;
- }
- else {
+ } else {
videodata->isPausing = 0;
videodata->isPaused = 1;
}
@@ -143,8 +142,23 @@ void
Android_PumpEvents_NonBlocking(_THIS)
{
SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata;
+ static int backup_context;
if (videodata->isPaused) {
+
+ if (backup_context) {
+
+ SDL_LockMutex(Android_ActivityMutex);
+ android_egl_context_backup(Android_Window);
+ SDL_UnlockMutex(Android_ActivityMutex);
+
+ ANDROIDAUDIO_PauseDevices();
+ openslES_PauseDevices();
+
+ backup_context = 0;
+ }
+
+
if (SDL_SemTryWait(Android_ResumeSem) == 0) {
videodata->isPaused = 0;
@@ -165,16 +179,17 @@ Android_PumpEvents_NonBlocking(_THIS)
}
}
} else {
- if (SDL_SemTryWait(Android_PauseSem) == 0) {
-
- SDL_LockMutex(Android_ActivityMutex);
- android_egl_context_backup(Android_Window);
- SDL_UnlockMutex(Android_ActivityMutex);
-
- ANDROIDAUDIO_PauseDevices();
- openslES_PauseDevices();
-
- videodata->isPaused = 1;
+ if (videodata->isPausing || SDL_SemTryWait(Android_PauseSem) == 0) {
+ /* We've been signaled to pause (potentially several times), but before we block ourselves,
+ * we need to make sure that the very last event (of the first pause sequence, if several)
+ * has reached the app */
+ if (SDL_NumberOfEvents(SDL_APP_DIDENTERBACKGROUND) > SDL_SemValue(Android_PauseSem)) {
+ videodata->isPausing = 1;
+ } else {
+ videodata->isPausing = 0;
+ videodata->isPaused = 1;
+ backup_context = 1;
+ }
}
}
}