diff options
author | Jack Palevich <jackpal@google.com> | 2009-11-10 08:04:53 +0800 |
---|---|---|
committer | Jack Palevich <jackpal@google.com> | 2009-11-10 08:04:53 +0800 |
commit | 8da3ac92a6a6247ef06de4d4b684f8635d8fc003 (patch) | |
tree | 6384e0aecbba872ab451d47528792cbe9a07fb3d /opengl/java | |
parent | 26c91fa694464c79de39988f9f42cee375ff0a14 (diff) | |
parent | 3f857b78fc68e5d700139bdc6078c5333b62a9bc (diff) | |
download | frameworks_base-8da3ac92a6a6247ef06de4d4b684f8635d8fc003.zip frameworks_base-8da3ac92a6a6247ef06de4d4b684f8635d8fc003.tar.gz frameworks_base-8da3ac92a6a6247ef06de4d4b684f8635d8fc003.tar.bz2 |
resolved conflicts for merge of 3f857b78 to eclair-mr2
Diffstat (limited to 'opengl/java')
-rw-r--r-- | opengl/java/android/opengl/GLSurfaceView.java | 90 |
1 files changed, 54 insertions, 36 deletions
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java index f11123e..bb90ef8 100644 --- a/opengl/java/android/opengl/GLSurfaceView.java +++ b/opengl/java/android/opengl/GLSurfaceView.java @@ -983,33 +983,41 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback * accesses EGL. */ try { - try { - sGLThreadManager.start(this); - } catch (InterruptedException e) { - return; - } guardedRun(); } catch (InterruptedException e) { // fall thru and exit normally } finally { - try { - sGLThreadManager.end(this); - } finally { - synchronized(this) { - if (LOG_THREADS) { - Log.i("GLThread", "exiting tid=" + getId()); - } - mDone = true; - notifyAll(); + synchronized(this) { + if (LOG_THREADS) { + Log.i("GLThread", "exiting tid=" + getId()); } + mDone = true; + notifyAll(); } } } + private void startEgl() throws InterruptedException { + if (! mHaveEgl) { + mHaveEgl = true; + sGLThreadManager.start(this); + mEglHelper.start(); + } + } + + private void stopEgl() { + if (mHaveEgl) { + mHaveEgl = false; + mEglHelper.destroySurface(); + mEglHelper.finish(); + sGLThreadManager.end(this); + } + } + private void guardedRun() throws InterruptedException { mEglHelper = new EglHelper(); try { - mEglHelper.start(); + startEgl(); GL10 gl = null; boolean tellRendererSurfaceCreated = true; @@ -1033,20 +1041,30 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback r.run(); } if (mPaused) { - mEglHelper.destroySurface(); - mEglHelper.finish(); + stopEgl(); needStart = true; } - while (needToWait()) { - if (LOG_THREADS) { - Log.i("GLThread", "needToWait tid=" + getId()); - } + while(true) { if (!mHasSurface) { if (!mWaitingForSurface) { - mEglHelper.destroySurface(); + stopEgl(); mWaitingForSurface = true; notifyAll(); } + } else { + boolean shouldHaveEgl = sGLThreadManager.shouldHaveEgl(this); + if (mHaveEgl && (!shouldHaveEgl)) { + stopEgl(); + } else if ((!mHaveEgl) && shouldHaveEgl) { + startEgl(); + needStart = true; + } + } + if (!needToWait()) { + break; + } + if (LOG_THREADS) { + Log.i("GLThread", "needToWait tid=" + getId()); } wait(); } @@ -1065,7 +1083,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback } } if (needStart) { - mEglHelper.start(); + startEgl(); tellRendererSurfaceCreated = true; changed = true; } @@ -1097,21 +1115,16 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback /* * clean-up everything... */ - mEglHelper.destroySurface(); - mEglHelper.finish(); + stopEgl(); } } private boolean needToWait() { - if (sGLThreadManager.shouldQuit(this)) { - mDone = true; - notifyAll(); - } if (mDone) { return false; } - if (mPaused || (! mHasSurface)) { + if (mPaused || (! mHasSurface) || (! mHaveEgl)) { return true; } @@ -1236,6 +1249,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback private boolean mPaused; private boolean mHasSurface; private boolean mWaitingForSurface; + private boolean mHaveEgl; private int mWidth; private int mHeight; private int mRenderMode; @@ -1286,6 +1300,16 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback } private static class GLThreadManager { + public boolean shouldHaveEgl(GLThread thread) { + if (mMultipleGLESContextsAllowed) { + return true; + } else { + synchronized(this) { + return thread == mMostRecentGLThread || mMostRecentGLThread == null; + } + } + } + public void start(GLThread thread) throws InterruptedException { if (! mGLESVersionCheckComplete) { mGLESVersion = SystemProperties.getInt( @@ -1338,12 +1362,6 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback } } - public boolean shouldQuit(GLThread thread) { - synchronized(this) { - return thread != mMostRecentGLThread; - } - } - private boolean mGLESVersionCheckComplete; private int mGLESVersion; private GLThread mMostRecentGLThread; |