diff options
author | Jack Palevich <jackpal@google.com> | 2009-10-13 17:58:47 -0700 |
---|---|---|
committer | Jack Palevich <jackpal@google.com> | 2009-10-13 17:58:47 -0700 |
commit | c52ba78cab001ff68b4823f4769c129b8acfddee (patch) | |
tree | 9036181a31e926c067bb58f8d7c312bd0776a3d7 | |
parent | 69e21f5f6e0d04539cd92848ea009dd615d88c2c (diff) | |
download | frameworks_base-c52ba78cab001ff68b4823f4769c129b8acfddee.zip frameworks_base-c52ba78cab001ff68b4823f4769c129b8acfddee.tar.gz frameworks_base-c52ba78cab001ff68b4823f4769c129b8acfddee.tar.bz2 |
Allow multiple OpenGL contexts on systems that support them.
Previously we always restricted the number of OpenGL contexts to 1.
-rw-r--r-- | opengl/java/android/opengl/GLSurfaceView.java | 63 |
1 files changed, 55 insertions, 8 deletions
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java index 695d061..c279eae 100644 --- a/opengl/java/android/opengl/GLSurfaceView.java +++ b/opengl/java/android/opengl/GLSurfaceView.java @@ -18,7 +18,6 @@ package android.opengl; import java.io.Writer; import java.util.ArrayList; -import java.util.concurrent.Semaphore; import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGL11; @@ -30,6 +29,8 @@ import javax.microedition.khronos.opengles.GL; import javax.microedition.khronos.opengles.GL10; import android.content.Context; +import android.content.pm.ConfigurationInfo; +import android.os.SystemProperties; import android.util.AttributeSet; import android.util.Log; import android.view.SurfaceHolder; @@ -966,16 +967,12 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback * accesses EGL. */ try { - try { - sEglSemaphore.acquire(); - } catch (InterruptedException e) { - return; - } + sGLAccessLock.acquire(); guardedRun(); } catch (InterruptedException e) { // fall thru and exit normally } finally { - sEglSemaphore.release(); + sGLAccessLock.release(); } } @@ -1040,6 +1037,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback } if (changed) { gl = (GL10) mEglHelper.createSurface(getHolder()); + sGLAccessLock.checkGLDriver(gl); tellRendererSurfaceChanged = true; } if (tellRendererSurfaceCreated) { @@ -1241,7 +1239,56 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback } } - private static final Semaphore sEglSemaphore = new Semaphore(1); + private static class GLAccessLock { + public synchronized void acquire() throws InterruptedException { + if (! mGLESVersionCheckComplete) { + mGLESVersion = SystemProperties.getInt( + "ro.opengles.version", + ConfigurationInfo.GL_ES_VERSION_UNDEFINED); + if (mGLESVersion >= kGLES_20) { + mMultipleGLESContextsAllowed = true; + } + mGLESVersionCheckComplete = true; + } + + while ((! mMultipleGLESContextsAllowed) + && mGLContextCount > 0) { + wait(); + } + + mGLContextCount++; + + } + + public synchronized void release() { + mGLContextCount--; + notifyAll(); + } + + public synchronized void checkGLDriver(GL10 gl) { + if (! mGLESDriverCheckComplete) { + if (mGLESVersion < kGLES_20) { + String renderer = gl.glGetString(GL10.GL_RENDERER); + mMultipleGLESContextsAllowed = + ! renderer.startsWith(kMSM7K_RENDERER_PREFIX); + notifyAll(); + } + mGLESDriverCheckComplete = true; + } + } + + private boolean mGLESVersionCheckComplete; + private int mGLESVersion; + private boolean mGLESDriverCheckComplete; + private boolean mMultipleGLESContextsAllowed; + private int mGLContextCount; + private static final int kGLES_20 = 0x20000; + private static final String kMSM7K_RENDERER_PREFIX = + "Q3Dimension MSM7500 "; + }; + + private static GLAccessLock sGLAccessLock = new GLAccessLock(); + private boolean mSizeChanged = true; private GLThread mGLThread; |