Greatly simplify sample code by using EGL_NATIVE_VISUAL_ID.

This is the preferred way of selecting config starting in
gingerbread, this procedure guarantees forward compatibility.

Change-Id: Iff55b545e722205bd029b92da33368129253b8a3
diff --git a/ndk/platforms/android-9/samples/native-activity/Android.mk b/ndk/platforms/android-9/samples/native-activity/Android.mk
index fa45432..ea961ca 100644
--- a/ndk/platforms/android-9/samples/native-activity/Android.mk
+++ b/ndk/platforms/android-9/samples/native-activity/Android.mk
@@ -36,7 +36,7 @@
 		$(TOPDIR)development/ndk/sources/android/native_app_glue
 
 LOCAL_SRC_FILES := \
-	jni/main.c jni/glutils.c \
+	jni/main.c \
 	../../../../sources/android/native_app_glue/android_native_app_glue.c
 
 LOCAL_NDK_VERSION := 4
diff --git a/ndk/platforms/android-9/samples/native-activity/jni/Android.mk b/ndk/platforms/android-9/samples/native-activity/jni/Android.mk
index 60a7fdc..9e64d80 100644
--- a/ndk/platforms/android-9/samples/native-activity/jni/Android.mk
+++ b/ndk/platforms/android-9/samples/native-activity/jni/Android.mk
@@ -17,7 +17,7 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE    := native-activity
-LOCAL_SRC_FILES := main.c glutils.c
+LOCAL_SRC_FILES := main.c
 LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM
 LOCAL_STATIC_LIBRARIES := android_native_app_glue
 
diff --git a/ndk/platforms/android-9/samples/native-activity/jni/glutils.c b/ndk/platforms/android-9/samples/native-activity/jni/glutils.c
deleted file mode 100644
index fcd2d88..0000000
--- a/ndk/platforms/android-9/samples/native-activity/jni/glutils.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2010 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
- *
- *      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
- * limitations under the License.
- *
- */
-
-#include "glutils.h"
-
-#include <string.h>
-
-const char *EGLstrerror(EGLint err) {
-    switch (err) {
-        case EGL_SUCCESS:           return "EGL_SUCCESS";
-        case EGL_NOT_INITIALIZED:   return "EGL_NOT_INITIALIZED";
-        case EGL_BAD_ACCESS:        return "EGL_BAD_ACCESS";
-        case EGL_BAD_ALLOC:         return "EGL_BAD_ALLOC";
-        case EGL_BAD_ATTRIBUTE:     return "EGL_BAD_ATTRIBUTE";
-        case EGL_BAD_CONFIG:        return "EGL_BAD_CONFIG";
-        case EGL_BAD_CONTEXT:       return "EGL_BAD_CONTEXT";
-        case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE";
-        case EGL_BAD_DISPLAY:       return "EGL_BAD_DISPLAY";
-        case EGL_BAD_MATCH:         return "EGL_BAD_MATCH";
-        case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP";
-        case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW";
-        case EGL_BAD_PARAMETER:     return "EGL_BAD_PARAMETER";
-        case EGL_BAD_SURFACE:       return "EGL_BAD_SURFACE";
-        case EGL_CONTEXT_LOST:      return "EGL_CONTEXT_LOST";
-        default: return "UNKNOWN";
-    }
-}
-
-int32_t selectConfigForPixelFormat(EGLDisplay dpy, EGLint const* attrs,
-        int32_t format, EGLConfig* outConfig) {
-    EGLint numConfigs = -1, n=0;
-
-    if (!attrs)
-        return -1;
-
-    if (outConfig == NULL)
-        return -1;
-    
-    int fbSzA, fbSzR, fbSzG, fbSzB;
-    switch (format) {
-        case WINDOW_FORMAT_RGBA_8888:
-            fbSzA = fbSzR = fbSzG = fbSzB = 8;
-            break;
-        case WINDOW_FORMAT_RGBX_8888:
-            fbSzA = 0; fbSzR = fbSzG = fbSzB = 8;
-            break;
-        case WINDOW_FORMAT_RGB_565:
-            fbSzA = 0; fbSzR = 5; fbSzG = 6; fbSzB = 5;
-            break;
-        default:
-            LOGW("Unknown format");
-            return -1;
-    }
-
-    // Get all the "potential match" configs...
-    if (eglGetConfigs(dpy, NULL, 0, &numConfigs) == EGL_FALSE) {
-        LOGW("eglGetConfigs failed");
-        return -1;
-    }
-
-    EGLConfig* const configs = (EGLConfig*)malloc(sizeof(EGLConfig)*numConfigs);
-    if (eglChooseConfig(dpy, attrs, configs, numConfigs, &n) == EGL_FALSE) {
-        free(configs);
-        LOGW("eglChooseConfig failed");
-        return -1;
-    }
-
-    int i;
-    EGLConfig config = NULL;
-    for (i=0 ; i<n ; i++) {
-        EGLint r,g,b,a;
-        EGLConfig curr = configs[i];
-        eglGetConfigAttrib(dpy, curr, EGL_RED_SIZE,   &r);
-        eglGetConfigAttrib(dpy, curr, EGL_GREEN_SIZE, &g);
-        eglGetConfigAttrib(dpy, curr, EGL_BLUE_SIZE,  &b);
-        eglGetConfigAttrib(dpy, curr, EGL_ALPHA_SIZE, &a);
-        if (fbSzA == a && fbSzR == r && fbSzG == g && fbSzB  == b) {
-            config = curr;
-            break;
-        }
-    }
-
-    free(configs);
-    
-    if (i<n) {
-        *outConfig = config;
-        return 0;
-    }
-
-    LOGW("No config with desired pixel format");
-    return -1;
-}
-
-int32_t selectConfigForNativeWindow(EGLDisplay dpy, EGLint const* attrs,
-        EGLNativeWindowType window, EGLConfig* outConfig) {
-    int err;
-    int format;
-    
-    if (!window)
-        return -1;
-    
-    return selectConfigForPixelFormat(dpy, attrs,
-            ANativeWindow_getFormat(window), outConfig);
-}
-
diff --git a/ndk/platforms/android-9/samples/native-activity/jni/glutils.h b/ndk/platforms/android-9/samples/native-activity/jni/glutils.h
deleted file mode 100644
index a7fff96..0000000
--- a/ndk/platforms/android-9/samples/native-activity/jni/glutils.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2010 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
- *
- *      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
- * limitations under the License.
- *
- */
-
-#include <android/native_activity.h>
-#include <android/log.h>
-
-#include <EGL/egl.h>
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-
-#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))
-#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
-
-extern const char *EGLstrerror(EGLint err);
-extern int32_t selectConfigForPixelFormat(EGLDisplay dpy, EGLint const* attrs,
-        int32_t format, EGLConfig* outConfig);
-extern int32_t selectConfigForNativeWindow(EGLDisplay dpy, EGLint const* attrs,
-        EGLNativeWindowType window, EGLConfig* outConfig);
diff --git a/ndk/platforms/android-9/samples/native-activity/jni/main.c b/ndk/platforms/android-9/samples/native-activity/jni/main.c
index 919e412..2e19635 100644
--- a/ndk/platforms/android-9/samples/native-activity/jni/main.c
+++ b/ndk/platforms/android-9/samples/native-activity/jni/main.c
@@ -19,11 +19,15 @@
 #include <jni.h>
 #include <errno.h>
 
