diff options
| author | 2016-05-25 19:16:12 +0000 | |
|---|---|---|
| committer | 2016-05-25 19:16:13 +0000 | |
| commit | 39e8022a75507be06179c3de7358cebb1bb22e06 (patch) | |
| tree | 77b79e91f68738cbd9df47049475fa0b636fe5dd | |
| parent | 7c17e70f2f795ca06006ff2560c8b8211ce1dd52 (diff) | |
| parent | e9953b1752a583058e639ef3de456988ab6ef7bf (diff) | |
Merge "Force pending transactions to flush before screenshot." into nyc-dev
| -rw-r--r-- | core/java/android/view/SurfaceControl.java | 8 | ||||
| -rw-r--r-- | core/jni/android_view_SurfaceControl.cpp | 7 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowManagerService.java | 5 |
3 files changed, 15 insertions, 5 deletions
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 7b01267b6388..b4131b44263a 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -46,7 +46,7 @@ public class SurfaceControl { boolean allLayers, boolean useIdentityTransform); private static native void nativeOpenTransaction(); - private static native void nativeCloseTransaction(); + private static native void nativeCloseTransaction(boolean sync); private static native void nativeSetAnimationTransaction(); private static native void nativeSetLayer(long nativeObject, int zorder); @@ -372,7 +372,11 @@ public class SurfaceControl { /** end a transaction */ public static void closeTransaction() { - nativeCloseTransaction(); + nativeCloseTransaction(false); + } + + public static void closeTransactionSync() { + nativeCloseTransaction(true); } public void deferTransactionUntil(IBinder handle, long frame) { diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 864a0bfe6f5d..a9ed9dce590e 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -223,8 +223,9 @@ static void nativeOpenTransaction(JNIEnv* env, jclass clazz) { SurfaceComposerClient::openGlobalTransaction(); } -static void nativeCloseTransaction(JNIEnv* env, jclass clazz) { - SurfaceComposerClient::closeGlobalTransaction(); + +static void nativeCloseTransaction(JNIEnv* env, jclass clazz, jboolean sync) { + SurfaceComposerClient::closeGlobalTransaction(sync); } static void nativeSetAnimationTransaction(JNIEnv* env, jclass clazz) { @@ -649,7 +650,7 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeScreenshot }, {"nativeOpenTransaction", "()V", (void*)nativeOpenTransaction }, - {"nativeCloseTransaction", "()V", + {"nativeCloseTransaction", "(Z)V", (void*)nativeCloseTransaction }, {"nativeSetAnimationTransaction", "()V", (void*)nativeSetAnimationTransaction }, diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index d36371219ac0..d496510c23aa 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -6386,6 +6386,11 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_SCREENSHOT && inRotation) Slog.v(TAG_WM, "Taking screenshot while rotating"); + // We force pending transactions to flush before taking + // the screenshot by pushing an empty synchronous transaction. + SurfaceControl.openTransaction(); + SurfaceControl.closeTransactionSync(); + bm = SurfaceControl.screenshot(crop, width, height, minLayer, maxLayer, inRotation, rot); if (bm == null) { |