[automerger skipped] DO NOT MERGE - Merge TP1A.220624.021.A1 am: 7089b35a51 -s ours
am skip reason: Merged-In Id1a5f29f4ccf2996e37ec99014ce392599b6b725 with SHA-1 c1359ac51c is already in history
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/19610078
Change-Id: I57d04fd25d9e2094bd395c3dc71d85b4e9b0f087
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 6a17cd8..e9fbf6e 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1955,8 +1955,16 @@
const auto now = systemTime();
const auto vsyncPeriod = mScheduler->getDisplayStatInfo(now).vsyncPeriod;
const bool expectedPresentTimeIsTheNextVsync = mExpectedPresentTime - now <= vsyncPeriod;
- return expectedPresentTimeIsTheNextVsync ? mPreviousPresentFences[0]
- : mPreviousPresentFences[1];
+
+ size_t shift = 0;
+ if (!expectedPresentTimeIsTheNextVsync) {
+ shift = static_cast<size_t>((mExpectedPresentTime - now) / vsyncPeriod);
+ if (shift >= mPreviousPresentFences.size()) {
+ shift = mPreviousPresentFences.size() - 1;
+ }
+ }
+ ATRACE_FORMAT("previousFrameFence shift=%zu", shift);
+ return mPreviousPresentFences[shift];
}
bool SurfaceFlinger::previousFramePending(int graceTimeMs) {
@@ -2425,7 +2433,10 @@
glCompositionDoneFenceTime = FenceTime::NO_FENCE;
}
- mPreviousPresentFences[1] = mPreviousPresentFences[0];
+ for (size_t i = mPreviousPresentFences.size()-1; i >= 1; i--) {
+ mPreviousPresentFences[i] = mPreviousPresentFences[i-1];
+ }
+
mPreviousPresentFences[0].fence =
display ? getHwComposer().getPresentFence(display->getPhysicalId()) : Fence::NO_FENCE;
mPreviousPresentFences[0].fenceTime =
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index f14c755..46f0e6b 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -1224,7 +1224,8 @@
std::unordered_set<sp<Layer>, SpHash<Layer>> mLayersWithQueuedFrames;
// Tracks layers that need to update a display's dirty region.
std::vector<sp<Layer>> mLayersPendingRefresh;
- std::array<FenceWithFenceTime, 2> mPreviousPresentFences;
+ // size should be longest sf-duration / shortest vsync period and round up
+ std::array<FenceWithFenceTime, 5> mPreviousPresentFences; // currently consider 166hz.
// True if in the previous frame at least one layer was composed via the GPU.
bool mHadClientComposition = false;
// True if in the previous frame at least one layer was composed via HW Composer.