summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Palevich <jackpal@google.com>2009-10-13 17:58:47 -0700
committerJack Palevich <jackpal@google.com>2009-10-13 17:58:47 -0700
commitc52ba78cab001ff68b4823f4769c129b8acfddee (patch)
tree9036181a31e926c067bb58f8d7c312bd0776a3d7
parent69e21f5f6e0d04539cd92848ea009dd615d88c2c (diff)
downloadframeworks_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.java63
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;