diff options
| author | Rachel Lee <rnlee@google.com> | 2022-03-03 12:41:45 -0800 |
|---|---|---|
| committer | Rachel Lee <rnlee@google.com> | 2022-03-15 17:14:35 -0700 |
| commit | 7065b5aed5a843410c486d7d9cfffa53b7a623c5 (patch) | |
| tree | b29b1dd3354262513bb4f7bec0bb1199917fcecb /core/java/android | |
| parent | 34435473c82c2d179b776b906fbcbc5793336197 (diff) | |
Use getLatestVsyncEventData for late frame.
Then the vsync ID will be valid.
Bug:205721584
Test: atest ChoreographerTest
Change-Id: I4098b40ef3e79af40d6accc300b410b17f759ad8
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/view/Choreographer.java | 42 | ||||
| -rw-r--r-- | core/java/android/view/DisplayEventReceiver.java | 8 |
2 files changed, 34 insertions, 16 deletions
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index 8e3cc34706fc..a521809eb940 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -779,7 +779,9 @@ public final class Choreographer { + "time to " + (lastFrameOffset * 0.000001f) + " ms in the past."); } frameTimeNanos = startNanos - lastFrameOffset; - frameData.setFrameTimeNanos(frameTimeNanos); + DisplayEventReceiver.VsyncEventData latestVsyncEventData = + mDisplayEventReceiver.getLatestVsyncEventData(); + frameData.updateFrameData(frameTimeNanos, latestVsyncEventData); } if (frameTimeNanos < mLastFrameTimeNanos) { @@ -877,7 +879,9 @@ public final class Choreographer { } frameTimeNanos = now - lastFrameOffset; mLastFrameTimeNanos = frameTimeNanos; - frameData.setFrameTimeNanos(frameTimeNanos); + DisplayEventReceiver.VsyncEventData latestVsyncEventData = + mDisplayEventReceiver.getLatestVsyncEventData(); + frameData.updateFrameData(frameTimeNanos, latestVsyncEventData); } } } @@ -1012,11 +1016,6 @@ public final class Choreographer { return mVsyncId; } - /** Sets the vsync ID. */ - void resetVsyncId() { - mVsyncId = FrameInfo.INVALID_VSYNC_ID; - } - /** * The time in {@link System#nanoTime()} timebase which this frame is expected to be * presented. @@ -1061,17 +1060,15 @@ public final class Choreographer { } private long mFrameTimeNanos; - private final FrameTimeline[] mFrameTimelines; - private final FrameTimeline mPreferredFrameTimeline; + private FrameTimeline[] mFrameTimelines; + private FrameTimeline mPreferredFrameTimeline; - void setFrameTimeNanos(long frameTimeNanos) { + void updateFrameData(long frameTimeNanos, + DisplayEventReceiver.VsyncEventData latestVsyncEventData) { mFrameTimeNanos = frameTimeNanos; - for (FrameTimeline ft : mFrameTimelines) { - // The ID is no longer valid because the frame time that was registered with the ID - // no longer matches. - // TODO(b/205721584): Ask SF for valid vsync information. - ft.resetVsyncId(); - } + mFrameTimelines = convertFrameTimelines(latestVsyncEventData); + mPreferredFrameTimeline = + mFrameTimelines[latestVsyncEventData.preferredFrameTimelineIndex]; } /** The time in nanoseconds when the frame started being rendered. */ @@ -1091,6 +1088,19 @@ public final class Choreographer { public FrameTimeline getPreferredFrameTimeline() { return mPreferredFrameTimeline; } + + private FrameTimeline[] convertFrameTimelines( + DisplayEventReceiver.VsyncEventData vsyncEventData) { + FrameTimeline[] frameTimelines = + new FrameTimeline[vsyncEventData.frameTimelines.length]; + for (int i = 0; i < vsyncEventData.frameTimelines.length; i++) { + DisplayEventReceiver.VsyncEventData.FrameTimeline frameTimeline = + vsyncEventData.frameTimelines[i]; + frameTimelines[i] = new FrameTimeline(frameTimeline.vsyncId, + frameTimeline.expectedPresentTime, frameTimeline.deadline); + } + return frameTimelines; + } } /** diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java index 774bab41fb9a..3a74b2ed63a7 100644 --- a/core/java/android/view/DisplayEventReceiver.java +++ b/core/java/android/view/DisplayEventReceiver.java @@ -84,6 +84,7 @@ public abstract class DisplayEventReceiver { private static native void nativeDispose(long receiverPtr); @FastNative private static native void nativeScheduleVsync(long receiverPtr); + private static native VsyncEventData nativeGetLatestVsyncEventData(long receiverPtr); /** * Creates a display event receiver. @@ -279,6 +280,13 @@ public abstract class DisplayEventReceiver { } } + /** + * Gets the latest vsync event data from surface flinger. + */ + VsyncEventData getLatestVsyncEventData() { + return nativeGetLatestVsyncEventData(mReceiverPtr); + } + // Called from native code. @SuppressWarnings("unused") private void dispatchVsync(long timestampNanos, long physicalDisplayId, int frame, |
