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

Commit 6d96ea00 authored by Rachel Lee's avatar Rachel Lee Committed by Automerger Merge Worker
Browse files

Merge changes from topics "b270612751", "kFrameTimelinesCapacity" into udc-dev am: f94072ac

parents 563e3b9b f94072ac
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -1111,15 +1111,12 @@ public final class Choreographer {
     */
    public static class FrameData {
        private long mFrameTimeNanos;
        private final FrameTimeline[] mFrameTimelines =
                new FrameTimeline[DisplayEventReceiver.VsyncEventData.FRAME_TIMELINES_LENGTH];
        private FrameTimeline[] mFrameTimelines;
        private int mPreferredFrameTimelineIndex;
        private boolean mInCallback = false;

        FrameData() {
            for (int i = 0; i < mFrameTimelines.length; i++) {
                mFrameTimelines[i] = new FrameTimeline();
            }
            allocateFrameTimelines(DisplayEventReceiver.VsyncEventData.FRAME_TIMELINES_CAPACITY);
        }

        /** The time in nanoseconds when the frame started being rendered. */
@@ -1157,21 +1154,29 @@ public final class Choreographer {
            }
        }

        private void allocateFrameTimelines(int length) {
            mFrameTimelines = new FrameTimeline[length];
            for (int i = 0; i < mFrameTimelines.length; i++) {
                mFrameTimelines[i] = new FrameTimeline();
            }
        }

        /**
         * Update the frame data with a {@code DisplayEventReceiver.VsyncEventData} received from
         * native.
         */
        FrameTimeline update(
                long frameTimeNanos, DisplayEventReceiver.VsyncEventData vsyncEventData) {
            if (vsyncEventData.frameTimelines.length != mFrameTimelines.length) {
                throw new IllegalStateException(
                        "Length of native frame timelines received does not match Java. Did "
                                + "FRAME_TIMELINES_LENGTH or kFrameTimelinesLength (native) "
                                + "change?");
            if (vsyncEventData.frameTimelinesLength == 0) {
                throw new IllegalArgumentException(
                        "Vsync event timelines length must be greater than 0");
            }
            if (mFrameTimelines.length != vsyncEventData.frameTimelinesLength) {
                allocateFrameTimelines(vsyncEventData.frameTimelinesLength);
            }
            mFrameTimeNanos = frameTimeNanos;
            mPreferredFrameTimelineIndex = vsyncEventData.preferredFrameTimelineIndex;
            for (int i = 0; i < vsyncEventData.frameTimelines.length; i++) {
            for (int i = 0; i < mFrameTimelines.length; i++) {
                DisplayEventReceiver.VsyncEventData.FrameTimeline frameTimeline =
                        vsyncEventData.frameTimelines[i];
                mFrameTimelines[i].update(frameTimeline.vsyncId,
+10 −7
Original line number Diff line number Diff line
@@ -152,11 +152,10 @@ public abstract class DisplayEventReceiver {
     * @hide
     */
    public static final class VsyncEventData {
        // The amount of frame timeline choices.
        // Must be in sync with VsyncEventData::kFrameTimelinesLength in
        // frameworks/native/libs/gui/include/gui/VsyncEventData.h. If they do not match, a runtime
        // assertion is thrown when Choreographer is processing VsyncEventData.
        static final int FRAME_TIMELINES_LENGTH = 7;
        // The max capacity of frame timeline choices.
        // Must be in sync with VsyncEventData::kFrameTimelinesCapacity in
        // frameworks/native/libs/gui/include/gui/VsyncEventData.h
        static final int FRAME_TIMELINES_CAPACITY = 7;

        public static class FrameTimeline {
            FrameTimeline() {}
@@ -198,8 +197,10 @@ public abstract class DisplayEventReceiver {

        public int preferredFrameTimelineIndex = 0;

        public int frameTimelinesLength = 0;

        VsyncEventData() {
            frameTimelines = new FrameTimeline[FRAME_TIMELINES_LENGTH];
            frameTimelines = new FrameTimeline[FRAME_TIMELINES_CAPACITY];
            for (int i = 0; i < frameTimelines.length; i++) {
                frameTimelines[i] = new FrameTimeline();
            }
@@ -208,14 +209,16 @@ public abstract class DisplayEventReceiver {
        // Called from native code.
        @SuppressWarnings("unused")
        VsyncEventData(FrameTimeline[] frameTimelines, int preferredFrameTimelineIndex,
                long frameInterval) {
                int frameTimelinesLength, long frameInterval) {
            this.frameTimelines = frameTimelines;
            this.preferredFrameTimelineIndex = preferredFrameTimelineIndex;
            this.frameTimelinesLength = frameTimelinesLength;
            this.frameInterval = frameInterval;
        }

        void copyFrom(VsyncEventData other) {
            preferredFrameTimelineIndex = other.preferredFrameTimelineIndex;
            frameTimelinesLength = other.frameTimelinesLength;
            frameInterval = other.frameInterval;
            for (int i = 0; i < frameTimelines.length; i++) {
                frameTimelines[i].copyFrom(other.frameTimelines[i]);
+13 −5
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ static struct {

        jfieldID frameInterval;
        jfieldID preferredFrameTimelineIndex;
        jfieldID frameTimelinesLength;
        jfieldID frameTimelines;
    } vsyncEventDataClassInfo;

@@ -127,7 +128,7 @@ void NativeDisplayEventReceiver::dispose() {
static jobject createJavaVsyncEventData(JNIEnv* env, VsyncEventData vsyncEventData) {
    ScopedLocalRef<jobjectArray>
            frameTimelineObjs(env,
                              env->NewObjectArray(VsyncEventData::kFrameTimelinesLength,
                              env->NewObjectArray(vsyncEventData.frameTimelinesLength,
                                                  gDisplayEventReceiverClassInfo
                                                          .frameTimelineClassInfo.clazz,
                                                  /*initial element*/ NULL));
@@ -137,7 +138,7 @@ static jobject createJavaVsyncEventData(JNIEnv* env, VsyncEventData vsyncEventDa
        env->ExceptionClear();
        return NULL;
    }
    for (int i = 0; i < VsyncEventData::kFrameTimelinesLength; i++) {
    for (int i = 0; i < vsyncEventData.frameTimelinesLength; i++) {
        VsyncEventData::FrameTimeline frameTimeline = vsyncEventData.frameTimelines[i];
        ScopedLocalRef<jobject>
                frameTimelineObj(env,
@@ -159,7 +160,7 @@ static jobject createJavaVsyncEventData(JNIEnv* env, VsyncEventData vsyncEventDa
    return env->NewObject(gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
                          gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.init,
                          frameTimelineObjs.get(), vsyncEventData.preferredFrameTimelineIndex,
                          vsyncEventData.frameInterval);
                          vsyncEventData.frameTimelinesLength, vsyncEventData.frameInterval);
}

void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, PhysicalDisplayId displayId,
@@ -175,6 +176,10 @@ void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, PhysicalDispla
                         gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo
                                 .preferredFrameTimelineIndex,
                         vsyncEventData.preferredFrameTimelineIndex);
        env->SetIntField(vsyncEventDataObj.get(),
                         gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo
                                 .frameTimelinesLength,
                         vsyncEventData.frameTimelinesLength);
        env->SetLongField(vsyncEventDataObj.get(),
                          gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.frameInterval,
                          vsyncEventData.frameInterval);
@@ -186,7 +191,7 @@ void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, PhysicalDispla
                                                              gDisplayEventReceiverClassInfo
                                                                      .vsyncEventDataClassInfo
                                                                      .frameTimelines)));
        for (int i = 0; i < VsyncEventData::kFrameTimelinesLength; i++) {
        for (int i = 0; i < vsyncEventData.frameTimelinesLength; i++) {
            VsyncEventData::FrameTimeline& frameTimeline = vsyncEventData.frameTimelines[i];
            ScopedLocalRef<jobject>
                    frameTimelineObj(env, env->GetObjectArrayElement(frameTimelinesObj.get(), i));
@@ -392,11 +397,14 @@ int register_android_view_DisplayEventReceiver(JNIEnv* env) {
            GetMethodIDOrDie(env, gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
                             "<init>",
                             "([Landroid/view/"
                             "DisplayEventReceiver$VsyncEventData$FrameTimeline;IJ)V");
                             "DisplayEventReceiver$VsyncEventData$FrameTimeline;IIJ)V");

    gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.preferredFrameTimelineIndex =
            GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
                            "preferredFrameTimelineIndex", "I");
    gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.frameTimelinesLength =
            GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
                            "frameTimelinesLength", "I");
    gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.frameInterval =
            GetFieldIDOrDie(env, gDisplayEventReceiverClassInfo.vsyncEventDataClassInfo.clazz,
                            "frameInterval", "J");