Merge "Update ColorFade to use BLAST" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-05-11 06:12:27 +00:00
committed by Android (Google) Code Review

View File

@@ -19,6 +19,8 @@ package com.android.server.display;
import static com.android.server.wm.utils.RotationAnimationUtils.hasProtectedContent; import static com.android.server.wm.utils.RotationAnimationUtils.hasProtectedContent;
import android.content.Context; import android.content.Context;
import android.graphics.BLASTBufferQueue;
import android.graphics.PixelFormat;
import android.graphics.SurfaceTexture; import android.graphics.SurfaceTexture;
import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayManagerInternal;
import android.hardware.display.DisplayManagerInternal.DisplayTransactionListener; import android.hardware.display.DisplayManagerInternal.DisplayTransactionListener;
@@ -91,6 +93,7 @@ final class ColorFade {
private int mDisplayHeight; // real height, not rotated private int mDisplayHeight; // real height, not rotated
private SurfaceControl mSurfaceControl; private SurfaceControl mSurfaceControl;
private Surface mSurface; private Surface mSurface;
private BLASTBufferQueue mBLASTBufferQueue;
private NaturalSurfaceLayout mSurfaceLayout; private NaturalSurfaceLayout mSurfaceLayout;
private EGLDisplay mEglDisplay; private EGLDisplay mEglDisplay;
private EGLConfig mEglConfig; private EGLConfig mEglConfig;
@@ -165,21 +168,30 @@ final class ColorFade {
"Failed to take screenshot because internal display is disconnected"); "Failed to take screenshot because internal display is disconnected");
return false; return false;
} }
boolean isWideColor = SurfaceControl.getDynamicDisplayInfo(token).activeColorMode final boolean isWideColor = SurfaceControl.getDynamicDisplayInfo(token).activeColorMode
== Display.COLOR_MODE_DISPLAY_P3; == Display.COLOR_MODE_DISPLAY_P3;
// Set mPrepared here so if initialization fails, resources can be cleaned up. // Set mPrepared here so if initialization fails, resources can be cleaned up.
mPrepared = true; mPrepared = true;
SurfaceControl.ScreenshotHardwareBuffer hardwareBuffer = captureScreen(); final SurfaceControl.ScreenshotHardwareBuffer hardwareBuffer = captureScreen();
if (hardwareBuffer == null) { if (hardwareBuffer == null) {
dismiss(); dismiss();
return false; return false;
} }
boolean isProtected = hasProtectedContent(hardwareBuffer.getHardwareBuffer()); final boolean isProtected = hasProtectedContent(hardwareBuffer.getHardwareBuffer());
if (!(createSurfaceControl(hardwareBuffer.containsSecureLayers()) if (!createSurfaceControl(hardwareBuffer.containsSecureLayers())) {
&& createEglContext(isProtected) && createEglSurface(isProtected, isWideColor) dismiss();
return false;
}
// MODE_FADE use ColorLayer to implement.
if (mMode == MODE_FADE) {
return true;
}
if (!(createEglContext(isProtected) && createEglSurface(isProtected, isWideColor)
&& setScreenshotTextureAndSetViewport(hardwareBuffer))) { && setScreenshotTextureAndSetViewport(hardwareBuffer))) {
dismiss(); dismiss();
return false; return false;
@@ -190,7 +202,7 @@ final class ColorFade {
return false; return false;
} }
try { try {
if(!initGLShaders(context) || !initGLBuffers() || checkGlErrors("prepare")) { if (!initGLShaders(context) || !initGLBuffers() || checkGlErrors("prepare")) {
detachEglContext(); detachEglContext();
dismiss(); dismiss();
return false; return false;
@@ -564,7 +576,7 @@ final class ColorFade {
if (mMode == MODE_FADE) { if (mMode == MODE_FADE) {
builder.setColorLayer(); builder.setColorLayer();
} else { } else {
builder.setBufferSize(mDisplayWidth, mDisplayHeight); builder.setBLASTLayer();
} }
mSurfaceControl = builder.build(); mSurfaceControl = builder.build();
} catch (OutOfResourcesException ex) { } catch (OutOfResourcesException ex) {
@@ -579,9 +591,11 @@ final class ColorFade {
mSurfaceLayout.onDisplayTransaction(mTransaction); mSurfaceLayout.onDisplayTransaction(mTransaction);
mTransaction.apply(); mTransaction.apply();
mSurface = new Surface(); if (mMode != MODE_FADE) {
mSurface.copyFrom(mSurfaceControl); mBLASTBufferQueue = new BLASTBufferQueue("ColorFade", mSurfaceControl,
mDisplayWidth, mDisplayHeight, PixelFormat.TRANSLUCENT);
mSurface = mBLASTBufferQueue.createSurface();
}
return true; return true;
} }
@@ -707,7 +721,12 @@ final class ColorFade {
mSurfaceLayout.dispose(); mSurfaceLayout.dispose();
mSurfaceLayout = null; mSurfaceLayout = null;
mTransaction.remove(mSurfaceControl).apply(); mTransaction.remove(mSurfaceControl).apply();
mSurface.release(); if (mSurface != null) {
mSurface.release();
mBLASTBufferQueue.destroy();
mSurface = null;
mBLASTBufferQueue = null;
}
mSurfaceControl = null; mSurfaceControl = null;
mSurfaceVisible = false; mSurfaceVisible = false;
mSurfaceAlpha = 0f; mSurfaceAlpha = 0f;