diff options
| author | 2022-02-24 02:20:22 +0000 | |
|---|---|---|
| committer | 2022-02-24 02:20:22 +0000 | |
| commit | 684882ad9522152c49ad4fb616adb84975cf8a8c (patch) | |
| tree | a2007572b8e069bd46da7abdf8e12b2d96f0be94 | |
| parent | 2d27fa1cef0291cccf11d18a0136ab653766c3b7 (diff) | |
| parent | 8e9269d2f697ae2c79f39de572c8e8a03e756c71 (diff) | |
Merge "SF: fix floating-point-exception in SurfaceFlinger::setCompositorTimingSnapped try 2" into tm-dev am: 8e9269d2f6
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/16988997
Change-Id: I73391658785e76f426defc97777cb48417977a2f
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index dc88793479..2cd34e9cb8 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2344,16 +2344,19 @@ void SurfaceFlinger::updateCompositorTiming(const DisplayStatInfo& stats, nsecs_ void SurfaceFlinger::setCompositorTimingSnapped(const DisplayStatInfo& stats, nsecs_t compositeToPresentLatency) { + // Avoid division by 0 by defaulting to 60Hz + const auto vsyncPeriod = stats.vsyncPeriod ?: (60_Hz).getPeriodNsecs(); + // Integer division and modulo round toward 0 not -inf, so we need to // treat negative and positive offsets differently. nsecs_t idealLatency = (mVsyncConfiguration->getCurrentConfigs().late.sfOffset > 0) - ? (stats.vsyncPeriod - - (mVsyncConfiguration->getCurrentConfigs().late.sfOffset % stats.vsyncPeriod)) - : ((-mVsyncConfiguration->getCurrentConfigs().late.sfOffset) % stats.vsyncPeriod); + ? (vsyncPeriod - + (mVsyncConfiguration->getCurrentConfigs().late.sfOffset % vsyncPeriod)) + : ((-mVsyncConfiguration->getCurrentConfigs().late.sfOffset) % vsyncPeriod); // Just in case mVsyncConfiguration->getCurrentConfigs().late.sf == -vsyncInterval. if (idealLatency <= 0) { - idealLatency = stats.vsyncPeriod; + idealLatency = vsyncPeriod; } // Snap the latency to a value that removes scheduling jitter from the @@ -2362,16 +2365,14 @@ void SurfaceFlinger::setCompositorTimingSnapped(const DisplayStatInfo& stats, // something (such as user input) to an accurate diasplay time. // Snapping also allows an app to precisely calculate // mVsyncConfiguration->getCurrentConfigs().late.sf with (presentLatency % interval). - const nsecs_t bias = stats.vsyncPeriod / 2; - const int64_t extraVsyncs = (stats.vsyncPeriod) > 0 ? - ((compositeToPresentLatency - idealLatency + bias) / stats.vsyncPeriod) : - 0; + const nsecs_t bias = vsyncPeriod / 2; + const int64_t extraVsyncs = ((compositeToPresentLatency - idealLatency + bias) / vsyncPeriod); const nsecs_t snappedCompositeToPresentLatency = - (extraVsyncs > 0) ? idealLatency + (extraVsyncs * stats.vsyncPeriod) : idealLatency; + (extraVsyncs > 0) ? idealLatency + (extraVsyncs * vsyncPeriod) : idealLatency; std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock); getBE().mCompositorTiming.deadline = stats.vsyncTime - idealLatency; - getBE().mCompositorTiming.interval = stats.vsyncPeriod; + getBE().mCompositorTiming.interval = vsyncPeriod; getBE().mCompositorTiming.presentLatency = snappedCompositeToPresentLatency; } |