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

Commit 96e33b55 authored by Pascal Mütschard's avatar Pascal Mütschard Committed by Android (Google) Code Review
Browse files

Merge changes I38f7a084,I119a5264

* changes:
  Send flush  transactions if jank data doesn't arrive in time.
  Expose the flush jank data transaction via JNI.
parents 51cf8dd1 fce83c93
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -173,6 +173,7 @@ public final class SurfaceControl implements Parcelable {
            boolean isTrustedOverlay);
    private static native void nativeSetDropInputMode(
            long transactionObj, long nativeObject, int flags);
    private static native void nativeSurfaceFlushJankData(long nativeSurfaceObject);
    private static native boolean nativeClearContentFrameStats(long nativeObject);
    private static native boolean nativeGetContentFrameStats(long nativeObject, WindowContentFrameStats outStats);
    private static native boolean nativeClearAnimationFrameStats();
@@ -3884,6 +3885,15 @@ public final class SurfaceControl implements Parcelable {
            return this;
        }

        /**
         * Sends a flush jank data transaction for the given surface.
         * @hide
         */
        public static void sendSurfaceFlushJankData(SurfaceControl sc) {
            sc.checkNotReleased();
            nativeSurfaceFlushJankData(sc.mNativeObject);
        }

        /**
         * @hide
         */
+34 −6
Original line number Diff line number Diff line
@@ -68,6 +68,9 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener

    private static final int MAX_LENGTH_EVENT_DESC = 20;

    private static final int MAX_FLUSH_ATTEMPTS = 3;
    private static final int FLUSH_DELAY_MILLISECOND = 60;

    static final int REASON_END_UNKNOWN = -1;
    static final int REASON_END_NORMAL = 0;
    static final int REASON_END_SURFACE_DESTROYED = 1;
@@ -358,11 +361,35 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
            // will remove it when all the frame metrics in this duration are called back.
            // See onFrameMetricsAvailable for the logic of removing the observer.
            // Waiting at most 10 seconds for all callbacks to finish.
            mWaitForFinishTimedOut = new Runnable() {
                private int mFlushAttempts = 0;

                @Override
                public void run() {
                    if (mWaitForFinishTimedOut == null || mMetricsFinalized) {
                        return;
                    }

                    // Send a flush jank data transaction.
                    if (mSurfaceControl != null && mSurfaceControl.isValid()) {
                        SurfaceControl.Transaction.sendSurfaceFlushJankData(mSurfaceControl);
                    }

                    long delay;
                    if (mFlushAttempts < MAX_FLUSH_ATTEMPTS) {
                        delay = FLUSH_DELAY_MILLISECOND;
                        mFlushAttempts++;
                    } else {
                        mWaitForFinishTimedOut = () -> {
                Log.e(TAG, "force finish cuj because of time out:" + mSession.getName());
                            Log.e(TAG, "force finish cuj, time out: " + mSession.getName());
                            finish();
                        };
            getHandler().postDelayed(mWaitForFinishTimedOut, TimeUnit.SECONDS.toMillis(10));
                        delay = TimeUnit.SECONDS.toMillis(10);
                    }
                    getHandler().postDelayed(mWaitForFinishTimedOut, delay);
                }
            };
            getHandler().postDelayed(mWaitForFinishTimedOut, FLUSH_DELAY_MILLISECOND);
            notifyCujEvent(ACTION_SESSION_END);
            return true;
        }
@@ -537,11 +564,12 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener

    @UiThread
    private void finish() {
        if (mMetricsFinalized || mCancelled) return;
        mMetricsFinalized = true;

        getHandler().removeCallbacks(mWaitForFinishTimedOut);
        mWaitForFinishTimedOut = null;
        if (mMetricsFinalized || mCancelled) return;
        markEvent("FT#finish#" + mJankInfos.size());
        mMetricsFinalized = true;

        // The tracing has been ended, remove the observer, see if need to trigger perfetto.
        removeObservers();
+7 −0
Original line number Diff line number Diff line
@@ -951,6 +951,11 @@ static void nativeSetDropInputMode(JNIEnv* env, jclass clazz, jlong transactionO
    transaction->setDropInputMode(ctrl, static_cast<gui::DropInputMode>(mode));
}

static void nativeSurfaceFlushJankData(JNIEnv* env, jclass clazz, jlong nativeObject) {
    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
    SurfaceComposerClient::Transaction::sendSurfaceFlushJankDataTransaction(ctrl);
}

static void nativeSanitize(JNIEnv* env, jclass clazz, jlong transactionObj) {
    auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
    transaction->sanitize();
@@ -2246,6 +2251,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
            (void*)nativeGetLayerId },
    {"nativeSetDropInputMode", "(JJI)V",
             (void*)nativeSetDropInputMode },
    {"nativeSurfaceFlushJankData", "(J)V",
            (void*)nativeSurfaceFlushJankData },
    {"nativeAddTransactionCommittedListener", "(JLandroid/view/SurfaceControl$TransactionCommittedListener;)V",
            (void*) nativeAddTransactionCommittedListener },
    {"nativeSetTrustedPresentationCallback", "(JJJLandroid/view/SurfaceControl$TrustedPresentationThresholds;)V",