diff options
author | Jack Palevich <jackpal@google.com> | 2011-10-28 13:25:12 -0700 |
---|---|---|
committer | Jack Palevich <jackpal@google.com> | 2011-10-28 14:38:53 -0700 |
commit | b50e2afd6782e9b877f52844bec106c12ff9a9ef (patch) | |
tree | 18a1b86e6fbb5d5dc9e7fe42f5a9e79c0030a76a /opengl | |
parent | e707859415f4c8e1c01228dfaa58fb0a690d442e (diff) | |
download | frameworks_base-b50e2afd6782e9b877f52844bec106c12ff9a9ef.zip frameworks_base-b50e2afd6782e9b877f52844bec106c12ff9a9ef.tar.gz frameworks_base-b50e2afd6782e9b877f52844bec106c12ff9a9ef.tar.bz2 |
Destroy and recreate the EGL surface when the surface size changes.
Details:
+ Split EGLHelper.createSurface into two methods.
+ Add a separate flag for specifying when to create the GlInterface.
+ destroy and recreate the EGL surface when the surface size changes
+ Remove no-longer-needed work-around for b/2263168.
This fixes b/2263168
Change-Id: I0d2596527e3c8dabacdd8a8e427531eaefe7d266
Diffstat (limited to 'opengl')
-rw-r--r-- | opengl/java/android/opengl/GLSurfaceView.java | 60 |
1 files changed, 30 insertions, 30 deletions
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java index 0b4f403..cd41185 100644 --- a/opengl/java/android/opengl/GLSurfaceView.java +++ b/opengl/java/android/opengl/GLSurfaceView.java @@ -30,7 +30,6 @@ import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.content.pm.ConfigurationInfo; -import android.graphics.PixelFormat; import android.os.SystemProperties; import android.util.AttributeSet; import android.util.Log; @@ -163,8 +162,6 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback private final static boolean LOG_RENDERER = false; private final static boolean LOG_RENDERER_DRAW_FRAME = false; private final static boolean LOG_EGL = false; - // Work-around for bug 2263168 - private final static boolean DRAW_TWICE_AFTER_SIZE_CHANGED = true; /** * The renderer only renders * when the surface is created, or when {@link #requestRender} is called. @@ -1011,11 +1008,13 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback mEglSurface = null; } - /* - * React to the creation of a new surface by creating and returning an - * OpenGL interface that renders to that surface. + /** + * Create an egl surface for the current SurfaceHolder surface. If a surface + * already exists, destroy it before creating the new surface. + * + * @return true if the surface was created successfully. */ - public GL createSurface(SurfaceHolder holder) { + public boolean createSurface(SurfaceHolder holder) { if (LOG_EGL) { Log.w("EglHelper", "createSurface() tid=" + Thread.currentThread().getId()); } @@ -1057,7 +1056,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback if (error == EGL10.EGL_BAD_NATIVE_WINDOW) { Log.e("EglHelper", "createWindowSurface returned EGL_BAD_NATIVE_WINDOW."); } - return null; + return false; } /* @@ -1068,6 +1067,15 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback throwEglException("eglMakeCurrent"); } + return true; + } + + /** + * Create a GL object for the current EGL context. + * @return + */ + GL createGL() { + GL gl = mEglContext.getGL(); if (mGLWrapper != null) { gl = mGLWrapper.wrap(gl); @@ -1087,15 +1095,6 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback return gl; } - public void purgeBuffers() { - mEgl.eglMakeCurrent(mEglDisplay, - EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, - EGL10.EGL_NO_CONTEXT); - mEgl.eglMakeCurrent(mEglDisplay, - mEglSurface, mEglSurface, - mEglContext); - } - /** * Display the current render surface. * @return false if the context has been lost. @@ -1238,6 +1237,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback GL10 gl = null; boolean createEglContext = false; boolean createEglSurface = false; + boolean createGlInterface = false; boolean lostEglContext = false; boolean sizeChanged = false; boolean wantRenderNotification = false; @@ -1361,6 +1361,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback if (mHaveEglContext && !mHaveEglSurface) { mHaveEglSurface = true; createEglSurface = true; + createGlInterface = true; sizeChanged = true; } @@ -1374,17 +1375,12 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback Log.i("GLThread", "noticing that we want render notification tid=" + getId()); } - if (DRAW_TWICE_AFTER_SIZE_CHANGED) { - // We keep mRequestRender true so that we draw twice after the size changes. - // (Once because of mSizeChanged, the second time because of mRequestRender.) - // This forces the updated graphics onto the screen. - } else { - mRequestRender = false; - } + // Destroy and recreate the EGL surface. + createEglSurface = true; + mSizeChanged = false; - } else { - mRequestRender = false; } + mRequestRender = false; sGLThreadManager.notifyAll(); break; } @@ -1417,15 +1413,20 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback if (LOG_SURFACE) { Log.w("GLThread", "egl createSurface"); } - gl = (GL10) mEglHelper.createSurface(getHolder()); - if (gl == null) { + if (!mEglHelper.createSurface(getHolder())) { // Couldn't create a surface. Quit quietly. break; } - sGLThreadManager.checkGLDriver(gl); createEglSurface = false; } + if (createGlInterface) { + gl = (GL10) mEglHelper.createGL(); + + sGLThreadManager.checkGLDriver(gl); + createGlInterface = false; + } + if (createEglContext) { if (LOG_RENDERER) { Log.w("GLThread", "onSurfaceCreated"); @@ -1438,7 +1439,6 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback if (LOG_RENDERER) { Log.w("GLThread", "onSurfaceChanged(" + w + ", " + h + ")"); } - mEglHelper.purgeBuffers(); mRenderer.onSurfaceChanged(gl, w, h); sizeChanged = false; } |