From 45a9b5fa2ef806480b39fd63ee11466a4adadc89 Mon Sep 17 00:00:00 2001 From: Sylvain Becker Date: Sat, 21 Dec 2019 21:18:02 +0100 Subject: [PATCH] Android: fix call of glFinish without context. Message in the log, when going to background: "call to OpenGL ES API with no current context (logged once per thread)" Because of SDL_WINDOWEVENT_MINIMIZED is sent from the Java Activity thread. It calls SDL_RendererEventWatch(), _WindowEvent() and glFinish() without context. Solution is to move sending of SDL_WINDOWEVENT_MINIMIZED to the SDL thread. --- src/core/android/SDL_android.c | 16 ++-------------- src/video/android/SDL_androidevents.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index 4d6d9f9f3..1081b5897 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -1162,23 +1162,11 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeQuit)( JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativePause)( JNIEnv *env, jclass cls) { - SDL_LockMutex(Android_ActivityMutex); - __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativePause()"); - if (Android_Window) { - SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_MINIMIZED, 0, 0); - SDL_SendAppEvent(SDL_APP_WILLENTERBACKGROUND); - SDL_SendAppEvent(SDL_APP_DIDENTERBACKGROUND); - } - - /* *After* sending the relevant events, signal the pause semaphore - * so the event loop knows to pause and (optionally) block itself. - * Sometimes 2 pauses can be queued (eg pause/resume/pause), so it's - * always increased. */ + /* Signal the pause semaphore so the event loop knows to pause and (optionally) block itself. + * Sometimes 2 pauses can be queued (eg pause/resume/pause), so it's always increased. */ SDL_SemPost(Android_PauseSem); - - SDL_UnlockMutex(Android_ActivityMutex); } /* Resume */ diff --git a/src/video/android/SDL_androidevents.c b/src/video/android/SDL_androidevents.c index 87ad12fef..139eb3827 100644 --- a/src/video/android/SDL_androidevents.c +++ b/src/video/android/SDL_androidevents.c @@ -27,6 +27,7 @@ #include "SDL_androidkeyboard.h" #include "SDL_androidwindow.h" #include "../SDL_sysvideo.h" +#include "../../events/SDL_events_c.h" /* Can't include sysaudio "../../audio/android/SDL_androidaudio.h" * because of THIS redefinition */ @@ -129,6 +130,14 @@ Android_PumpEvents_Blocking(_THIS) } } else { if (videodata->isPausing || SDL_SemTryWait(Android_PauseSem) == 0) { + + /* Android_PauseSem was signaled */ + if (videodata->isPausing == 0) { + SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_MINIMIZED, 0, 0); + SDL_SendAppEvent(SDL_APP_WILLENTERBACKGROUND); + SDL_SendAppEvent(SDL_APP_DIDENTERBACKGROUND); + } + /* 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 */ @@ -187,6 +196,14 @@ Android_PumpEvents_NonBlocking(_THIS) } } else { if (videodata->isPausing || SDL_SemTryWait(Android_PauseSem) == 0) { + + /* Android_PauseSem was signaled */ + if (videodata->isPausing == 0) { + SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_MINIMIZED, 0, 0); + SDL_SendAppEvent(SDL_APP_WILLENTERBACKGROUND); + SDL_SendAppEvent(SDL_APP_DIDENTERBACKGROUND); + } + /* 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 */