SF: Ignore PTS more than one second in the future

Some of this logic already existed, but when we optimized
SurfaceFlinger to avoid unnecessary wake-ups, we didn't carry the logic
over into the new readiness test. shouldPresentNow now returns true if
the timestamp is more than a second in the future (since it's likely a
bogus timestamp and should be ignored).

Bug: 21932760
Change-Id: Ib50970a4eb621588c0b60766c8d8d1a8bddf853b
This commit is contained in:
Dan Stoza 2015-07-06 12:56:50 -07:00
parent 56105b2f72
commit 0eb2d39866
1 changed files with 13 additions and 2 deletions

View File

@ -1102,10 +1102,21 @@ void Layer::useEmptyDamage() {
bool Layer::shouldPresentNow(const DispSync& dispSync) const {
Mutex::Autolock lock(mQueueItemLock);
if (mQueueItems.empty()) {
return false;
}
auto timestamp = mQueueItems[0].mTimestamp;
nsecs_t expectedPresent =
mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
return mQueueItems.empty() ?
false : mQueueItems[0].mTimestamp < expectedPresent;
// Ignore timestamps more than a second in the future
bool isPlausible = timestamp < (expectedPresent + s2ns(1));
ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
"relative to expectedPresent %" PRId64, mName.string(), timestamp,
expectedPresent);
bool isDue = timestamp < expectedPresent;
return isDue || !isPlausible;
}
bool Layer::onPreComposition() {