diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java index bb4dbc3b5c9a6..835ba1734da32 100644 --- a/services/core/java/com/android/server/display/ColorFade.java +++ b/services/core/java/com/android/server/display/ColorFade.java @@ -74,6 +74,7 @@ final class ColorFade { // Set to true when the animation context has been fully prepared. private boolean mPrepared; + private boolean mCreatedResources; private int mMode; private final DisplayManagerInternal mDisplayManagerInternal; @@ -169,6 +170,7 @@ final class ColorFade { } // Done. + mCreatedResources = true; mPrepared = true; // Dejanking optimization. @@ -312,6 +314,34 @@ final class ColorFade { vtx.put(7, y); } + /** + * Dismisses the color fade animation resources. + * + * This function destroys the resources that are created for the color fade + * animation but does not clean up the surface. + */ + public void dismissResources() { + if (DEBUG) { + Slog.d(TAG, "dismissResources"); + } + + if (mCreatedResources) { + attachEglContext(); + try { + destroyScreenshotTexture(); + destroyGLShaders(); + destroyGLBuffers(); + destroyEglSurface(); + } finally { + detachEglContext(); + } + // This is being called with no active context so shouldn't be + // needed but is safer to not change for now. + GLES20.glFlush(); + mCreatedResources = false; + } + } + /** * Dismisses the color fade animation surface and cleans up. * @@ -325,17 +355,8 @@ final class ColorFade { } if (mPrepared) { - attachEglContext(); - try { - destroyScreenshotTexture(); - destroyGLShaders(); - destroyGLBuffers(); - destroyEglSurface(); - } finally { - detachEglContext(); - } + dismissResources(); destroySurface(); - GLES20.glFlush(); mPrepared = false; } } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 452378ff1e454..7b49530e68856 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -837,6 +837,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (mPendingScreenOff && target != Display.STATE_OFF) { setScreenState(Display.STATE_OFF); mPendingScreenOff = false; + mPowerState.dismissColorFadeResources(); } if (target == Display.STATE_ON) { @@ -910,6 +911,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // A black surface is already hiding the contents of the screen. setScreenState(Display.STATE_OFF); mPendingScreenOff = false; + mPowerState.dismissColorFadeResources(); } else if (performScreenOffTransition && mPowerState.prepareColorFade(mContext, mColorFadeFadesConfig ? diff --git a/services/core/java/com/android/server/display/DisplayPowerState.java b/services/core/java/com/android/server/display/DisplayPowerState.java index 2eabd326f214b..98625161a7067 100644 --- a/services/core/java/com/android/server/display/DisplayPowerState.java +++ b/services/core/java/com/android/server/display/DisplayPowerState.java @@ -187,7 +187,7 @@ final class DisplayPowerState { } /** - * Dismisses the electron beam surface. + * Dismisses the color fade surface. */ public void dismissColorFade() { mColorFade.dismiss(); @@ -195,6 +195,13 @@ final class DisplayPowerState { mColorFadeReady = true; } + /** + * Dismisses the color fade resources. + */ + public void dismissColorFadeResources() { + mColorFade.dismissResources(); + } + /** * Sets the level of the electron beam steering current. *