summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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];