Allow 16-bit color EGLConfigs

The emulator without GPU acceleration only supports 16-bit
framebuffers.

Bug: 7185810
Change-Id: I883180367bf5b291d5e70427ab586d2e17868a96
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index a1e72a4..c99f250 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -268,25 +268,41 @@
 
     EGLint attribs[] = {
             EGL_SURFACE_TYPE,           EGL_WINDOW_BIT,
+            // The rest of the attributes must be in this order and at the end
+            // of the list; we rely on that for fallback searches below.
             EGL_RED_SIZE,               8,
             EGL_GREEN_SIZE,             8,
             EGL_BLUE_SIZE,              8,
-            // EGL_RECORDABLE_ANDROID must be last so that we can retry
-            // without it easily (see below)
             EGL_RECORDABLE_ANDROID,     EGL_TRUE,
             EGL_NONE
     };
     err = selectConfigForPixelFormat(display, attribs, nativeVisualId, &config);
-    if (err) {
-        // maybe we failed because of EGL_RECORDABLE_ANDROID
-        ALOGW("couldn't find an EGLConfig with EGL_RECORDABLE_ANDROID");
-        attribs[NELEM(attribs) - 3] = EGL_NONE;
-        err = selectConfigForPixelFormat(display, attribs, nativeVisualId, &config);
-    }
-    ALOGE_IF(err, "couldn't find an EGLConfig matching the screen format");
-    if (eglGetConfigAttrib(display, config, EGL_CONFIG_CAVEAT, &dummy) == EGL_TRUE) {
+    if (!err)
+        goto success;
+
+    // maybe we failed because of EGL_RECORDABLE_ANDROID
+    ALOGW("no suitable EGLConfig found, trying without EGL_RECORDABLE_ANDROID");
+    attribs[NELEM(attribs) - 3] = EGL_NONE;
+    err = selectConfigForPixelFormat(display, attribs, nativeVisualId, &config);
+    if (!err)
+        goto success;
+
+    // allow less than 24-bit color; the non-gpu-accelerated emulator only
+    // supports 16-bit color
+    ALOGW("no suitable EGLConfig found, trying with 16-bit color allowed");
+    attribs[NELEM(attribs) - 9] = EGL_NONE;
+    err = selectConfigForPixelFormat(display, attribs, nativeVisualId, &config);
+    if (!err)
+        goto success;
+
+    // this EGL is too lame for Android
+    ALOGE("no suitable EGLConfig found, giving up");
+
+    return 0;
+
+success:
+    if (eglGetConfigAttrib(display, config, EGL_CONFIG_CAVEAT, &dummy))
         ALOGW_IF(dummy == EGL_SLOW_CONFIG, "EGL_SLOW_CONFIG selected!");
-    }
     return config;
 }