Thanks a lot Robert for tracking this down! I'm planning to use the code from your web site, very soon.
2010/4/6 Robert Green <[email protected]> > That occasional lock-up started happening constantly to me. I messed > around with a few things and found that the Droid really doesn't like > to have its Display and Context destroyed all the time. > > I modified the code so that it would reuse the display and context as > much as possible. I looked through my GLES book and it doesn't say > explicitly that you should always destroy them when your surface > changes so I have to assume that it must be ok. Even if it's not - > this works and it wasn't working before, so I'm using it. > > Here are the code modifications: > > In EglHelper: > > public void start() { > Log.d("EglHelper" + instanceId, "start()"); > if (mEgl == null) { > Log.d("EglHelper" + instanceId, "getting new EGL"); > /* > * Get an EGL instance > */ > mEgl = (EGL10) EGLContext.getEGL(); > } else { > Log.d("EglHelper" + instanceId, "reusing EGL"); > } > > if (mEglDisplay == null) { > Log.d("EglHelper" + instanceId, "getting new display"); > /* > * Get to the default display. > */ > mEglDisplay = > mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); > } else { > Log.d("EglHelper" + instanceId, "reusing display"); > } > > if (mEglConfig == null) { > Log.d("EglHelper" + instanceId, "getting new config"); > /* > * We can now initialize EGL for that display > */ > int[] version = new int[2]; > mEgl.eglInitialize(mEglDisplay, version); > mEglConfig = mEGLConfigChooser.chooseConfig(mEgl, > mEglDisplay); > } else { > Log.d("EglHelper" + instanceId, "reusing config"); > } > > if (mEglContext == null) { > Log.d("EglHelper" + instanceId, "creating new context"); > /* > * Create an OpenGL ES context. This must be done only > once, an OpenGL context is a somewhat heavy object. > */ > mEglContext = mEGLContextFactory.createContext(mEgl, > mEglDisplay, mEglConfig); > if (mEglContext == null || mEglContext == > EGL10.EGL_NO_CONTEXT) { > throw new RuntimeException("createContext failed"); > } > } else { > Log.d("EglHelper" + instanceId, "reusing context"); > } > > mEglSurface = null; > } > > > In GLThread: > > private void stopEglLocked() { > if (mHaveEgl) { > mHaveEgl = false; > mEglHelper.destroySurface(); > sGLThreadManager.releaseEglSurface(this); > } > } > > Basically, you don't want a finish() in there. > > But we do need to finish somewhere so, > > At the end of guardedRun(): > > } finally { > /* > * clean-up everything... > */ > synchronized (sGLThreadManager) { > // Log.d("GLThread" + getId(), "Finishing."); > stopEglLocked(); > mEglHelper.finish(); > } > } > } > > > Then Finally in GLWallpaperService: > > @Override > public void onDestroy() { > super.onDestroy(); > mGLThread.requestExitAndWait(); > } > > > Of course you can remove any logging you don't want. > > The idea here is that we get to reuse the display and context on > orientation changes which seems to make the Droid happy. I haven't > had a single crash since I switched to that, and I've probably > reoriented 100 times since then in testing. > > I'll update the post on my blog to contain all the current code. > > On Apr 6, 2:57 pm, Robert Green <[email protected]> wrote: > > By the way - things seemed good but I'm still having the occasional > > lock-up. The last one caused the phone to lock up badly enough that I > > had to pull the battery :( > > > > On Apr 6, 2:18 pm, Robert Green <[email protected]> wrote: > > > > > > > > > I'm in disbelief, but it works! Why does that hack work? Is it a > > > previous call to eglCreateWindowSurface which returns a bad value and > > > after that, cleaning up causes a bad state and the next call to create > > > window surface freezes? I don't quite understand but I guess I never > > > checked the return value of that call (because it wasn't returning > > > when I was having problems, but maybe it was too late then :)). > > > > > I tested and tested and tested again and this held up against all the > > > orientation changes I could possibly make. Good work! I'll update > > > the code I posted. > > > > > BTW - I'm still seeing the occasional: > > > E/libEGL ( 5769): eglChooseConfig:897 error 3005 (EGL_BAD_CONFIG) > > > W/dalvikvm( 5769): threadid=13: thread exiting with uncaught exception > > > (group=0x4001b180) > > > E/AndroidRuntime( 5769): Uncaught handler: thread GLThread 7 exiting > > > due to uncaught exception > > > E/AndroidRuntime( 5769): java.lang.IllegalArgumentException > > > E/AndroidRuntime( 5769): at > > > com.google.android.gles_jni.EGLImpl.eglGetConfigAttrib(Native Method) > > > E/AndroidRuntime( 5769): at android.opengl.EglHelper > > > $ComponentSizeChooser.findConfigAttrib(EglHelper.java:1007) > > > E/AndroidRuntime( 5769): at android.opengl.EglHelper > > > $ComponentSizeChooser.chooseConfig(EglHelper.java:987) > > > E/AndroidRuntime( 5769): at android.opengl.EglHelper > > > $BaseConfigChooser.chooseConfig(EglHelper.java:951) > > > E/AndroidRuntime( 5769): at > > > android.opengl.EglHelper.start(EglHelper.java:127) > > > E/AndroidRuntime( 5769): at android.opengl.EglHelper > > > $GLThread.guardedRun(EglHelper.java:421) > > > E/AndroidRuntime( 5769): at android.opengl.EglHelper > > > $GLThread.run(EglHelper.java:358) > > > > > I'm trying to track that one down but it's very hard to recreate. It > > > likes to happen the first time you run a newly installed gl live > > > wallpaper but then it doesn't happen again for a while. > > > > > Thanks guys for all your help! > > > > > On Apr 6, 11:29 am, shaun <[email protected]> wrote: > > > > > > Assuming I correctly identified the code that unixseb uses as the > > > > workaround/fix for orientation changes on Droid in Live Wallpaper > with > > > > OpenGL, the following code is the same with the exception of > > > > recursion: > > > > > > public EGLSurface createWindowSurface(EGL10 egl, EGLDisplay > > > > display, EGLConfig config, Object nativeWindow) { > > > > EGLSurface eglSurface = null; > > > > while (eglSurface == null) { > > > > try { > > > > eglSurface = egl.eglCreateWindowSurface(display, > > > > config, nativeWindow, null); > > > > } catch (Throwable t) { > > > > } finally { > > > > if (eglSurface == null) { > > > > try { > > > > Thread.sleep(10); > > > > } catch (InterruptedException t) { > > > > } > > > > } > > > > } > > > > > > } > > > > return eglSurface; > > > > } > > > > > > I'd like to know if unixseb's fix works for others. I still cannot > > > > test. > > > > > > On Apr 6, 11:00 am, Ralf Schneider <[email protected]> wrote: > > > > > > > I'm also interested in this topic. I got an 404 on the link: This > seems to > > > > > work: > > > > > > >http://code.google.com/p/earth-live-wallpaper/ > > > > > > > Thank you for sharing your code! > > > > > > > 2010/4/6 unixseb <[email protected]> > > > > > > > > have a look at the svn repository on > code.google.com/project/earth- > > > > > > live-wallpaper < > http://code.google.com/project/earth-%0Alive-wallpaper> > > > > > > the hack int the glwallpaperservice class avoid some crashes with > > > > > > screen rotation on droids. > > > > > > > > On 5 avr, 20:24, Robert Green <[email protected]> wrote: > > > > > > > Oh, so you solved it?? What's the issue and what's the > workaround? > > > > > > > > > On Apr 4, 3:33 pm, unixseb <[email protected]> wrote: > > > > > > > > > > i can help you, > > > > > > > > i'm having this issue with earth live wallpaper. > > > > > > > > i tracked a bug in the swap function taht causes service > dies, but i > > > > > > > > was looking for this one for a long time now ! > > > > > > > > > > On 3 avr, 23:56, Robert Green <[email protected]> wrote: > > > > > > > > > > > I've had this reported to me by a few people using the > > > > > > > > >GLWallpaperServicecode I posted. I've been debugging this > for hours > > > > > > > > > and have so far tracked the problem down to > > > > > > > > > egl.eglCreateWindowSurface(display, config, nativeWindow, > null); > > > > > > > > > > > It never returns and every notifyAll() after that results > in: > > > > > > > > > W/SharedBufferStack( 1030): > waitForCondition(ReallocateCondition) > > > > > > > > > timed out (identity=288, status=0). CPU may be pegged. > trying again. > > > > > > > > > > > It seems to happen when switching orientation - so when the > surface > > > > > > is > > > > > > > > > being destroyed/recreated and more specifically when calls > to render > > > > > > > > > the frame are being made at the same time. If there are no > render > > > > > > > > > calls happening while switching, things seem mostly ok. > I'm > > > > > > debugging > > > > > > > > > this further but I feel like a method like that should > never > > > > > > > > > deadlock. Seems like a bug somewhere below the line to me. > > > > > > > > > > > Since none of the GL init code from the shipped live > wallpapers was > > > > > > > > > posted anywhere, I have no good reference to use for how to > properly > > > > > > > > > handle the window resizing. Clearly the code I'm using > does it a > > > > > > > > > little differently but I still feel like a deadlock like > this should > > > > > > > > > not occur. > > > > > > > > -- > > > > > > 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]<android-developers%[email protected]><android-developers%2Bunsubs > [email protected]> > > > > > > For more options, visit this group at > > > > > >http://groups.google.com/group/android-developers?hl=en > > > > > > > > To unsubscribe, reply using "remove me" as the subject.- Hide > quoted text - > > > > > > > - Show quoted text - > > -- > 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]<android-developers%[email protected]> > For more options, visit this group at > http://groups.google.com/group/android-developers?hl=en > -- 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

