Commit bd344c2287220dffdc7ab67dd44be0851056b2e4

Sylvain Becker 2019-04-12T23:15:26

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.

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;
+            }
         }
     }
 }