summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Stoza <stoza@google.com>2014-06-20 13:01:36 -0700
committerDan Stoza <stoza@google.com>2014-06-20 15:28:31 -0700
commit5795d6408d8bf44ffe2f49a25f9f333069b59a49 (patch)
tree169113cdb2df731cbe026b0e1c5e1dd02bf9fcd7
parentc6543afd6b94671c99bd7a934da010918a015286 (diff)
downloadframeworks_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.java13
-rw-r--r--core/java/android/view/ThreadedRenderer.java4
-rw-r--r--core/jni/android_view_Surface.cpp12
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",