From ca184ac386d05852e8ebec09d98f3d1f80ba05da Mon Sep 17 00:00:00 2001 From: Sylvain Becker Date: Thu, 3 Jan 2019 23:22:50 +0100 Subject: [PATCH] Android: concurrency issue with egl_surface EGL_BAD_SURFACE - (bug 4142) Occurs when application goes to background: - Java activity is destroying SurfaceView holder and "egl_surface" (in onNativeSurfaceDestroyed()) - While native thread is in Android_GLES_SwapWindow(), prepared to call SDL_EGL_SwapBuffers() The error is "call to eglSwapBuffers failed, reporting an error of EGL_BAD_SURFACE" It an be reproduced easily by adding a SDL_Delay(100) at the begining of SDL_EGL_SwapBuffers(), and putting the application into background. --- src/video/android/SDL_androidgl.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/video/android/SDL_androidgl.c b/src/video/android/SDL_androidgl.c index 859b46e9f..d0c744387 100644 --- a/src/video/android/SDL_androidgl.c +++ b/src/video/android/SDL_androidgl.c @@ -42,14 +42,22 @@ SDL_EGL_MakeCurrent_impl(Android) int Android_GLES_SwapWindow(_THIS, SDL_Window * window) { + int retval; + + SDL_LockMutex(Android_ActivityMutex); + /* The following two calls existed in the original Java code * If you happen to have a device that's affected by their removal, * please report to Bugzilla. -- Gabriel */ - + /*_this->egl_data->eglWaitNative(EGL_CORE_NATIVE_ENGINE); _this->egl_data->eglWaitGL();*/ - return SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface); + retval = SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface); + + SDL_UnlockMutex(Android_ActivityMutex); + + return retval; } int