Forgot to add: the problem does not appear on Android < 2.3 (tested on
Hero 1.5, Droid 2.1.1, HTC Desire HD 2.2.2).

On 13 Apr., 14:31, Mario Zechner <[email protected]> wrote:
> 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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to