hwc: Implement idle-fallback for videos

In case of videos, do a fallback using 2 pipes per mixer at most.
This redraw will happen only once to reduce pipes from at most 4
to at most 2 and never draw again until there is an update.

Change-Id: I78c0dc2af4e3bd7e9128994e507e777187b4e247
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index b88674f..22d9042 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -366,11 +366,7 @@
         ctx->isPaddingRound = false;
         ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__);
         ret = false;
-    } else if(sIdleFallBack) {
-        ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__);
-        ret = false;
     }
-
     return ret;
 }
 
@@ -381,6 +377,11 @@
 
     const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
 
+    if(sIdleFallBack) {
+        ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy);
+        return false;
+    }
+
     if(mDpy > HWC_DISPLAY_PRIMARY){
         ALOGD_IF(isDebug(), "%s: Cannot support External display(s)",
                  __FUNCTION__);
@@ -856,7 +857,7 @@
     }
 
     /* reset Invalidator */
-    if(idleInvalidator && mCurrentFrame.mdpCount)
+    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
         idleInvalidator->markForSleep();
 
     overlay::Overlay& ov = *ctx->mOverlay;
@@ -1024,7 +1025,7 @@
     }
 
     /* reset Invalidator */
-    if(idleInvalidator && mCurrentFrame.mdpCount)
+    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
         idleInvalidator->markForSleep();
 
     overlay::Overlay& ov = *ctx->mOverlay;