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
diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java
index f212698..40ab108 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 @@
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 @@
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 @@
"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 @@
return false;
}
try {
- if(!initGLShaders(context) || !initGLBuffers() || checkGlErrors("prepare")) {
+ if (!initGLShaders(context) || !initGLBuffers() || checkGlErrors("prepare")) {
detachEglContext();
dismiss();
return false;
@@ -564,7 +576,7 @@
if (mMode == MODE_FADE) {
builder.setColorLayer();
} else {
- builder.setBufferSize(mDisplayWidth, mDisplayHeight);
+ builder.setBLASTLayer();
}
mSurfaceControl = builder.build();
} catch (OutOfResourcesException ex) {
@@ -579,9 +591,11 @@
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 @@
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;