summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorRachel Lee <rnlee@google.com>2022-03-03 12:41:45 -0800
committerRachel Lee <rnlee@google.com>2022-03-15 17:14:35 -0700
commit7065b5aed5a843410c486d7d9cfffa53b7a623c5 (patch)
treeb29b1dd3354262513bb4f7bec0bb1199917fcecb /core/java/android
parent34435473c82c2d179b776b906fbcbc5793336197 (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.java42
-rw-r--r--core/java/android/view/DisplayEventReceiver.java8
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,