From 4a2221ec4a929976be570ad096252c8dea326e19 Mon Sep 17 00:00:00 2001 From: Jack Palevich Date: Sat, 6 Mar 2010 10:39:27 -0800 Subject: Fix inverted release-EGLContext-on-pause logic. This works around a bug in the "Q3Dimension MSM7500" driver. That driver only supports a single active EGLContext, so we must release and restore the EGLContext when pausing and unpausing. Unfortunately the test for deciding whether to release the context was inverted. We were releasing the context on every device besides the MSM7500 devices, which was a performance drain, and we were not releasing the context on the MSM7500, which meant the underlying driver bug was not worked around. Now we release the EGL context when pausing only on the devices that have the bug. --- opengl/java/android/opengl/GLSurfaceView.java | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'opengl/java') diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java index a186e58..71411ef 100644 --- a/opengl/java/android/opengl/GLSurfaceView.java +++ b/opengl/java/android/opengl/GLSurfaceView.java @@ -149,6 +149,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback private final static boolean LOG_THREADS = false; private final static boolean LOG_SURFACE = false; private final static boolean LOG_RENDERER = false; + private final static boolean LOG_RENDERER_DRAW_FRAME = false; // Work-around for bug 2263168 private final static boolean DRAW_TWICE_AFTER_SIZE_CHANGED = true; /** @@ -1209,15 +1210,18 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback } if (createEglSurface) { + if (LOG_SURFACE) { + Log.w("GLThread", "egl createSurface"); + } gl = (GL10) mEglHelper.createSurface(getHolder()); sGLThreadManager.checkGLDriver(gl); - if (LOG_RENDERER) { - Log.w("GLThread", "onSurfaceCreated"); - } createEglSurface = false; } if (createEglContext) { + if (LOG_RENDERER) { + Log.w("GLThread", "onSurfaceCreated"); + } mRenderer.onSurfaceCreated(gl, mEglHelper.mEglConfig); createEglContext = false; } @@ -1230,7 +1234,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback sizeChanged = false; } - if (LOG_RENDERER) { + if (LOG_RENDERER_DRAW_FRAME) { Log.w("GLThread", "onDrawFrame"); } mRenderer.onDrawFrame(gl); @@ -1438,6 +1442,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback } private static class GLThreadManager { + private static String TAG = "GLThreadManager"; public synchronized void threadExiting(GLThread thread) { if (LOG_THREADS) { @@ -1483,7 +1488,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback public synchronized boolean shouldReleaseEGLContextWhenPausing() { checkGLESVersion(); - return mMultipleGLESContextsAllowed; + return !mMultipleGLESContextsAllowed; } public synchronized void checkGLDriver(GL10 gl) { @@ -1493,6 +1498,10 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback String renderer = gl.glGetString(GL10.GL_RENDERER); mMultipleGLESContextsAllowed = ! renderer.startsWith(kMSM7K_RENDERER_PREFIX); + if (LOG_SURFACE) { + Log.w(TAG, "checkGLDriver renderer = \"" + renderer + "\" multipleContextsAllowed = " + + mMultipleGLESContextsAllowed); + } notifyAll(); } mGLESDriverCheckComplete = true; @@ -1507,6 +1516,10 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback if (mGLESVersion >= kGLES_20) { mMultipleGLESContextsAllowed = true; } + if (LOG_SURFACE) { + Log.w(TAG, "checkGLESVersion mGLESVersion =" + + " " + mGLESVersion + " mMultipleGLESContextsAllowed = " + mMultipleGLESContextsAllowed); + } mGLESVersionCheckComplete = true; } } -- cgit v1.1