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.
This commit is contained in:
Jack Palevich
2009-11-09 16:11:11 -08:00
committed by Android Git Automerger

View File

@ -983,17 +983,9 @@ 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) {
@ -1004,12 +996,28 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
}
}
}
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;