Why 32-bit color EGL configurations fail with EGL_BAD_MATCH on Moto Droid?
- by Gilead
I'm trying to figure out why certain EGL configurations cause eglMakeCurrent() call to return EGL_BAD_MATCH on Motorola Droid running Android 2.1u1.
This is a full list of hardware-accelerated EGL configurations (those with EGL_CONFIG_CAVEAT == EGL_NONE) as there's a few others with EGL_CONFIG_CAVEAT == EGL_SLOW_CONFIG but those are backed by PixelFlinger 1.2 meaning they're using software renderer.
ID: 0 RGB: 8, 8, 8 Alpha: 8 Depth: 24 Stencil: 8 // BAD MATCH
ID: 1 RGB: 8, 8, 8 Alpha: 8 Depth: 0 Stencil: 0 // BAD MATCH
ID: 2 RGB: 8, 8, 8 Alpha: 8 Depth: 24 Stencil: 8 // BAD MATCH
ID: 3 RGB: 8, 8, 8 Alpha: 8 Depth: 24 Stencil: 8 // BAD MATCH
ID: 4 RGB: 8, 8, 8 Alpha: 8 Depth: 0 Stencil: 0 // BAD MATCH
ID: 5 RGB: 8, 8, 8 Alpha: 8 Depth: 24 Stencil: 8 // BAD MATCH
ID: 6 RGB: 5, 6, 5 Alpha: 0 Depth: 24 Stencil: 8
ID: 7 RGB: 5, 6, 5 Alpha: 0 Depth: 0 Stencil: 0
ID: 8 RGB: 5, 6, 5 Alpha: 0 Depth: 24 Stencil: 8
Clearly, all configurations with 32-bit color depth fail and all 16-bit ones are OK but:
1. Why?
2. WHY?! :)
3. How do I tell which ones would fail before actually trying to use them?
The code below is as simple as it can get. I put if (v[0] == 6) there to check different configs, normally they're chosen by half-clever config matcher :)
private void createSurface(SurfaceHolder holder) {
egl = (EGL10)EGLContext.getEGL();
eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
egl.eglInitialize(eglDisplay, null);
int[] numConfigs = new int[1];
egl.eglChooseConfig(eglDisplay, new int[] { EGL10.EGL_NONE },
null, 0, numConfigs);
EGLConfig[] configs = new EGLConfig[numConfigs[0]];
egl.eglChooseConfig(eglDisplay, new int[] { EGL10.EGL_NONE },
configs, numConfigs[0], numConfigs);
int[] v = new int[1];
for (EGLConfig c : configs) {
egl.eglGetConfigAttrib(eglDisplay, c, EGL10.EGL_CONFIG_ID, v);
if (v[0] == 6) {
eglConfig = c;
}
}
eglContext = egl.eglCreateContext(eglDisplay, eglConfig,
EGL10.EGL_NO_CONTEXT, null);
if (eglContext == null || eglContext == EGL10.EGL_NO_CONTEXT) {
throw new RuntimeException("Unable to create EGL context");
}
eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, holder, null);
if (eglSurface == null || eglSurface == EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("Unable to create EGL surface");
}
if (!egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
throw new RuntimeException("Unable to make EGL current");
}
gl = (GL10)eglContext.getGL();
}