From 5795d6408d8bf44ffe2f49a25f9f333069b59a49 Mon Sep 17 00:00:00 2001 From: Dan Stoza Date: Fri, 20 Jun 2014 13:01:36 -0700 Subject: Surface: Add allocateBuffers to avoid render delay This plumbs up a new call on the native Surface object that allows the client to request that BufferQueue pre-allocate all of the buffers that it might need for rendering. This hopefully prevents allocation delays during dequeuing and reduces jank. Bug: 11792166 Change-Id: Ibeaa7475492d4ac2bcacb107ef60c6240081d8b7 --- core/java/android/view/Surface.java | 13 +++++++++++++ core/java/android/view/ThreadedRenderer.java | 4 +++- 2 files changed, 16 insertions(+), 1 deletion(-) (limited to 'core/java/android/view') diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index fdaae01..78986d9 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -51,6 +51,8 @@ public class Surface implements Parcelable { private static native long nativeReadFromParcel(long nativeObject, Parcel source); private static native void nativeWriteToParcel(long nativeObject, Parcel dest); + private static native void nativeAllocateBuffers(long nativeObject); + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override @@ -420,6 +422,17 @@ public class Surface implements Parcelable { } /** + * Allocate buffers ahead of time to avoid allocation delays during rendering + * @hide + */ + public void allocateBuffers() { + synchronized (mLock) { + checkNotReleasedLocked(); + nativeAllocateBuffers(mNativeObject); + } + } + + /** * Exception thrown when a Canvas couldn't be locked with {@link Surface#lockCanvas}, or * when a SurfaceTexture could not successfully be allocated. */ diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 166edc2..3f5f6c4 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -113,7 +113,9 @@ public class ThreadedRenderer extends HardwareRenderer { boolean initialize(Surface surface) throws OutOfResourcesException { mInitialized = true; updateEnabledState(surface); - return nInitialize(mNativeProxy, surface); + boolean status = nInitialize(mNativeProxy, surface); + surface.allocateBuffers(); + return status; } @Override -- cgit v1.1