summaryrefslogtreecommitdiffstats
path: root/opengl/java/android
diff options
context:
space:
mode:
authorJack Palevich <jackpal@google.com>2009-09-21 16:09:45 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2009-09-21 16:09:45 -0700
commit5ac5b68bf103036843deb2e489d07e46c49c4bbd (patch)
treec3630b1503d6c8a6e8ad1fe15417bc7a2c877fcb /opengl/java/android
parent5c5be2499f25853d0af2154862e648a10da2e4c6 (diff)
parent5222a9571ea2538c989608d376ac71eabe0f09d4 (diff)
downloadframeworks_base-5ac5b68bf103036843deb2e489d07e46c49c4bbd.zip
frameworks_base-5ac5b68bf103036843deb2e489d07e46c49c4bbd.tar.gz
frameworks_base-5ac5b68bf103036843deb2e489d07e46c49c4bbd.tar.bz2
am 5222a957: Merge change 26270 into eclair
Merge commit '5222a9571ea2538c989608d376ac71eabe0f09d4' into eclair-plus-aosp * commit '5222a9571ea2538c989608d376ac71eabe0f09d4': Fix GLSurfaceView to sync surfaceDestroyed with GL rendering thread
Diffstat (limited to 'opengl/java/android')
-rw-r--r--opengl/java/android/opengl/GLSurfaceView.java27
1 files changed, 26 insertions, 1 deletions
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index 022da0c..07c19b4 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -826,7 +826,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
return mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST;
}
- public void finish() {
+ public void destroySurface() {
if (mEglSurface != null) {
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE,
@@ -834,6 +834,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
mEglSurface = null;
}
+ }
+
+ public void finish() {
if (mEglContext != null) {
mEgl.eglDestroyContext(mEglDisplay, mEglContext);
mEglContext = null;
@@ -919,10 +922,18 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
r.run();
}
if (mPaused) {
+ mEglHelper.destroySurface();
mEglHelper.finish();
needStart = true;
}
while (needToWait()) {
+ if (!mHasSurface) {
+ if (!mWaitingForSurface) {
+ mEglHelper.destroySurface();
+ mWaitingForSurface = true;
+ notify();
+ }
+ }
wait();
}
if (mDone) {
@@ -933,6 +944,11 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
h = mHeight;
mSizeChanged = false;
mRequestRender = false;
+ if (mHasSurface && mWaitingForSurface) {
+ changed = true;
+ mWaitingForSurface = false;
+ mRequestRender = true; // Forces a redraw for RENDERMODE_RENDER_WHEN_DIRTY
+ }
}
if (needStart) {
mEglHelper.start();
@@ -966,6 +982,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
/*
* clean-up everything...
*/
+ mEglHelper.destroySurface();
mEglHelper.finish();
}
@@ -1021,6 +1038,13 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
synchronized(this) {
mHasSurface = false;
notify();
+ while(!mWaitingForSurface) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
}
}
@@ -1083,6 +1107,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
private boolean mDone;
private boolean mPaused;
private boolean mHasSurface;
+ private boolean mWaitingForSurface;
private int mWidth;
private int mHeight;
private int mRenderMode;