Hi,

i got some reports from users of our framework that opening/closing an
OpenGL ES based app would force close with an EGL_BAD_ALLOC after
~20-30 open/close cycles on an Android 2.3 device. To eliminate any
problems related to our framework i wrote the simplest GLSurfaceView
based app i could come up with:

package com.badlogic.egl;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class EglBadAlloc extends Activity {
        GLSurfaceView view;

        @Override public void onCreate (Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                requestWindowFeature(Window.FEATURE_NO_TITLE);
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
 
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
                view = new GLSurfaceView(this);
                view.setRenderer(new Renderer() {
                        @Override public void onDrawFrame (GL10 gl) {
                                gl.glClearColor(1, 0, 0, 1);
                                gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
                        }

                        @Override public void onSurfaceChanged (GL10 gl, int 
width, int
height) {
                        }

                        @Override public void onSurfaceCreated (GL10 gl, 
EGLConfig config)
{
                        }
                });

                setContentView(view);
        }

        @Override public void onPause () {
                super.onPause();
                view.onPause();
        }

        @Override public void onResume() {
                super.onResume();
                view.onResume();
        }
}

Running this on a Nexus One/Samsung Galaxy S with stock 2.3.3 will
eventually result in a force close with the following interesting
stack trace:

04-13 13:33:24.400: VERBOSE/RenderScript_jni(191): surfaceDestroyed
04-13 13:33:24.460: ERROR/Surface(867): invalid token (identity=335)
04-13 13:33:24.470: ERROR/Surface(867): invalid token (identity=335)
04-13 13:33:24.470: ERROR/Surface(867): invalid token (identity=335)
04-13 13:33:24.470: ERROR/Adreno200-EGL(867): egliGetNativeWindowSize:
unable to dequeue native buffer
04-13 13:33:24.470: ERROR/Surface(867): invalid token (identity=335)
04-13 13:33:24.470: ERROR/Surface(867): invalid token (identity=335)
04-13 13:33:24.470: ERROR/Adreno200-EGL(867): egliGetNativeWindowSize:
unable to dequeue native buffer
04-13 13:33:24.470: ERROR/Surface(867): invalid token (identity=335)
04-13 13:33:24.480: WARN/dalvikvm(867): threadid=9: thread exiting
with uncaught exception (group=0x40015560)
04-13 13:33:24.490: ERROR/AndroidRuntime(867): FATAL EXCEPTION:
GLThread 41
04-13 13:33:24.490: ERROR/AndroidRuntime(867):
java.lang.RuntimeException: eglMakeCurrent failed: EGL_BAD_ALLOC
04-13 13:33:24.490: ERROR/AndroidRuntime(867):     at
android.opengl.GLSurfaceView
$EglHelper.throwEglException(GLSurfaceView.java:1080)
04-13 13:33:24.490: ERROR/AndroidRuntime(867):     at
android.opengl.GLSurfaceView
$EglHelper.throwEglException(GLSurfaceView.java:1072)
04-13 13:33:24.490: ERROR/AndroidRuntime(867):     at
android.opengl.GLSurfaceView
$EglHelper.createSurface(GLSurfaceView.java:992)
04-13 13:33:24.490: ERROR/AndroidRuntime(867):     at
android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:
1335)
04-13 13:33:24.490: ERROR/AndroidRuntime(867):     at
android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)
04-13 13:33:24.490: WARN/ActivityManager(103):   Force finishing
activity com.badlogic.egl/.EglBadAlloc

To reproduce the issue just open and close (via the backbutton) the
app above around ~20 times in succession. The app is cached on 2.3 it
seems, The cache memory is growing and eventually the EGL error will
appear, force closing the app.

I looked at the sources of GLSurfaceView for 2.2 and 2.3 (latest AOSP
release tag in both cases) and there seem to be some changes in the
way EGL context destruction is handled. It seems that one can
explicitely request a the context destruction now. Sadly my brain
couldn't untangle the logic behind all that yet (and i'm afraid i lack
the time to go further down that rabbit hole).

So, before i log a bug on b.android.com, does anyone see a problem
with my above Activity code? Is there any solution that might not
require waiting for the next Android release and it's deployment?

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to