From f08df837244ed244db82571b7ccb4ca89e57d52e Mon Sep 17 00:00:00 2001 From: Arthur Hung Date: Thu, 6 May 2021 01:42:35 +0000 Subject: [PATCH] Update ColorFade to use BLAST If mode is MODE_FADE, it use a simple dim layer, it's unnecessary to create the surface. Bug: 186274303 Test: turn off/on screen to see if ColorFade works fine Change-Id: I0f9f3bab63afe2fb37ae87f37cd6c55e924639fb --- .../com/android/server/display/ColorFade.java | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java index f2126987ff19b..40ab10834ae47 100644 --- a/services/core/java/com/android/server/display/ColorFade.java +++ b/services/core/java/com/android/server/display/ColorFade.java @@ -19,6 +19,8 @@ package com.android.server.display; import static com.android.server.wm.utils.RotationAnimationUtils.hasProtectedContent; import android.content.Context; +import android.graphics.BLASTBufferQueue; +import android.graphics.PixelFormat; import android.graphics.SurfaceTexture; import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayManagerInternal.DisplayTransactionListener; @@ -91,6 +93,7 @@ final class ColorFade { private int mDisplayHeight; // real height, not rotated private SurfaceControl mSurfaceControl; private Surface mSurface; + private BLASTBufferQueue mBLASTBufferQueue; private NaturalSurfaceLayout mSurfaceLayout; private EGLDisplay mEglDisplay; private EGLConfig mEglConfig; @@ -165,21 +168,30 @@ final class ColorFade { "Failed to take screenshot because internal display is disconnected"); return false; } - boolean isWideColor = SurfaceControl.getDynamicDisplayInfo(token).activeColorMode + final boolean isWideColor = SurfaceControl.getDynamicDisplayInfo(token).activeColorMode == Display.COLOR_MODE_DISPLAY_P3; // Set mPrepared here so if initialization fails, resources can be cleaned up. mPrepared = true; - SurfaceControl.ScreenshotHardwareBuffer hardwareBuffer = captureScreen(); + final SurfaceControl.ScreenshotHardwareBuffer hardwareBuffer = captureScreen(); if (hardwareBuffer == null) { dismiss(); return false; } - boolean isProtected = hasProtectedContent(hardwareBuffer.getHardwareBuffer()); - if (!(createSurfaceControl(hardwareBuffer.containsSecureLayers()) - && createEglContext(isProtected) && createEglSurface(isProtected, isWideColor) + final boolean isProtected = hasProtectedContent(hardwareBuffer.getHardwareBuffer()); + if (!createSurfaceControl(hardwareBuffer.containsSecureLayers())) { + dismiss(); + return false; + } + + // MODE_FADE use ColorLayer to implement. + if (mMode == MODE_FADE) { + return true; + } + + if (!(createEglContext(isProtected) && createEglSurface(isProtected, isWideColor) && setScreenshotTextureAndSetViewport(hardwareBuffer))) { dismiss(); return false; @@ -190,7 +202,7 @@ final class ColorFade { return false; } try { - if(!initGLShaders(context) || !initGLBuffers() || checkGlErrors("prepare")) { + if (!initGLShaders(context) || !initGLBuffers() || checkGlErrors("prepare")) { detachEglContext(); dismiss(); return false; @@ -564,7 +576,7 @@ final class ColorFade { if (mMode == MODE_FADE) { builder.setColorLayer(); } else { - builder.setBufferSize(mDisplayWidth, mDisplayHeight); + builder.setBLASTLayer(); } mSurfaceControl = builder.build(); } catch (OutOfResourcesException ex) { @@ -579,9 +591,11 @@ final class ColorFade { mSurfaceLayout.onDisplayTransaction(mTransaction); mTransaction.apply(); - mSurface = new Surface(); - mSurface.copyFrom(mSurfaceControl); - + if (mMode != MODE_FADE) { + mBLASTBufferQueue = new BLASTBufferQueue("ColorFade", mSurfaceControl, + mDisplayWidth, mDisplayHeight, PixelFormat.TRANSLUCENT); + mSurface = mBLASTBufferQueue.createSurface(); + } return true; } @@ -707,7 +721,12 @@ final class ColorFade { mSurfaceLayout.dispose(); mSurfaceLayout = null; mTransaction.remove(mSurfaceControl).apply(); - mSurface.release(); + if (mSurface != null) { + mSurface.release(); + mBLASTBufferQueue.destroy(); + mSurface = null; + mBLASTBufferQueue = null; + } mSurfaceControl = null; mSurfaceVisible = false; mSurfaceAlpha = 0f;