fix a bug where fading in/out of opaque 32-bits windows wasn't working

opaque 32-bits windows are now allocated as RGBX_8888 buffers and
SurfaceFlinger always uses GL_MODULATE instead of trying to
optimize to GL_REPLACE when possible (makes no sense on
h/w accelerated GL).

we still have a small hack for devices that don't support
RGBX_8888 in their gralloc implementation where we revert to
RGBA_8888.
diff --git a/libs/ui/GraphicBuffer.cpp b/libs/ui/GraphicBuffer.cpp
index ba1fd9c..35e4af3 100644
--- a/libs/ui/GraphicBuffer.cpp
+++ b/libs/ui/GraphicBuffer.cpp
@@ -122,11 +122,20 @@
 status_t GraphicBuffer::initSize(uint32_t w, uint32_t h, PixelFormat format,
         uint32_t reqUsage)
 {
-    if (format == PIXEL_FORMAT_RGBX_8888)
-        format = PIXEL_FORMAT_RGBA_8888;
-
     GraphicBufferAllocator& allocator = GraphicBufferAllocator::get();
     status_t err = allocator.alloc(w, h, format, reqUsage, &handle, &stride);
+
+    if (err<0 && format == PIXEL_FORMAT_RGBX_8888) {
+        /*
+         * There is currently a bug with some gralloc implementations
+         * not supporting RGBX_8888. In this case, we revert to using RGBA_8888
+         * which is not exactly the same, as GL_REPLACE will yield a different
+         * result.
+         */
+        format = PIXEL_FORMAT_RGBA_8888;
+        err = allocator.alloc(w, h, format, reqUsage, &handle, &stride);
+    }
+
     if (err == NO_ERROR) {
         this->width  = w;
         this->height = h;