summaryrefslogtreecommitdiffstats
path: root/opengl/java
diff options
context:
space:
mode:
Diffstat (limited to 'opengl/java')
-rw-r--r--opengl/java/android/opengl/GLLogWrapper.java2
-rw-r--r--opengl/java/android/opengl/GLSurfaceView.java67
-rw-r--r--opengl/java/com/google/android/gles_jni/EGLImpl.java61
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();