summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Rachel Lee <rnlee@google.com> 2023-08-25 16:48:08 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-08-25 16:48:08 +0000
commit97c11a93d7045d4ec5f40bafb88e3b4d8a09ddd0 (patch)
treea7a7446bac82f5c77432842b19e0af278647238f
parent57b114f867401982abb299db0beaf34b0eec06d1 (diff)
parent863f60cd218b3f0b96807147adc9d92494c21ff8 (diff)
Merge changes from topic "cherrypicker-L38900000962607726:N28500001397100516" into udc-qpr-dev
* changes: Choreographer: Log instead of crash on frame late Set default frameTimelinesLength to 1 Throw exception when VsyncEventData null. Fix frame timelines length on USE_VSYNC = false
-rw-r--r--core/java/android/view/Choreographer.java13
-rw-r--r--core/java/android/view/DisplayEventReceiver.java14
2 files changed, 18 insertions, 9 deletions
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java
index 01779047a0cd..5127f05a03ab 100644
--- a/core/java/android/view/Choreographer.java
+++ b/core/java/android/view/Choreographer.java
@@ -1167,10 +1167,9 @@ public final class Choreographer {
*/
FrameTimeline update(
long frameTimeNanos, DisplayEventReceiver.VsyncEventData vsyncEventData) {
- if (vsyncEventData.frameTimelinesLength == 0) {
- throw new IllegalArgumentException(
- "Vsync event timelines length must be greater than 0");
- }
+ // Even if the frame timelines length is 0, continue with allocation for API
+ // FrameData.getFrameTimelines consistency. The 0 length frame timelines code path
+ // should only occur when USE_VSYNC property is false.
if (mFrameTimelines.length != vsyncEventData.frameTimelinesLength) {
allocateFrameTimelines(vsyncEventData.frameTimelinesLength);
}
@@ -1207,7 +1206,11 @@ public final class Choreographer {
if (newPreferredDeadline < minimumDeadline) {
DisplayEventReceiver.VsyncEventData latestVsyncEventData =
displayEventReceiver.getLatestVsyncEventData();
- update(frameTimeNanos, latestVsyncEventData);
+ if (latestVsyncEventData == null) {
+ Log.w(TAG, "Could not get latest VsyncEventData. Did SurfaceFlinger crash?");
+ } else {
+ update(frameTimeNanos, latestVsyncEventData);
+ }
} else {
update(frameTimeNanos, newPreferredIndex);
}
diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java
index 50246f600753..a46136a53e95 100644
--- a/core/java/android/view/DisplayEventReceiver.java
+++ b/core/java/android/view/DisplayEventReceiver.java
@@ -158,7 +158,11 @@ public abstract class DisplayEventReceiver {
static final int FRAME_TIMELINES_CAPACITY = 7;
public static class FrameTimeline {
- FrameTimeline() {}
+ FrameTimeline() {
+ // Some reasonable values (+10 ms) for default timestamps.
+ deadline = System.nanoTime() + 10_000_000;
+ expectedPresentationTime = deadline + 10_000_000;
+ }
// Called from native code.
@SuppressWarnings("unused")
@@ -179,11 +183,11 @@ public abstract class DisplayEventReceiver {
public long vsyncId = FrameInfo.INVALID_VSYNC_ID;
// The frame timestamp for when the frame is expected to be presented.
- public long expectedPresentationTime = Long.MAX_VALUE;
+ public long expectedPresentationTime;
// The frame deadline timestamp in {@link System#nanoTime()} timebase that it is
// allotted for the frame to be completed.
- public long deadline = Long.MAX_VALUE;
+ public long deadline;
}
/**
@@ -197,7 +201,9 @@ public abstract class DisplayEventReceiver {
public int preferredFrameTimelineIndex = 0;
- public int frameTimelinesLength = 0;
+ // The default FrameTimeline is a placeholder populated with invalid vsync ID and some
+ // reasonable timestamps.
+ public int frameTimelinesLength = 1;
VsyncEventData() {
frameTimelines = new FrameTimeline[FRAME_TIMELINES_CAPACITY];