Merge change 25647 into eclair

* changes:
  Some tweaks to the rotary lock widget.
diff --git a/include/ui/FramebufferNativeWindow.h b/include/ui/FramebufferNativeWindow.h
index 68144b5..8ea3ab9 100644
--- a/include/ui/FramebufferNativeWindow.h
+++ b/include/ui/FramebufferNativeWindow.h
@@ -54,6 +54,7 @@
 
     bool isUpdateOnDemand() const { return mUpdateOnDemand; }
     status_t setUpdateRectangle(const Rect& updateRect);
+    status_t compositionComplete();
     
 private:
     friend class LightRefBase<FramebufferNativeWindow>;    
diff --git a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
index cc913cb..7bdf885 100644
--- a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
+++ b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
@@ -297,9 +297,9 @@
     return mPageFlipCount;
 }
 
-/*
- * "Flip" the front and back buffers.
- */
+status_t DisplayHardware::compositionComplete() const {
+    return mNativeWindow->compositionComplete();
+}
 
 void DisplayHardware::flip(const Region& dirty) const
 {
diff --git a/libs/surfaceflinger/DisplayHardware/DisplayHardware.h b/libs/surfaceflinger/DisplayHardware/DisplayHardware.h
index 8972d51..b7f1cdb 100644
--- a/libs/surfaceflinger/DisplayHardware/DisplayHardware.h
+++ b/libs/surfaceflinger/DisplayHardware/DisplayHardware.h
@@ -80,6 +80,8 @@
     EGLDisplay getEGLDisplay() const { return mDisplay; }
     overlay_control_device_t* getOverlayEngine() const { return mOverlayEngine; }
     
+    status_t compositionComplete() const;
+    
     Rect bounds() const {
         return Rect(mWidth, mHeight);
     }
diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp
index 31b5128..e87b563 100644
--- a/libs/surfaceflinger/SurfaceFlinger.cpp
+++ b/libs/surfaceflinger/SurfaceFlinger.cpp
@@ -495,6 +495,9 @@
         // repaint the framebuffer (if needed)
         handleRepaint();
 
+        // inform the h/w that we're done compositing
+        hw.compositionComplete();
+
         // release the clients before we flip ('cause flip might block)
         unlockClients();
 
diff --git a/libs/ui/FramebufferNativeWindow.cpp b/libs/ui/FramebufferNativeWindow.cpp
index 90b5163..fc2e2f6 100644
--- a/libs/ui/FramebufferNativeWindow.cpp
+++ b/libs/ui/FramebufferNativeWindow.cpp
@@ -158,6 +158,14 @@
     return fbDev->setUpdateRect(fbDev, r.left, r.top, r.width(), r.height());
 }
 
