diff options
author | Dan Stoza <stoza@google.com> | 2014-06-20 13:01:36 -0700 |
---|---|---|
committer | Dan Stoza <stoza@google.com> | 2014-06-20 15:28:31 -0700 |
commit | 5795d6408d8bf44ffe2f49a25f9f333069b59a49 (patch) | |
tree | 169113cdb2df731cbe026b0e1c5e1dd02bf9fcd7 | |
parent | c6543afd6b94671c99bd7a934da010918a015286 (diff) | |
download | frameworks_base-5795d6408d8bf44ffe2f49a25f9f333069b59a49.zip frameworks_base-5795d6408d8bf44ffe2f49a25f9f333069b59a49.tar.gz frameworks_base-5795d6408d8bf44ffe2f49a25f9f333069b59a49.tar.bz2 |
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
-rw-r--r-- | core/java/android/view/Surface.java | 13 | ||||
-rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 4 | ||||
-rw-r--r-- | core/jni/android_view_Surface.cpp | 12 |
3 files changed, 28 insertions, 1 deletions
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<Surface> CREATOR = new Parcelable.Creator<Surface>() { @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 diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 3d14aaf..8331a9f 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -273,6 +273,16 @@ static void nativeUnlockCanvasAndPost(JNIEnv* env, jclass clazz, } } +static void nativeAllocateBuffers(JNIEnv* /* env */ , jclass /* clazz */, + jlong nativeObject) { + sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject)); + if (!isSurfaceValid(surface)) { + return; + } + + surface->allocateBuffers(); +} + // ---------------------------------------------------------------------------- static jlong nativeCreateFromSurfaceControl(JNIEnv* env, jclass clazz, @@ -353,6 +363,8 @@ static JNINativeMethod gSurfaceMethods[] = { (void*)nativeLockCanvas }, {"nativeUnlockCanvasAndPost", "(JLandroid/graphics/Canvas;)V", (void*)nativeUnlockCanvasAndPost }, + {"nativeAllocateBuffers", "(J)V", + (void*)nativeAllocateBuffers }, {"nativeCreateFromSurfaceControl", "(J)J", (void*)nativeCreateFromSurfaceControl }, {"nativeReadFromParcel", "(JLandroid/os/Parcel;)J", |