From 8dd88f649b0cee33588a154a942195c0920d59a1 Mon Sep 17 00:00:00 2001 From: Matthew Bouyack Date: Mon, 24 Oct 2016 14:01:26 -0700 Subject: [PATCH] Avoid redundant setMatrix calls from setMatrixInTransaction This matches the behavior of setPositionInTransaction and setSizeInTransaction. By eliminating calls to setMatrix, we avoid triggering redundant SurfaceFlinger invalidates. This is particularly noteworthy on Android Wear where we must update the minute hand every 60 seconds, but want the device to spend as much time sleeping as possible. See b/31489482 Change-Id: I424bb9f60c3033921fa04e7abcfc552500114f1f --- .../android/server/wm/WindowSurfaceController.java | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index f5ed9d1b8650..961f742f3e27 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -57,6 +57,12 @@ class WindowSurfaceController { private float mSurfaceW = 0; private float mSurfaceH = 0; + // Initialize to the identity matrix. + private float mLastDsdx = 1; + private float mLastDtdx = 0; + private float mLastDsdy = 0; + private float mLastDtdy = 1; + private float mSurfaceAlpha = 0; private int mSurfaceLayer = 0; @@ -266,6 +272,17 @@ class WindowSurfaceController { void setMatrixInTransaction(float dsdx, float dtdx, float dsdy, float dtdy, boolean recoveringMemory) { + final boolean matrixChanged = mLastDsdx != dsdx || mLastDtdx != dtdx || + mLastDsdy != dsdy || mLastDtdy != dtdy; + if (!matrixChanged) { + return; + } + + mLastDsdx = dsdx; + mLastDtdx = dtdx; + mLastDsdy = dsdy; + mLastDtdy = dtdy; + try { if (SHOW_TRANSACTIONS) logSurface( "MATRIX [" + dsdx + "," + dtdx + "," + dsdy + "," + dtdy + "]", null); @@ -281,7 +298,6 @@ class WindowSurfaceController { mAnimator.reclaimSomeSurfaceMemory("matrix", true); } } - return; } boolean setSizeInTransaction(int width, int height, boolean recoveringMemory) { @@ -318,6 +334,10 @@ class WindowSurfaceController { mSurfaceControl.setAlpha(alpha); mSurfaceLayer = layer; mSurfaceControl.setLayer(layer); + mLastDsdx = dsdx; + mLastDtdx = dtdx; + mLastDsdy = dsdy; + mLastDtdy = dtdy; mSurfaceControl.setMatrix( dsdx, dtdx, dsdy, dtdy); -- 2.11.0