summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy McFadden <fadden@android.com>2013-10-09 16:38:02 -0700
committerThe Android Automerger <android-build@google.com>2013-10-10 12:16:58 -0700
commit0e9c51ec78df650e2a340978ccce920d419a9fa1 (patch)
tree37c8ba7ab2b90ede280541732e2bfe906ad77926
parente0df32c9a73ec9cc7c3449f4d441a49bf62846f9 (diff)
downloadframeworks_native-0e9c51ec78df650e2a340978ccce920d419a9fa1.zip
frameworks_native-0e9c51ec78df650e2a340978ccce920d419a9fa1.tar.gz
frameworks_native-0e9c51ec78df650e2a340978ccce920d419a9fa1.tar.bz2
Fix blank / partial screenshots
The screen capture code wasn't waiting for the render to finish, so sometimes you'd see an empty or partial image. Bug 11131777 Change-Id: Ic64087322ce3bb15bb5f4fb1eb07579880fe6197
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 3733ede..4a1373e 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2982,6 +2982,27 @@ status_t SurfaceFlinger::captureScreenImplLocked(
renderScreenImplLocked(hw, reqWidth, reqHeight,
minLayerZ, maxLayerZ, true);
+ // Create a sync point and wait on it, so we know the buffer is
+ // ready before we pass it along. We can't trivially call glFlush(),
+ // so we use a wait flag instead.
+ // TODO: pass a sync fd to queueBuffer() and let the consumer wait.
+ EGLSyncKHR sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
+ if (sync != EGL_NO_SYNC_KHR) {
+ EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
+ EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
+ EGLint eglErr = eglGetError();
+ eglDestroySyncKHR(mEGLDisplay, sync);
+ if (result == EGL_TIMEOUT_EXPIRED_KHR) {
+ ALOGW("captureScreen: fence wait timed out");
+ } else {
+ ALOGW_IF(eglErr != EGL_SUCCESS,
+ "captureScreen: error waiting on EGL fence: %#x", eglErr);
+ }
+ } else {
+ ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
+ // not fatal
+ }
+
if (DEBUG_SCREENSHOTS) {
uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);