diff options
| author | 2023-08-25 16:48:08 +0000 | |
|---|---|---|
| committer | 2023-08-25 16:48:08 +0000 | |
| commit | 97c11a93d7045d4ec5f40bafb88e3b4d8a09ddd0 (patch) | |
| tree | a7a7446bac82f5c77432842b19e0af278647238f | |
| parent | 57b114f867401982abb299db0beaf34b0eec06d1 (diff) | |
| parent | 863f60cd218b3f0b96807147adc9d92494c21ff8 (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.java | 13 | ||||
| -rw-r--r-- | core/java/android/view/DisplayEventReceiver.java | 14 |
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]; |