diff options
Diffstat (limited to 'opengl/java')
-rw-r--r-- | opengl/java/android/opengl/GLLogWrapper.java | 2 | ||||
-rw-r--r-- | opengl/java/android/opengl/GLSurfaceView.java | 67 | ||||
-rw-r--r-- | opengl/java/com/google/android/gles_jni/EGLImpl.java | 61 |
3 files changed, 107 insertions, 23 deletions
diff --git a/opengl/java/android/opengl/GLLogWrapper.java b/opengl/java/android/opengl/GLLogWrapper.java index 4119bf8..f332448 100644 --- a/opengl/java/android/opengl/GLLogWrapper.java +++ b/opengl/java/android/opengl/GLLogWrapper.java @@ -1517,7 +1517,7 @@ class GLLogWrapper extends GLWrapperBase { arg("count", count); startLogIndices(); for (int i = 0; i < count; i++) { - doElement(mStringBuilder, i, first + count); + doElement(mStringBuilder, i, first + i); } endLogIndices(); end(); diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java index fb3747c..1e3bd72 100644 --- a/opengl/java/android/opengl/GLSurfaceView.java +++ b/opengl/java/android/opengl/GLSurfaceView.java @@ -29,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; @@ -685,7 +687,10 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback } public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) { int[] num_config = new int[1]; - egl.eglChooseConfig(display, mConfigSpec, null, 0, num_config); + if (!egl.eglChooseConfig(display, mConfigSpec, null, 0, + num_config)) { + throw new IllegalArgumentException("eglChooseConfig failed"); + } int numConfigs = num_config[0]; @@ -695,8 +700,10 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback } EGLConfig[] configs = new EGLConfig[numConfigs]; - egl.eglChooseConfig(display, mConfigSpec, configs, numConfigs, - num_config); + if (!egl.eglChooseConfig(display, mConfigSpec, configs, numConfigs, + num_config)) { + throw new IllegalArgumentException("eglChooseConfig#2 failed"); + } EGLConfig config = chooseConfig(egl, display, configs); if (config == null) { throw new IllegalArgumentException("No config chosen"); @@ -821,11 +828,17 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback */ mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); + if (mEglDisplay == EGL10.EGL_NO_DISPLAY) { + throw new RuntimeException("eglGetDisplay failed"); + } + /* * We can now initialize EGL for that display */ int[] version = new int[2]; - mEgl.eglInitialize(mEglDisplay, version); + if(!mEgl.eglInitialize(mEglDisplay, version)) { + throw new RuntimeException("eglInitialize failed"); + } mEglConfig = mEGLConfigChooser.chooseConfig(mEgl, mEglDisplay); /* @@ -834,7 +847,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback */ mEglContext = mEGLContextFactory.createContext(mEgl, mEglDisplay, mEglConfig); if (mEglContext == null || mEglContext == EGL10.EGL_NO_CONTEXT) { - throw new RuntimeException("createContext failed"); + throwEglException("createContext"); } mEglSurface = null; @@ -1095,6 +1108,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback if (createEglSurface) { gl = (GL10) mEglHelper.createSurface(getHolder()); + sGLThreadManager.checkGLDriver(gl); if (LOG_RENDERER) { Log.w("GLThread", "onSurfaceCreated"); } @@ -1308,9 +1322,14 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback } /* +<<<<<<< HEAD + * Tries to acquire the right to use an EGL + * surface. Does not block. +======= * Tries once to acquire the right to use an EGL * surface. Does not block. Requires that we are already * in the sGLThreadManager monitor when this is called. +>>>>>>> dc49acb0 * @return true if the right to use an EGL surface was acquired. */ public boolean tryAcquireEglSurfaceLocked(GLThread thread) { @@ -1319,6 +1338,10 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback notifyAll(); return true; } + checkGLESVersion(); + if (mMultipleGLESContextsAllowed) { + return true; + } return false; } /* @@ -1332,6 +1355,40 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback notifyAll(); } + public synchronized void checkGLDriver(GL10 gl) { + if (! mGLESDriverCheckComplete) { + checkGLESVersion(); + if (mGLESVersion < kGLES_20) { + String renderer = gl.glGetString(GL10.GL_RENDERER); + mMultipleGLESContextsAllowed = + ! renderer.startsWith(kMSM7K_RENDERER_PREFIX); + notifyAll(); + } + mGLESDriverCheckComplete = true; + } + } + + private void checkGLESVersion() { + if (! mGLESVersionCheckComplete) { + mGLESVersion = SystemProperties.getInt( + "ro.opengles.version", + ConfigurationInfo.GL_ES_VERSION_UNDEFINED); + if (mGLESVersion >= kGLES_20) { + mMultipleGLESContextsAllowed = true; + } + mGLESVersionCheckComplete = 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 GLThread mEglOwner; } diff --git a/opengl/java/com/google/android/gles_jni/EGLImpl.java b/opengl/java/com/google/android/gles_jni/EGLImpl.java index a667e8d..3e06ded 100644 --- a/opengl/java/com/google/android/gles_jni/EGLImpl.java +++ b/opengl/java/com/google/android/gles_jni/EGLImpl.java @@ -2,16 +2,16 @@ ** ** Copyright 2006, The Android Open Source Project ** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at ** -** http://www.apache.org/licenses/LICENSE-2.0 +** http://www.apache.org/licenses/LICENSE-2.0 ** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and ** limitations under the License. */ @@ -30,11 +30,11 @@ public class EGLImpl implements EGL10 { private EGLSurfaceImpl mSurface = new EGLSurfaceImpl(-1); public native boolean eglInitialize(EGLDisplay display, int[] major_minor); - public native boolean eglQueryContext(EGLDisplay display, EGLContext context, int attribute, int[] value); + public native boolean eglQueryContext(EGLDisplay display, EGLContext context, int attribute, int[] value); public native boolean eglQuerySurface(EGLDisplay display, EGLSurface surface, int attribute, int[] value); public native boolean eglChooseConfig(EGLDisplay display, int[] attrib_list, EGLConfig[] configs, int config_size, int[] num_config); public native boolean eglGetConfigAttrib(EGLDisplay display, EGLConfig config, int attribute, int[] value); - public native boolean eglGetConfigs(EGLDisplay display, EGLConfig[] configs, int config_size, int[] num_config); + public native boolean eglGetConfigs(EGLDisplay display, EGLConfig[] configs, int config_size, int[] num_config); public native int eglGetError(); public native boolean eglDestroyContext(EGLDisplay display, EGLContext context); public native boolean eglDestroySurface(EGLDisplay display, EGLSurface surface); @@ -47,16 +47,27 @@ public class EGLImpl implements EGL10 { public native boolean eglWaitNative(int engine, Object bindTarget); public EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list) { - return new EGLContextImpl( _eglCreateContext(display, config, share_context, attrib_list) ); + int eglContextId = _eglCreateContext(display, config, share_context, attrib_list); + if (eglContextId == 0) { + return EGL10.EGL_NO_CONTEXT; + } + return new EGLContextImpl( eglContextId ); } public EGLSurface eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list) { - return new EGLSurfaceImpl( _eglCreatePbufferSurface(display, config, attrib_list) ); + int eglSurfaceId = _eglCreatePbufferSurface(display, config, attrib_list); + if (eglSurfaceId == 0) { + return EGL10.EGL_NO_SURFACE; + } + return new EGLSurfaceImpl( eglSurfaceId ); } - + public EGLSurface eglCreatePixmapSurface(EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list) { EGLSurfaceImpl sur = new EGLSurfaceImpl(); _eglCreatePixmapSurface(sur, display, config, native_pixmap, attrib_list); + if (sur.mEGLSurface == 0) { + return EGL10.EGL_NO_SURFACE; + } return sur; } @@ -73,11 +84,18 @@ public class EGLImpl implements EGL10 { "eglCreateWindowSurface() can only be called with an instance of " + "SurfaceView or SurfaceHolder at the moment, this will be fixed later."); } - return new EGLSurfaceImpl( _eglCreateWindowSurface(display, config, sur, attrib_list) ); + int eglSurfaceId = _eglCreateWindowSurface(display, config, sur, attrib_list); + if (eglSurfaceId == 0) { + return EGL10.EGL_NO_SURFACE; + } + return new EGLSurfaceImpl( eglSurfaceId ); } - + public synchronized EGLDisplay eglGetDisplay(Object native_display) { int value = _eglGetDisplay(native_display); + if (value == 0) { + return EGL10.EGL_NO_DISPLAY; + } if (mDisplay.mEGLDisplay != value) mDisplay = new EGLDisplayImpl(value); return mDisplay; @@ -85,13 +103,19 @@ public class EGLImpl implements EGL10 { public synchronized EGLContext eglGetCurrentContext() { int value = _eglGetCurrentContext(); + if (value == 0) { + return EGL10.EGL_NO_CONTEXT; + } if (mContext.mEGLContext != value) mContext = new EGLContextImpl(value); return mContext; } - + public synchronized EGLDisplay eglGetCurrentDisplay() { int value = _eglGetCurrentDisplay(); + if (value == 0) { + return EGL10.EGL_NO_DISPLAY; + } if (mDisplay.mEGLDisplay != value) mDisplay = new EGLDisplayImpl(value); return mDisplay; @@ -99,6 +123,9 @@ public class EGLImpl implements EGL10 { public synchronized EGLSurface eglGetCurrentSurface(int readdraw) { int value = _eglGetCurrentSurface(readdraw); + if (value == 0) { + return EGL10.EGL_NO_SURFACE; + } if (mSurface.mEGLSurface != value) mSurface = new EGLSurfaceImpl(value); return mSurface; @@ -107,7 +134,7 @@ public class EGLImpl implements EGL10 { private native int _eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list); private native int _eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list); private native void _eglCreatePixmapSurface(EGLSurface sur, EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list); - private native int _eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list); + private native int _eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list); private native int _eglGetDisplay(Object native_display); private native int _eglGetCurrentContext(); private native int _eglGetCurrentDisplay(); |