diff options
author | Jesse Hall <jessehall@google.com> | 2013-10-14 12:36:45 -0700 |
---|---|---|
committer | Jesse Hall <jessehall@google.com> | 2013-10-14 15:34:00 -0700 |
commit | 8e26b28be62e7c0e093900540db5e5cdcf52a0ff (patch) | |
tree | 65a66e24b58a3258e84c0d251d579bf47ac7fac3 /services/surfaceflinger/DisplayHardware | |
parent | 2d344979eb200b7fb8ba4d811a22c80b1d77b564 (diff) | |
download | frameworks_native-8e26b28be62e7c0e093900540db5e5cdcf52a0ff.zip frameworks_native-8e26b28be62e7c0e093900540db5e5cdcf52a0ff.tar.gz frameworks_native-8e26b28be62e7c0e093900540db5e5cdcf52a0ff.tar.bz2 |
Filter out vsync events from HWC with duplicate timestamps
Bug: 11220224
Change-Id: I4efe0b66ea8969bf0ec3c4fcb325d354c8a0c315
Diffstat (limited to 'services/surfaceflinger/DisplayHardware')
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWComposer.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 179d956..2469f0c 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -284,13 +284,27 @@ void HWComposer::invalidate() { void HWComposer::vsync(int disp, int64_t timestamp) { if (uint32_t(disp) < HWC_NUM_PHYSICAL_DISPLAY_TYPES) { + { + Mutex::Autolock _l(mLock); + + // There have been reports of HWCs that signal several vsync events + // with the same timestamp when turning the display off and on. This + // is a bug in the HWC implementation, but filter the extra events + // out here so they don't cause havoc downstream. + if (timestamp == mLastHwVSync[disp]) { + ALOGW("Ignoring duplicate VSYNC event from HWC (t=%lld)", + timestamp); + return; + } + + mLastHwVSync[disp] = timestamp; + } + char tag[16]; snprintf(tag, sizeof(tag), "HW_VSYNC_%1u", disp); ATRACE_INT(tag, ++mVSyncCounts[disp] & 1); mEventHandler.onVSyncReceived(disp, timestamp); - Mutex::Autolock _l(mLock); - mLastHwVSync[disp] = timestamp; } } |