Merge "GLSurfaceView: Log egl failures"

This commit is contained in:
Jack Palevich
2010-03-23 21:20:42 -07:00
committed by Android (Google) Code Review

View File

@@ -159,6 +159,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
private final static boolean LOG_SURFACE = false;
private final static boolean LOG_RENDERER = false;
private final static boolean LOG_RENDERER_DRAW_FRAME = false;
private final static boolean LOG_EGL = false;
// Work-around for bug 2263168
private final static boolean DRAW_TWICE_AFTER_SIZE_CHANGED = true;
/**
@@ -683,7 +684,14 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
public void destroyContext(EGL10 egl, EGLDisplay display,
EGLContext context) {
egl.eglDestroyContext(display, context);
if (!egl.eglDestroyContext(display, context)) {
Log.e("DefaultContextFactory", "display:" + display + " context: " + context);
if (LOG_THREADS) {
Log.i("DefaultContextFactory", "tid=" + Thread.currentThread().getId());
}
throw new RuntimeException("eglDestroyContext failed: "
+ EGLLogWrapper.getErrorString(egl.eglGetError()));
}
}
}
@@ -880,6 +888,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* @param configSpec
*/
public void start() {
if (LOG_EGL) {
Log.w("EglHelper", "start() tid=" + Thread.currentThread().getId());
}
/*
* Get an EGL instance
*/
@@ -909,8 +920,12 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
*/
mEglContext = mEGLContextFactory.createContext(mEgl, mEglDisplay, mEglConfig);
if (mEglContext == null || mEglContext == EGL10.EGL_NO_CONTEXT) {
mEglContext = null;
throwEglException("createContext");
}
if (LOG_EGL) {
Log.w("EglHelper", "createContext " + mEglContext + " tid=" + Thread.currentThread().getId());
}
mEglSurface = null;
}
@@ -920,6 +935,21 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* OpenGL interface that renders to that surface.
*/
public GL createSurface(SurfaceHolder holder) {
if (LOG_EGL) {
Log.w("EglHelper", "createSurface() tid=" + Thread.currentThread().getId());
}
/*
* Check preconditions.
*/
if (mEgl == null) {
throw new RuntimeException("egl not initialized");
}
if (mEglDisplay == null) {
throw new RuntimeException("eglDisplay not initialized");
}
if (mEglConfig == null) {
throw new RuntimeException("mEglConfig not initialized");
}
/*
* The window size has changed, so we need to create a new
* surface.
@@ -942,6 +972,8 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
mEglDisplay, mEglConfig, holder);
if (mEglSurface == null || mEglSurface == EGL10.EGL_NO_SURFACE) {
Log.w("EglHelper", "createWindowSurface failed. mEglDisplay: " + mEglDisplay +
" mEglConfig: " + mEglConfig + " holder: " + holder);
throwEglException("createWindowSurface");
}
@@ -996,6 +1028,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
}
public void destroySurface() {
if (LOG_EGL) {
Log.w("EglHelper", "destroySurface() tid=" + Thread.currentThread().getId());
}
if (mEglSurface != null && mEglSurface != EGL10.EGL_NO_SURFACE) {
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE,
@@ -1006,6 +1041,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
}
public void finish() {
if (LOG_EGL) {
Log.w("EglHelper", "finish() tid=" + Thread.currentThread().getId());
}
if (mEglContext != null) {
mEGLContextFactory.destroyContext(mEgl, mEglDisplay, mEglContext);
mEglContext = null;
@@ -1021,7 +1059,11 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
}
private void throwEglException(String function, int error) {
throw new RuntimeException(function + " failed: " + error);
String message = function + " failed: " + EGLLogWrapper.getErrorString(error);
if (LOG_THREADS) {
Log.e("EglHelper", "throwEglException tid=" + Thread.currentThread().getId() + " " + message);
}
throw new RuntimeException(message);
}
EGL10 mEgl;
@@ -1174,9 +1216,14 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
// If we don't have an EGL context, try to acquire one.
if ((! mHaveEglContext) && sGLThreadManager.tryAcquireEglContextLocked(this)) {
try {
mEglHelper.start();
} catch (RuntimeException t) {
sGLThreadManager.releaseEglContextLocked(this);
throw t;
}
mHaveEglContext = true;
createEglContext = true;
mEglHelper.start();
sGLThreadManager.notifyAll();
}