guest system gles fix: Enable screen capture with gpu on

Currently, when running emulator with gpu on, screen capture does not work.
This commit fixes that by doing the following steps:
1. enable gralloc to allocate buffer in gralloc_alloc for screen capture
   usage mode.
2. read back screen pixels in gralloc_lock for screen capture usage mode

Note: This commit only fixes guest side, and to make screen capture work,
we also need the corresponding fix on host side in the following CL:
    e36c098b5563adcc7442cb3a172ff769ee3fb4b6

(cherry picked from commit 5a50ac8819525f851c677be88a466b14737dbb18)

Change-Id: Ie9307eda411ab3d0b3842fbb4a71926dd62a1875
diff --git a/opengl/system/gralloc/gralloc.cpp b/opengl/system/gralloc/gralloc.cpp
index a6f7d91..059bf12 100644
--- a/opengl/system/gralloc/gralloc.cpp
+++ b/opengl/system/gralloc/gralloc.cpp
@@ -136,15 +136,11 @@
     }
 
     //
-    // Validate usage: buffer cannot be written both by s/w and h/w access.
+    // Note: in screen capture mode, both sw_write and hw_write will be on
+    // and this is a valid usage
     //
     bool sw_write = (0 != (usage & GRALLOC_USAGE_SW_WRITE_MASK));
     bool hw_write = (usage & GRALLOC_USAGE_HW_RENDER);
-    if (hw_write && sw_write) {
-        ALOGE("gralloc_alloc: Mismatched usage flags: %d x %d, usage %x",
-                w, h, usage);
-        return -EINVAL;
-    }
     bool sw_read = (0 != (usage & GRALLOC_USAGE_SW_READ_MASK));
     bool hw_cam_write = usage & GRALLOC_USAGE_HW_CAMERA_WRITE;
     bool hw_cam_read = usage & GRALLOC_USAGE_HW_CAMERA_READ;
@@ -685,6 +681,15 @@
             return -EBUSY;
         }
 
+        const bool sw_read = (cb->usage & GRALLOC_USAGE_SW_READ_MASK);
+        const bool hw_write = (cb->usage & GRALLOC_USAGE_HW_RENDER);
+        const bool screen_capture_mode = (sw_read && hw_write);
+        if (screen_capture_mode) {
+            D("gralloc_lock read back color buffer %d %d\n", cb->width, cb->height);
+            DEFINE_AND_VALIDATE_HOST_CONNECTION;
+            rcEnc->rcReadColorBuffer(rcEnc, cb->hostHandle,
+                    0, 0, cb->width, cb->height, GL_RGBA, GL_UNSIGNED_BYTE, cpu_addr);
+        }
     }
 
     //