Commit e994be58337d5c0e9e8d4f49ed696c2bd6c0e1b8

Sylvain Becker 2019-01-16T10:31:51

Android: move static variable isPaused/isPausing to SDL_VideoData structure - remove unneed check to Android_Window->driverdata - add window check into context_backup/restore

diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c
index c6795f0..2136c1b 100644
--- a/src/core/android/SDL_android.c
+++ b/src/core/android/SDL_android.c
@@ -800,7 +800,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceCreated)(JNIEnv *env, j
 {
     SDL_LockMutex(Android_ActivityMutex);
 
-    if (Android_Window && Android_Window->driverdata)
+    if (Android_Window)
     {
         SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata;
 
@@ -818,7 +818,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceChanged)(JNIEnv *env, j
 {
     SDL_LockMutex(Android_ActivityMutex);
 
-    if (Android_Window && Android_Window->driverdata)
+    if (Android_Window)
     {
         SDL_VideoDevice *_this = SDL_GetVideoDevice();
         SDL_WindowData  *data  = (SDL_WindowData *) Android_Window->driverdata;
@@ -839,7 +839,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceDestroyed)(JNIEnv *env,
 {
     SDL_LockMutex(Android_ActivityMutex);
 
-    if (Android_Window && Android_Window->driverdata)
+    if (Android_Window)
     {
         SDL_VideoDevice *_this = SDL_GetVideoDevice();
         SDL_WindowData  *data  = (SDL_WindowData *) Android_Window->driverdata;
diff --git a/src/video/android/SDL_androidevents.c b/src/video/android/SDL_androidevents.c
index 1dba149..a51fd21 100644
--- a/src/video/android/SDL_androidevents.c
+++ b/src/video/android/SDL_androidevents.c
@@ -59,25 +59,29 @@ SDL_NumberOfEvents(Uint32 type)
 static void
 android_egl_context_restore(SDL_Window *window)
 {
-    SDL_Event event;
-    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
-    if (SDL_GL_MakeCurrent(window, (SDL_GLContext) data->egl_context) < 0) {
-        /* The context is no longer valid, create a new one */
-        data->egl_context = (EGLContext) SDL_GL_CreateContext(window);
-        SDL_GL_MakeCurrent(window, (SDL_GLContext) data->egl_context);
-        event.type = SDL_RENDER_DEVICE_RESET;
-        SDL_PushEvent(&event);
+    if (window) {
+        SDL_Event event;
+        SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
+        if (SDL_GL_MakeCurrent(window, (SDL_GLContext) data->egl_context) < 0) {
+            /* The context is no longer valid, create a new one */
+            data->egl_context = (EGLContext) SDL_GL_CreateContext(window);
+            SDL_GL_MakeCurrent(window, (SDL_GLContext) data->egl_context);
+            event.type = SDL_RENDER_DEVICE_RESET;
+            SDL_PushEvent(&event);
+        }
     }
 }
 
 static void
 android_egl_context_backup(SDL_Window *window)
 {
-    /* Keep a copy of the EGL Context so we can try to restore it when we resume */
-    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
-    data->egl_context = SDL_GL_GetCurrentContext();
-    /* We need to do this so the EGLSurface can be freed */
-    SDL_GL_MakeCurrent(window, NULL);
+    if (window) {
+        /* Keep a copy of the EGL Context so we can try to restore it when we resume */
+        SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
+        data->egl_context = SDL_GL_GetCurrentContext();
+        /* We need to do this so the EGLSurface can be freed */
+        SDL_GL_MakeCurrent(window, NULL);
+    }
 }
 
 
@@ -93,10 +97,9 @@ android_egl_context_backup(SDL_Window *window)
 void
 Android_PumpEvents(_THIS)
 {
-    static int isPaused = 0;
-    static int isPausing = 0;
+    SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata;
 
-    if (isPaused) {
+    if (videodata->isPaused) {
 
         /* Make sure this is the last thing we do before pausing */
         SDL_LockMutex(Android_ActivityMutex);
@@ -108,7 +111,7 @@ Android_PumpEvents(_THIS)
 
         if (SDL_SemWait(Android_ResumeSem) == 0) {
 
-            isPaused = 0;
+            videodata->isPaused = 0;
 
             ANDROIDAUDIO_ResumeDevices();
             openslES_ResumeDevices();
@@ -126,16 +129,16 @@ Android_PumpEvents(_THIS)
             }
         }
     } else {
-        if (isPausing || SDL_SemTryWait(Android_PauseSem) == 0) {
+        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)) {
-                isPausing = 1;
+                videodata->isPausing = 1;
             }
             else {
-                isPausing = 0;
-                isPaused = 1;
+                videodata->isPausing = 0;
+                videodata->isPaused = 1;
             }
         }
     }
@@ -146,12 +149,12 @@ Android_PumpEvents(_THIS)
 void
 Android_PumpEvents(_THIS)
 {
-    static int isPaused = 0;
+    SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata;
 
-    if (isPaused) {
+    if (videodata->isPaused) {
         if (SDL_SemTryWait(Android_ResumeSem) == 0) {
 
-            isPaused = 0;
+            videodata->isPaused = 0;
 
             ANDROIDAUDIO_ResumeDevices();
             openslES_ResumeDevices();
@@ -178,7 +181,7 @@ Android_PumpEvents(_THIS)
             ANDROIDAUDIO_PauseDevices();
             openslES_PauseDevices();
 
-            isPaused = 1;
+            videodata->isPaused = 1;
         }
     }
 }
diff --git a/src/video/android/SDL_androidvideo.c b/src/video/android/SDL_androidvideo.c
index dcb65a9..0050653 100644
--- a/src/video/android/SDL_androidvideo.c
+++ b/src/video/android/SDL_androidvideo.c
@@ -172,7 +172,11 @@ VideoBootStrap Android_bootstrap = {
 int
 Android_VideoInit(_THIS)
 {
-    SDL_DisplayMode mode;
+    SDL_VideoData   *videodata = (SDL_VideoData *)_this->driverdata;
+    SDL_DisplayMode  mode;
+
+    videodata->isPaused  = SDL_FALSE;
+    videodata->isPausing = SDL_FALSE;
 
     mode.format = Android_ScreenFormat;
     mode.w = Android_DeviceWidth;
diff --git a/src/video/android/SDL_androidvideo.h b/src/video/android/SDL_androidvideo.h
index acb5ca2..d130f41 100644
--- a/src/video/android/SDL_androidvideo.h
+++ b/src/video/android/SDL_androidvideo.h
@@ -34,7 +34,9 @@ extern void Android_SetScreenResolution(SDL_Window *window, int surfaceWidth, in
 
 typedef struct SDL_VideoData
 {
-    SDL_Rect        textRect;
+    SDL_Rect textRect;
+    int      isPaused;
+    int      isPausing;
 } SDL_VideoData;
 
 extern int Android_SurfaceWidth;