From b048cef231075a5e41d224b73fe11fec62f335b1 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Sat, 4 Feb 2012 15:44:04 -0800 Subject: [PATCH] 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 --- services/surfaceflinger/SurfaceFlinger.cpp | 39 ++++++++++------------ 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index ee37efb03..041d195c6 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -419,9 +419,7 @@ void SurfaceFlinger::onMessageReceived(int32_t what) // post surfaces (if needed) handlePageFlip(); - if (!mDirtyRegion.isEmpty()) { - signalRefresh(); - } + signalRefresh(); } break; case MessageQueue::REFRESH: { @@ -430,33 +428,32 @@ void SurfaceFlinger::onMessageReceived(int32_t what) 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;