From 6ce3a37f6b06585c5c0c045d1df69f21f8200067 Mon Sep 17 00:00:00 2001 From: Dohyun Lee Date: Mon, 23 Mar 2015 09:16:34 +0900 Subject: [PATCH] DimLayer : remove unnecessary surface transaction calls There is the case that adjustSurface() get called even if the size of the surface of DimLayer is not changed actually. Since changing the size of a surface is processed synchronously in the SurfacFlinger, there is usually a few milliseconds delay (up to 1 vsync interval) when we launch an application. This patch avoids such cases. Change-Id: Ib1f76d54f9f2364ac54b70120e4b781e8534e750 Signed-off-by: Dohyun Lee --- .../java/com/android/server/wm/DimLayer.java | 48 ++++++++++--------- .../java/com/android/server/wm/TaskStack.java | 4 +- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/services/core/java/com/android/server/wm/DimLayer.java b/services/core/java/com/android/server/wm/DimLayer.java index c09ea5cead823..3f5ae564eabf4 100644 --- a/services/core/java/com/android/server/wm/DimLayer.java +++ b/services/core/java/com/android/server/wm/DimLayer.java @@ -140,10 +140,9 @@ public class DimLayer { } /** - * @param layer The new layer value. - * @param inTransaction Whether the call is made within a surface transaction. + * NOTE: Must be called with Surface transaction open. */ - void adjustSurface(int layer, boolean inTransaction) { + private void adjustBounds() { final int dw, dh; final float xPos, yPos; if (!mStack.isFullscreen()) { @@ -163,29 +162,31 @@ public class DimLayer { yPos = -1 * dh / 6; } - try { - if (!inTransaction) { - SurfaceControl.openTransaction(); - } - mDimSurface.setPosition(xPos, yPos); - mDimSurface.setSize(dw, dh); - mDimSurface.setLayer(layer); - } catch (RuntimeException e) { - Slog.w(TAG, "Failure setting size or layer", e); - } finally { - if (!inTransaction) { - SurfaceControl.closeTransaction(); - } - } + mDimSurface.setPosition(xPos, yPos); + mDimSurface.setSize(dw, dh); + mLastBounds.set(mBounds); - mLayer = layer; } - // Assumes that surface transactions are currently closed. - void setBounds(Rect bounds) { + /** + * @param bounds The new bounds to set + * @param inTransaction Whether the call is made within a surface transaction. + */ + void setBounds(Rect bounds, boolean inTransaction) { mBounds.set(bounds); if (isDimming() && !mLastBounds.equals(bounds)) { - adjustSurface(mLayer, false); + try { + if (!inTransaction) { + SurfaceControl.openTransaction(); + } + adjustBounds(); + } catch (RuntimeException e) { + Slog.w(TAG, "Failure setting size", e); + } finally { + if (!inTransaction) { + SurfaceControl.closeTransaction(); + } + } } } @@ -224,9 +225,10 @@ public class DimLayer { return; } - if (!mLastBounds.equals(mBounds) || mLayer != layer) { - adjustSurface(layer, true); + if (!mLastBounds.equals(mBounds)) { + adjustBounds(); } + setLayer(layer); long curTime = SystemClock.uptimeMillis(); final boolean animating = isAnimating(); diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 802cf4bb119f4..d313e3f07108e 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -126,8 +126,8 @@ public class TaskStack { return false; } - mDimLayer.setBounds(bounds); - mAnimationBackgroundSurface.setBounds(bounds); + mDimLayer.setBounds(bounds, false); + mAnimationBackgroundSurface.setBounds(bounds, false); mBounds.set(bounds); return true;