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

Commit 9bce5e0c authored by Vishnu Nair's avatar Vishnu Nair
Browse files

BLAST: Ensure buffers are submitted before reporting draw finished

If blast sync is not enabled abut we need to report draw finished
for the next frame, call setNextTransaction. Blast buffer queue
will process any queued up buffers and ensure the buffer is
submitted before reporting draw finished.

Test: Test no flickers with blast enabled in splitscreen
Change-Id: If7a36eb0a9a2914dd37adfd20abcbe2b5074b16a
parent 17c77995
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -3881,10 +3881,6 @@ public final class ViewRootImpl implements ViewParent,
    }

    private void addFrameCallbackIfNeeded() {
        if (!mNextDrawUseBLASTSyncTransaction) {
            return;
        }

        // Frame callbacks will always occur after submitting draw requests and before
        // the draw actually occurs. This will ensure that we set the next transaction
        // for the frame that's about to get drawn and not on a previous frame that.
@@ -3892,8 +3888,19 @@ public final class ViewRootImpl implements ViewParent,
        // This is thread safe since mRtNextFrameReportConsumeWithBlast will only be
        // modified in onFrameDraw and then again in onFrameComplete. This is to ensure the
        // next frame completed should be reported with the blast sync transaction.
        if (mNextDrawUseBLASTSyncTransaction) {
            registerRtFrameCallback(createFrameDrawingCallback());
            mNextDrawUseBLASTSyncTransaction = false;
        } else if (mReportNextDraw) {
            registerRtFrameCallback(frame -> {
                if (mBlastBufferQueue != null) {
                    // If we need to report next draw, wait for adapter to flush its shadow queue
                    // by processing previously queued buffers so that we can submit the
                    // transaction a timely manner.
                    mBlastBufferQueue.flushShadowQueue();
                }
            });
        }
    }

    private void performDraw() {
+7 −1
Original line number Diff line number Diff line
@@ -69,13 +69,19 @@ static void nativeUpdate(JNIEnv*env, jclass clazz, jlong ptr, jlong surfaceContr
    queue->update(reinterpret_cast<SurfaceControl*>(surfaceControl), width, height);
}

static void nativeFlushShadowQueue(JNIEnv* env, jclass clazz, jlong ptr) {
    sp<BLASTBufferQueue> queue = reinterpret_cast<BLASTBufferQueue*>(ptr);
    queue->flushShadowQueue();
}

static const JNINativeMethod gMethods[] = {
        /* name, signature, funcPtr */
        {"nativeCreate", "(Ljava/lang/String;JJJZ)J", (void*)nativeCreate},
        {"nativeGetSurface", "(J)Landroid/view/Surface;", (void*)nativeGetSurface},
        {"nativeDestroy", "(J)V", (void*)nativeDestroy},
        {"nativeSetNextTransaction", "(JJ)V", (void*)nativeSetNextTransaction},
        {"nativeUpdate", "(JJJJ)V", (void*)nativeUpdate}};
        {"nativeUpdate", "(JJJJ)V", (void*)nativeUpdate},
        {"nativeFlushShadowQueue", "(J)V", (void*)nativeFlushShadowQueue}};

int register_android_graphics_BLASTBufferQueue(JNIEnv* env) {
    int res = jniRegisterNativeMethods(env, "android/graphics/BLASTBufferQueue",
+5 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ public final class BLASTBufferQueue {
    private static native Surface nativeGetSurface(long ptr);
    private static native void nativeSetNextTransaction(long ptr, long transactionPtr);
    private static native void nativeUpdate(long ptr, long surfaceControl, long width, long height);
    private static native void nativeFlushShadowQueue(long ptr);

    /** Create a new connection with the surface flinger. */
    public BLASTBufferQueue(String name, SurfaceControl sc, int width, int height,
@@ -69,4 +70,8 @@ public final class BLASTBufferQueue {
            super.finalize();
        }
    }

    public void flushShadowQueue() {
        nativeFlushShadowQueue(mNativeObject);
    }
}