diff options
author | Mathias Agopian <mathias@google.com> | 2011-10-18 17:36:28 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2011-10-18 17:39:09 -0700 |
commit | 0d0fba4587df36846baa80463490befdcef38e98 (patch) | |
tree | 8f68cf2a3ea1fc88cfaca4eb4119b7a30dd50b47 | |
parent | 9044ef05d542a4f99b4be7ecefbe5e676bd3ea7f (diff) | |
download | frameworks_base-0d0fba4587df36846baa80463490befdcef38e98.zip frameworks_base-0d0fba4587df36846baa80463490befdcef38e98.tar.gz frameworks_base-0d0fba4587df36846baa80463490befdcef38e98.tar.bz2 |
Don't call hwc set() if there is nothing new to do
there was situations where SF's main loop would run (as if there was
an invalidate), but the dirty region was empty (so no new buffers
were retired). In this case we return early and don't swap, which
would cause drawing artifacts.
Bug: 5476838
Change-Id: Id3b7bf4b7aabec7919c50d9278eb2165973a4c3d
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 3c48b7e..595ec1e 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -445,6 +445,11 @@ bool SurfaceFlinger::threadLoop() // post surfaces (if needed) handlePageFlip(); + if (mDirtyRegion.isEmpty()) { + // nothing new to do. + return true; + } + if (UNLIKELY(mHwWorkListDirty)) { // build the h/w work list handleWorkList(); @@ -478,6 +483,9 @@ bool SurfaceFlinger::threadLoop() void SurfaceFlinger::postFramebuffer() { + // this should never happen. we do the flip anyways so we don't + // risk to cause a deadlock with hwc + LOGW_IF(mSwapRegion.isEmpty(), "mSwapRegion is empty"); const DisplayHardware& hw(graphicPlane(0).displayHardware()); const nsecs_t now = systemTime(); mDebugInSwapBuffers = now; @@ -938,7 +946,7 @@ void SurfaceFlinger::setupHardwareComposer(Region& dirtyInOut) // data. // // Also we want to make sure to not clear areas that belong to - // layers above that won't redraw (we would just erasing them), + // layers above that won't redraw (we would just be erasing them), // that is, we can't erase anything outside the dirty region. Region transparent; @@ -1769,7 +1777,7 @@ status_t SurfaceFlinger::onTransact( void SurfaceFlinger::repaintEverything() { Mutex::Autolock _l(mStateLock); const DisplayHardware& hw(graphicPlane(0).displayHardware()); - mDirtyRegion.set(hw.bounds()); // careful that's not thread-safe + mDirtyRegion.set(hw.bounds()); signalEvent(); } |