Merge change I32d41651 into eclair

* changes:
  Allow a GLThread to release and reacquire the EGL Surface as needed.
This commit is contained in:
Android (Google) Code Review
2009-11-08 10:19:59 -08:00

View File

@@ -971,33 +971,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;
@@ -1021,20 +1029,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();
}
@@ -1053,7 +1071,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
}
}
if (needStart) {
mEglHelper.start();
startEgl();
tellRendererSurfaceCreated = true;
changed = true;
}
@@ -1084,21 +1102,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;
}
@@ -1223,6 +1236,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;
@@ -1273,9 +1287,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
}
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 {