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
Change-Id: I24b91bb70669fe2ddad3a5fc2eaccf3f3eaa0e1b
diff --git a/opengl/system/gralloc/gralloc.cpp b/opengl/system/gralloc/gralloc.cpp
index a6f7d91..d74af08 100644
--- a/opengl/system/gralloc/gralloc.cpp
+++ b/opengl/system/gralloc/gralloc.cpp
@@ -141,9 +141,11 @@
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;
+ // screen-capture has both hw_write and sw_write enabled, and we
+ // should allow this usage.
+ // 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;
@@ -685,6 +687,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);
+ }
}
//