+status_t FramebufferNativeWindow::compositionComplete()
+{
+    if (fbDev->compositionComplete) {
+        return fbDev->compositionComplete(fbDev);
+    }
+    return INVALID_OPERATION;
+}
+
 int FramebufferNativeWindow::setSwapInterval(
         android_native_window_t* window, int interval) 
 {
diff --git a/opengl/tests/gl2_basic/gl2_basic.cpp b/opengl/tests/gl2_basic/gl2_basic.cpp
index f969a46..d4887ba 100644
--- a/opengl/tests/gl2_basic/gl2_basic.cpp
+++ b/opengl/tests/gl2_basic/gl2_basic.cpp
@@ -34,14 +34,16 @@
 static void printGLString(const char *name, GLenum s)
 {
      fprintf(stderr, "printGLString %s, %d\n", name, s);
+#if 0 // causes hangs
      const char *v = (const char *)glGetString(s);
      int error = glGetError();
      fprintf(stderr, "glGetError() = %d, result of glGetString = %x\n", error,
          (unsigned int)v);
-     if ((v < (const char*) 0) || (v > (const char*) 0x1000))
+     if ((v < (const char*) 0) || (v > (const char*) 0x10000))
          fprintf(stderr, "GL %s = %s\n", name, v);
      else
-         fprintf(stderr, "GL %s = (null)\n", name);
+         fprintf(stderr, "GL %s = (null) 0x%08x\n", name, (unsigned int) v);
+#endif
 }
 
 static const char* eglErrorToString[] = {
@@ -61,7 +63,11 @@
     "EGL_BAD_SURFACE"
 };
 
-static void checkEglError(const char* op) {
+static void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) {
+    if (returnVal != EGL_TRUE) {
+        fprintf(stderr, "%s() returned %d\n", op, returnVal);
+    }
+
     for(EGLint error = eglGetError();
 		error != EGL_SUCCESS;
 	error = eglGetError()) {
@@ -69,25 +75,30 @@
         if (error >= EGL_SUCCESS && error <= EGL_BAD_SURFACE) {
             errorString = eglErrorToString[error - EGL_SUCCESS];
         }
-        fprintf(stderr, "%s() returned eglError %s (0x%x)\n", op,
+        fprintf(stderr, "after %s() eglError %s (0x%x)\n", op,
             errorString, error);
     }
 }
 
 int main(int argc, char** argv)
 {
+    EGLBoolean returnValue;
+    EGLConfig configs[2];
+    EGLint config_count;
+
+	EGLint context_attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
     EGLint s_configAttribs[] = {
-         EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
-         EGL_RED_SIZE,       5,
-         EGL_GREEN_SIZE,     6,
-         EGL_BLUE_SIZE,      5,
-         EGL_NONE
+	EGL_BUFFER_SIZE,     EGL_DONT_CARE,
+	EGL_RED_SIZE,        5,
+	EGL_GREEN_SIZE,      6,
+	EGL_BLUE_SIZE,       5,
+	EGL_DEPTH_SIZE,      8,
+	EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+	EGL_NONE
      };
 
-     EGLint numConfigs = -1;
      EGLint majorVersion;
      EGLint minorVersion;
-     EGLConfig config;
      EGLContext context;
      EGLSurface surface;
      EGLint w, h;
@@ -100,20 +111,50 @@
      checkEglError("<init>");
      dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
      checkEglError("eglGetDisplay");
-     eglInitialize(dpy, &majorVersion, &minorVersion);
-     checkEglError("eglInitialize");
+     if (dpy == EGL_NO_DISPLAY) {
+         printf("eglGetDisplay returned EGL_NO_DISPLAY.\n");
+         return 0;
+     }
+     returnValue = eglInitialize(dpy, &majorVersion, &minorVersion);
+     checkEglError("eglInitialize", returnValue);
      fprintf(stderr, "EGL version %d.%d\n", majorVersion, minorVersion);
+
+     returnValue = eglGetConfigs (dpy, configs, 2, &config_count);
+     checkEglError("eglGetConfigs", returnValue);
+     fprintf(stderr, "Config count: %d\n", config_count);
+     for(int i = 0; i < config_count; i++) {
+        fprintf(stderr, "%d: 0x%08x\n", i, (unsigned int) configs[i]);
+     }
+#if 0
+     EGLConfig config;
      EGLUtils::selectConfigForNativeWindow(dpy, s_configAttribs, window, &config);
-     fprintf(stderr, "Chosen config: 0x%08x\n", (unsigned long) config);
-
      checkEglError("EGLUtils::selectConfigForNativeWindow");
-     surface = eglCreateWindowSurface(dpy, config, window, NULL);
-     checkEglError("eglCreateWindowSurface");
+#else
+    int chooseConfigResult = eglChooseConfig(dpy, s_configAttribs, configs, 2, &config_count);
+    checkEglError("eglChooseConfig", chooseConfigResult);
+    if (chooseConfigResult != EGL_TRUE )

+    {

+        printf("eglChooseConfig failed\n");
+        return 0;

+    }
+#endif
 
+     surface = eglCreateWindowSurface(dpy, configs[0], window, NULL);
+     checkEglError("eglCreateWindowSurface");
+     if (surface == EGL_NO_SURFACE)
+	 {
+         printf("gelCreateWindowSurface failed.\n");
+         return 0;
+	 }
      EGLint gl2_0Attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
 
-     context = eglCreateContext(dpy, config, NULL, gl2_0Attribs);
+     context = eglCreateContext(dpy, configs[0], EGL_NO_CONTEXT, context_attribs);
      checkEglError("eglCreateContext");
+	 if (context == EGL_NO_CONTEXT)
+     {
+        printf("eglCreateContext failed\n");
+        return 0;
+	 }
      eglMakeCurrent(dpy, surface, surface, context);
      checkEglError("eglMakeCurrent");
      eglQuerySurface(dpy, surface, EGL_WIDTH, &w);