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();
}