summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2011-10-18 17:36:28 -0700
committerMathias Agopian <mathias@google.com>2011-10-18 17:39:09 -0700
commit0d0fba4587df36846baa80463490befdcef38e98 (patch)
tree8f68cf2a3ea1fc88cfaca4eb4119b7a30dd50b47
parent9044ef05d542a4f99b4be7ecefbe5e676bd3ea7f (diff)
downloadframeworks_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.cpp12
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();
}