From d483fa5b7fd291ed490815f160e79fd782989cc0 Mon Sep 17 00:00:00 2001 From: Rachel Lee Date: Tue, 14 Mar 2023 13:52:47 -0700 Subject: [PATCH] Copy from DisplayEventReceiver.VsyncEventData Fix for regression. In the regressing CL, per-frame allocation of new VsyncEventData is removed. Instead, a single VsyncEventData is written into with new data each frame. However, `mLastVsyncEventData` was assigned to reference that single VsyncEventData, so the data inside can be changed underneath. To fix, copy the data instead of storing the reference. Bug: 272123078 Test: ABTD run with ATP from bugs and check metric Change-Id: I39e51cadad61b5e496effc5c7d87d824ae97438a --- core/java/android/view/Choreographer.java | 8 ++++---- core/java/android/view/DisplayEventReceiver.java | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index 8c4e90c81147d..c92b1b8c120de 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -195,7 +195,7 @@ public final class Choreographer { private boolean mDebugPrintNextFrameTimeDelta; private int mFPSDivisor = 1; - private DisplayEventReceiver.VsyncEventData mLastVsyncEventData = + private final DisplayEventReceiver.VsyncEventData mLastVsyncEventData = new DisplayEventReceiver.VsyncEventData(); private final FrameData mFrameData = new FrameData(); @@ -857,7 +857,7 @@ public final class Choreographer { mFrameScheduled = false; mLastFrameTimeNanos = frameTimeNanos; mLastFrameIntervalNanos = frameIntervalNanos; - mLastVsyncEventData = vsyncEventData; + mLastVsyncEventData.copyFrom(vsyncEventData); } AnimationUtils.lockAnimationClock(frameTimeNanos / TimeUtils.NANOS_PER_MS); @@ -1247,7 +1247,7 @@ public final class Choreographer { private boolean mHavePendingVsync; private long mTimestampNanos; private int mFrame; - private VsyncEventData mLastVsyncEventData = new VsyncEventData(); + private final VsyncEventData mLastVsyncEventData = new VsyncEventData(); FrameDisplayEventReceiver(Looper looper, int vsyncSource, long layerHandle) { super(looper, vsyncSource, /* eventRegistration */ 0, layerHandle); @@ -1287,7 +1287,7 @@ public final class Choreographer { mTimestampNanos = timestampNanos; mFrame = frame; - mLastVsyncEventData = vsyncEventData; + mLastVsyncEventData.copyFrom(vsyncEventData); Message msg = Message.obtain(mHandler, this); msg.setAsynchronous(true); mHandler.sendMessageAtTime(msg, timestampNanos / TimeUtils.NANOS_PER_MS); diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java index b4675e0127de5..205094a8e41ba 100644 --- a/core/java/android/view/DisplayEventReceiver.java +++ b/core/java/android/view/DisplayEventReceiver.java @@ -164,6 +164,12 @@ public abstract class DisplayEventReceiver { this.deadline = deadline; } + void copyFrom(FrameTimeline other) { + vsyncId = other.vsyncId; + expectedPresentationTime = other.expectedPresentationTime; + deadline = other.deadline; + } + // The frame timeline vsync id, used to correlate a frame // produced by HWUI with the timeline data stored in Surface Flinger. public long vsyncId = FrameInfo.INVALID_VSYNC_ID; @@ -203,6 +209,14 @@ public abstract class DisplayEventReceiver { this.frameInterval = frameInterval; } + void copyFrom(VsyncEventData other) { + preferredFrameTimelineIndex = other.preferredFrameTimelineIndex; + frameInterval = other.frameInterval; + for (int i = 0; i < frameTimelines.length; i++) { + frameTimelines[i].copyFrom(other.frameTimelines[i]); + } + } + public FrameTimeline preferredFrameTimeline() { return frameTimelines[preferredFrameTimelineIndex]; }