Merge change I32d41651 into eclair
* changes:
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 ac27a2d..0330163 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -971,33 +971,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;
@@ -1021,20 +1029,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();
}
@@ -1053,7 +1071,7 @@
}
}
if (needStart) {
- mEglHelper.start();
+ startEgl();
tellRendererSurfaceCreated = true;
changed = true;
}
@@ -1084,21 +1102,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;
}
@@ -1223,6 +1236,7 @@
private boolean mPaused;
private boolean mHasSurface;
private boolean mWaitingForSurface;
+ private boolean mHaveEgl;
private int mWidth;
private int mHeight;
private int mRenderMode;
@@ -1273,9 +1287,9 @@
}
static class GLThreadManager {
- public boolean shouldQuit(GLThread thread) {
+ public boolean shouldHaveEgl(GLThread thread) {
synchronized(this) {
- return thread != mMostRecentGLThread;
+ return thread == mMostRecentGLThread || mMostRecentGLThread == null;
}
}
public void start(GLThread thread) throws InterruptedException {