diff options
4 files changed, 13 insertions, 9 deletions
diff --git a/core/java/com/android/internal/policy/TransitionAnimation.java b/core/java/com/android/internal/policy/TransitionAnimation.java index 25ac1bd678c6..600ae50e8d02 100644 --- a/core/java/com/android/internal/policy/TransitionAnimation.java +++ b/core/java/com/android/internal/policy/TransitionAnimation.java @@ -1279,10 +1279,15 @@ public class TransitionAnimation { public static float getBorderLuma(SurfaceControl surfaceControl, int w, int h) { final ScreenCapture.ScreenshotHardwareBuffer buffer = ScreenCapture.captureLayers(surfaceControl, new Rect(0, 0, w, h), 1); - if (buffer != null) { - return getBorderLuma(buffer.getHardwareBuffer(), buffer.getColorSpace()); + if (buffer == null) { + return 0; + } + final HardwareBuffer hwBuffer = buffer.getHardwareBuffer(); + final float luma = getBorderLuma(hwBuffer, buffer.getColorSpace()); + if (hwBuffer != null) { + hwBuffer.close(); } - return 0; + return luma; } /** Returns the luminance in 0~1. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java index 66d0a2aa409b..665267fde6ff 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java @@ -170,6 +170,7 @@ class ScreenRotationAnimation { if (!isCustomRotate()) { mStartLuma = TransitionAnimation.getBorderLuma(hardwareBuffer, colorSpace); } + hardwareBuffer.close(); } t.setLayer(mAnimLeash, SCREEN_FREEZE_LAYER_BASE); diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index d395f12f8a01..db88f0ff7cb1 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -36,7 +36,6 @@ import static com.android.server.wm.utils.CoordinateTransforms.computeRotationMa import android.animation.ArgbEvaluator; import android.content.Context; import android.graphics.Color; -import android.graphics.GraphicBuffer; import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Rect; @@ -251,9 +250,6 @@ class ScreenRotationAnimation { screenshotBuffer.getColorSpace()); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); - GraphicBuffer buffer = GraphicBuffer.createFromHardwareBuffer( - screenshotBuffer.getHardwareBuffer()); - t.setLayer(mScreenshotLayer, SCREEN_FREEZE_LAYER_BASE); t.reparent(mBackColorSurface, displayContent.getSurfaceControl()); // If hdr layers are on-screen, e.g. picture-in-picture mode, the screenshot of @@ -263,10 +259,11 @@ class ScreenRotationAnimation { t.setLayer(mBackColorSurface, -1); t.setColor(mBackColorSurface, new float[]{mStartLuma, mStartLuma, mStartLuma}); t.setAlpha(mBackColorSurface, 1); - t.setBuffer(mScreenshotLayer, buffer); + t.setBuffer(mScreenshotLayer, hardwareBuffer); t.setColorSpace(mScreenshotLayer, screenshotBuffer.getColorSpace()); t.show(mScreenshotLayer); t.show(mBackColorSurface); + hardwareBuffer.close(); if (mRoundedCornerOverlay != null) { for (SurfaceControl sc : mRoundedCornerOverlay) { diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 5e081d50cc54..e5385841a9a1 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -2406,7 +2406,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { if (isDisplayRotation) { // This isn't cheap, so only do it for display rotations. changeInfo.mSnapshotLuma = TransitionAnimation.getBorderLuma( - screenshotBuffer.getHardwareBuffer(), screenshotBuffer.getColorSpace()); + buffer, screenshotBuffer.getColorSpace()); } SurfaceControl.Transaction t = wc.mWmService.mTransactionFactory.get(); @@ -2418,6 +2418,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { t.setLayer(snapshotSurface, Integer.MAX_VALUE); t.apply(); t.close(); + buffer.close(); // Detach the screenshot on the sync transaction (the screenshot is just meant to // freeze the window until the sync transaction is applied (with all its other |