Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5795d640 authored by Dan Stoza's avatar Dan Stoza
Browse files

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
parent c6543afd
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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
@@ -419,6 +421,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.
+3 −1
Original line number Diff line number Diff line
@@ -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
+12 −0
Original line number Diff line number Diff line
@@ -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",