diff -r b14d00c30095 android-project/src/org/libsdl/app/SDLActivity.java --- a/android-project/src/org/libsdl/app/SDLActivity.java Sat Aug 03 02:20:00 2013 -0400 +++ b/android-project/src/org/libsdl/app/SDLActivity.java Sat Aug 03 15:44:31 2013 +0300 @@ -72,6 +72,8 @@ // Set up the surface mEGLSurface = EGL10.EGL_NO_SURFACE; mSurface = new SDLSurface(getApplication()); + mEGLContext = EGL10.EGL_NO_CONTEXT; + mEGLDisplay = EGL10.EGL_NO_DISPLAY; mLayout = new AbsoluteLayout(this); mLayout.addView(mSurface); @@ -249,6 +251,21 @@ public static boolean createGLContext(int majorVersion, int minorVersion, int[] attribs) { return initEGL(majorVersion, minorVersion, attribs); } + + public static void deleteGLContext() { + if (SDLActivity.mEGLDisplay != EGL10.EGL_NO_DISPLAY && SDLActivity.mEGLContext != EGL10.EGL_NO_CONTEXT) { + Log.v("SDL", "Destroying OpenGL ES Context"); + EGL10 egl = (EGL10)EGLContext.getEGL(); + egl.eglMakeCurrent(SDLActivity.mEGLDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); + egl.eglDestroyContext(SDLActivity.mEGLDisplay, SDLActivity.mEGLContext); + SDLActivity.mEGLContext = EGL10.EGL_NO_CONTEXT; + + if (SDLActivity.mEGLSurface != EGL10.EGL_NO_SURFACE) { + egl.eglDestroySurface(SDLActivity.mEGLDisplay, SDLActivity.mEGLSurface); + SDLActivity.mEGLSurface = EGL10.EGL_NO_SURFACE; + } + } + } public static void flipBuffers() { flipEGL(); @@ -314,15 +331,20 @@ // EGL functions public static boolean initEGL(int majorVersion, int minorVersion, int[] attribs) { try { - if (SDLActivity.mEGLDisplay == null) { + if (SDLActivity.mEGLContext == EGL10.EGL_NO_CONTEXT) { Log.v("SDL", "Starting up OpenGL ES " + majorVersion + "." + minorVersion); EGL10 egl = (EGL10)EGLContext.getEGL(); - EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); + EGLDisplay dpy; + if (SDLActivity.mEGLDisplay == EGL10.EGL_NO_DISPLAY) { + dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); - int[] version = new int[2]; - egl.eglInitialize(dpy, version); + int[] version = new int[2]; + egl.eglInitialize(dpy, version); + } else { + dpy = SDLActivity.mEGLDisplay; + } EGLConfig[] configs = new EGLConfig[128]; int[] num_config = new int[1]; @@ -395,9 +417,9 @@ } public static boolean createEGLSurface() { - if (SDLActivity.mEGLDisplay != null && SDLActivity.mEGLConfig != null) { + if (SDLActivity.mEGLDisplay != EGL10.EGL_NO_DISPLAY && SDLActivity.mEGLConfig != null) { EGL10 egl = (EGL10)EGLContext.getEGL(); - if (SDLActivity.mEGLContext == null) createEGLContext(); + if (SDLActivity.mEGLContext == EGL10.EGL_NO_CONTEXT) createEGLContext(); if (SDLActivity.mEGLSurface == EGL10.EGL_NO_SURFACE) { Log.v("SDL", "Creating new EGL Surface"); diff -r b14d00c30095 src/core/android/SDL_android.c --- a/src/core/android/SDL_android.c Sat Aug 03 02:20:00 2013 -0400 +++ b/src/core/android/SDL_android.c Sat Aug 03 15:44:31 2013 +0300 @@ -71,6 +71,7 @@ // method signatures static jmethodID midCreateGLContext; +static jmethodID midDeleteGLContext; static jmethodID midFlipBuffers; static jmethodID midAudioInit; static jmethodID midAudioWriteShortBuffer; @@ -120,6 +121,8 @@ midCreateGLContext = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, "createGLContext","(II[I)Z"); + midDeleteGLContext = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, + "deleteGLContext","()V"); midFlipBuffers = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, "flipBuffers","()V"); midAudioInit = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, @@ -361,6 +364,13 @@ return success ? SDL_TRUE : SDL_FALSE; } +SDL_bool Android_JNI_DeleteContext(SDL_GLContext context) +{ + /* There's only one context, so the parameter is ignored for now */ + JNIEnv *env = Android_JNI_GetEnv(); + (*env)->CallStaticBooleanMethod(env, mActivityClass, midDeleteGLContext); +} + void Android_JNI_SwapWindow() { JNIEnv *mEnv = Android_JNI_GetEnv(); diff -r b14d00c30095 src/video/android/SDL_androidgl.c --- a/src/video/android/SDL_androidgl.c Sat Aug 03 02:20:00 2013 -0400 +++ b/src/video/android/SDL_androidgl.c Sat Aug 03 15:44:31 2013 +0300 @@ -119,7 +119,9 @@ void Android_GL_DeleteContext(_THIS, SDL_GLContext context) { - __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_DeleteContext\n"); + if (context) { + Android_JNI_DeleteContext(context); + } } #endif /* SDL_VIDEO_DRIVER_ANDROID */