am 8da3ac92: resolved conflicts for merge of 3f857b78 to eclair-mr2

Merge commit '8da3ac92a6a6247ef06de4d4b684f8635d8fc003' into eclair-mr2-plus-aosp

* commit '8da3ac92a6a6247ef06de4d4b684f8635d8fc003':
  Allow a GLThread to release and reacquire the EGL Surface as needed.
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 @@
              * 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 @@
                             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 @@
                         }
                     }
                     if (needStart) {
-                        mEglHelper.start();
+                        startEgl();
                         tellRendererSurfaceCreated = true;
                         changed = true;
                     }
@@ -1097,21 +1115,16 @@
                 /*
                  * 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 @@
         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 @@
     }
 
     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 boolean shouldQuit(GLThread thread) {
-            synchronized(this) {
-                return thread != mMostRecentGLThread;
-            }
-        }
-
         private boolean mGLESVersionCheckComplete;
         private int mGLESVersion;
         private GLThread mMostRecentGLThread;