fix UI freezes

In some situations SF would mark a window as "has a pending update"
but would never process that update because the window is not
visible (fully transparent, hidden by another window, etc...), this
window would then be "stuck" until some other window updated.

Change-Id: Ifa18a9aef3a53f2593b473556702688ae62d9503
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index ee37efb..041d195 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -419,9 +419,7 @@
             // post surfaces (if needed)
             handlePageFlip();
 
-            if (!mDirtyRegion.isEmpty()) {
-                signalRefresh();
-            }
+            signalRefresh();
         } break;
 
         case MessageQueue::REFRESH: {
@@ -430,33 +428,32 @@
             const DisplayHardware& hw(graphicPlane(0).displayHardware());
             handleRefresh();
 
-            if (!mDirtyRegion.isEmpty()) {
-                if (CC_UNLIKELY(mHwWorkListDirty)) {
-                    // build the h/w work list
-                    handleWorkList();
-                }
-                if (CC_LIKELY(hw.canDraw())) {
-                    // repaint the framebuffer (if needed)
-                    handleRepaint();
-                    // inform the h/w that we're done compositing
-                    hw.compositionComplete();
-                    postFramebuffer();
-                } else {
-                    // pretend we did the post
-                    hw.compositionComplete();
-                }
+            if (CC_UNLIKELY(mHwWorkListDirty)) {
+                // build the h/w work list
+                handleWorkList();
+            }
+            if (CC_LIKELY(hw.canDraw())) {
+                // repaint the framebuffer (if needed)
+                handleRepaint();
+                // inform the h/w that we're done compositing
+                hw.compositionComplete();
+                postFramebuffer();
             } else {
+                // pretend we did the post
                 hw.compositionComplete();
             }
+
         } break;
     }
 }
 
 void SurfaceFlinger::postFramebuffer()
 {
-    // this should never happen. we do the flip anyways so we don't
-    // risk to cause a deadlock with hwc
-    ALOGW_IF(mSwapRegion.isEmpty(), "mSwapRegion is empty");
+    // mSwapRegion can be empty here is some cases, for instance if a hidden
+    // or fully transparent window is updating.
+    // in that case, we need to flip anyways to not risk a deadlock with
+    // h/w composer.
+
     const DisplayHardware& hw(graphicPlane(0).displayHardware());
     const nsecs_t now = systemTime();
     mDebugInSwapBuffers = now;