-#include <android/sensor.h>
+#include <EGL/egl.h>
+#include <GLES/gl.h>
 
+#include <android/sensor.h>
+#include <android/log.h>
 #include <android_native_app_glue.h>
 
-#include "glutils.h"
+#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))
+#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
 
 /**
  * Our saved state data.
@@ -57,12 +61,21 @@
  * Initialize an EGL context for the current display.
  */
 static int engine_init_display(struct engine* engine) {
-    // initialize opengl and egl
+    // initialize OpenGL ES and EGL
+
+    /*
+     * Here specify the attributes of the desired configuration.
+     * Below, we select an EGLConfig with at least 8 bits per color
+     * component compatible with on-screen windows
+     */
     const EGLint attribs[] = {
             EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+            EGL_BLUE_SIZE, 8,
+            EGL_GREEN_SIZE, 8,
+            EGL_RED_SIZE, 8,
             EGL_NONE
     };
-    EGLint w, h, dummy;
+    EGLint w, h, dummy, format;
     EGLint numConfigs;
     EGLConfig config;
     EGLSurface surface;
@@ -71,7 +84,19 @@
     EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
 
     eglInitialize(display, 0, 0);
-    selectConfigForNativeWindow(display, attribs, engine->app->window, &config);
+
+    /* Here, the application chooses the configuration it desires. In this
+     * sample, we have a very simplified selection process, where we pick
+     * the first EGLConfig that matches our criteria */
+    eglChooseConfig(display, attribs, &config, 1, &numConfigs);
+
+    /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
+     * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
+     * As soon as we picked a EGLConfig, we can safely reconfigure the
+     * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
+    eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
+
+    ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);
 
     surface = eglCreateWindowSurface(display, config, engine->app->window, NULL);
     context = eglCreateContext(display, config, NULL, NULL);