From 63005e6e5b1ee6d32a217ce8b4d8f0d13987fc39 Mon Sep 17 00:00:00 2001 From: John Reck Date: Tue, 19 May 2015 15:00:13 -0700 Subject: [PATCH] Reduce wasted buffer allocations Bug: 20170924 Don't pre-allocate buffers if there is a SurfaceView or other View that has requested transparent regions. This doesn't fully address the problem of allocating buffers when there's a full screen SurfaceView but it at least gets back to KitKat levels of only having 1 wasted buffer instead of 3 (the 1 being a result of the fact that it will still draw one frame of emptiness forcing a buffer dequeue). Change-Id: Ied9553186bc7b111d180b63f87b92bd317cb4b97 --- core/java/android/view/ThreadedRenderer.java | 1 - core/java/android/view/ViewRootImpl.java | 9 +++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 7f243d3425d88..e044f1e9669e4 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -148,7 +148,6 @@ public class ThreadedRenderer extends HardwareRenderer { mInitialized = true; updateEnabledState(surface); boolean status = nInitialize(mNativeProxy, surface); - surface.allocateBuffers(); return status; } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b7d902c793903..39818d92fedf6 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1708,10 +1708,19 @@ public final class ViewRootImpl implements ViewParent, mFullRedrawNeeded = true; mPreviousTransparentRegion.setEmpty(); + // Only initialize up-front if transparent regions are not + // requested, otherwise defer to see if the entire window + // will be transparent if (mAttachInfo.mHardwareRenderer != null) { try { hwInitialized = mAttachInfo.mHardwareRenderer.initialize( mSurface); + if (hwInitialized && (host.mPrivateFlags + & View.PFLAG_REQUEST_TRANSPARENT_REGIONS) == 0) { + // Don't pre-allocate if transparent regions + // are requested as they may not be needed + mSurface.allocateBuffers(); + } } catch (OutOfResourcesException e) { handleOutOfResourcesException(e); return;