Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3c814b50 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

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
parent 8e6e692f
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -1279,11 +1279,16 @@ 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 luma;
    }

    /** Returns the luminance in 0~1. */
    public static float getBorderLuma(HardwareBuffer hwBuffer, ColorSpace colorSpace) {
+1 −0
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ class ScreenRotationAnimation {
                if (!isCustomRotate()) {
                    mStartLuma = TransitionAnimation.getBorderLuma(hardwareBuffer, colorSpace);
                }
                hardwareBuffer.close();
            }

            t.setLayer(mAnimLeash, SCREEN_FREEZE_LAYER_BASE);
+2 −5
Original line number Diff line number Diff line
@@ -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) {
+2 −1
Original line number Diff line number Diff line
@@ -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