summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2023-01-12 15:51:09 +0000
committer Riddle Hsu <riddlehsu@google.com> 2023-01-12 16:14:41 +0000
commit3c814b500096b49abfaa889c2e28cb15c033fdf6 (patch)
tree2b6016fcbd40a84cf22823306764bcb8e1709943 /services
parent8e6e692f42e3c9dbe9cf15a9f9f642834e0ed65e (diff)
Close HardwareBuffer used by rotation animation
The HardwareBuffer used to rely on garbage collection to release. Since WMS.H#FROCE_GC is removed for reducing random delay, the buffer references should be released explicitly after use. Otherwise the lifetime of the buffer on native side may be too long, because system may not trigger GC frequently. Note that setBuffer will add a reference to the buffer. So the close() can be called right after that. Bug: 264650822 Test: Rotate screen many times, the number from adb shell dmabuf_dump -a | grep 10200 | wc -l adb shell dmabuf_dump -b | grep 10240000 | wc -l should not keep increasing. (10200,10240000 may be different according1020 to screen size) Change-Id: I39c052ccf8f7ae7a5914532ee61596a336af0993
Diffstat (limited to 'services')
-rw-r--r--services/core/java/com/android/server/wm/ScreenRotationAnimation.java7
-rw-r--r--services/core/java/com/android/server/wm/Transition.java3
2 files changed, 4 insertions, 6 deletions
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