From d73854dbfde6e034ae0a6d12c52930c5284a08bb Mon Sep 17 00:00:00 2001 From: Michael Lentine Date: Fri, 25 Sep 2015 10:55:26 -0700 Subject: [PATCH] Remove ColorFade resouces when screen off. This will not destroy the surface but will free up everything else used by ColorFade when the screen is turned off. When it is turned on the surface is dismissed. Bug: 24371570 Change-Id: Iba455cdf225a68b320896f8b35d1e873e694b1e3 --- .../com/android/server/display/ColorFade.java | 41 ++++++++++++++----- .../display/DisplayPowerController.java | 2 + .../server/display/DisplayPowerState.java | 9 +++- 3 files changed, 41 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 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. *