diff options
| -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 fdaae01ee27a..78986d946161 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 45714ff872c8..c3e7a6d04e64 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -108,7 +108,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 7018751efa9d..9bb8195b8901 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -277,6 +277,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, @@ -357,6 +367,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", |