Merge "hwc: Configure framebuffer before other layers."
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index 1f97db4..2158611 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -140,12 +140,12 @@
         hwc_layer_1_t *fbLayer = &list->hwLayers[last];
         if(fbLayer->handle) {
             setListStats(ctx, list, dpy);
-            int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list);
-            if(fbZOrder >= 0)
-                ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder);
-
+            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
+                const int fbZ = 0;
+                ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
+            }
             if (ctx->mMDP.version < qdutils::MDP_V4_0) {
-                if((fbZOrder >= 0) && ctx->mCopyBit[dpy])
+                if(ctx->mCopyBit[dpy])
                     ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
             }
         }
@@ -168,9 +168,10 @@
             if(fbLayer->handle) {
                 ctx->mExtDispConfiguring = false;
                 setListStats(ctx, list, dpy);
-                int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list);
-                if(fbZOrder >= 0)
-                    ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder);
+                if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
+                    const int fbZ = 0;
+                    ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
+                }
 
                 /* Temporarily commenting out C2D until we support partial
                    copybit composition for mixed mode MDP
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 2ab9491..0f34cd4 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -22,6 +22,7 @@
 #include "external.h"
 #include "qdMetaData.h"
 #include "mdp_version.h"
+#include "hwc_fbupdate.h"
 #include <overlayRotator.h>
 
 using namespace overlay;
@@ -137,6 +138,12 @@
     return true;
 }
 
+void MDPComp::reset(const int& numLayers, hwc_display_contents_1_t* list) {
+    mCurrentFrame.reset(numLayers);
+    mCachedFrame.cacheAll(list);
+    mCachedFrame.updateCounts(mCurrentFrame);
+}
+
 void MDPComp::timeout_handler(void *udata) {
     struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
 
@@ -748,7 +755,6 @@
 }
 
 int MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
-
     const int numLayers = ctx->listStats[mDpy].numAppLayers;
 
     { //LOCK SCOPE BEGIN
@@ -763,26 +769,33 @@
             mCachedFrame.updateCounts(mCurrentFrame);
             ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ",
                                     __FUNCTION__);
-            return 0;
+            return -1;
         }
 
         //Hard conditions, if not met, cannot do MDP comp
         if(!isFrameDoable(ctx)) {
             ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
                                     __FUNCTION__);
-            mCurrentFrame.reset(numLayers);
-            mCachedFrame.cacheAll(list);
-            mCachedFrame.updateCounts(mCurrentFrame);
-            return 0;
+            reset(numLayers, list);
+            return -1;
         }
 
         //Check whether layers marked for MDP Composition is actually doable.
         if(isFullFrameDoable(ctx, list)){
             mCurrentFrame.map();
+            //Configure framebuffer first if applicable
+            if(mCurrentFrame.fbZ >= 0) {
+                if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list,
+                        mCurrentFrame.fbZ)) {
+                    ALOGE("%s configure framebuffer failed", __func__);
+                    reset(numLayers, list);
+                    return -1;
+                }
+            }
             //Acquire and Program MDP pipes
             if(!programMDP(ctx, list)) {
-                mCurrentFrame.reset(numLayers);
-                mCachedFrame.cacheAll(list);
+                reset(numLayers, list);
+                return -1;
             } else { //Success
                 //Any change in composition types needs an FB refresh
                 mCurrentFrame.needsRedraw = false;
@@ -807,13 +820,22 @@
                 mCurrentFrame.fbZ = mCurrentFrame.mdpCount;
 
             mCurrentFrame.map();
+
+            //Configure framebuffer first if applicable
+            if(mCurrentFrame.fbZ >= 0) {
+                if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) {
+                    ALOGE("%s configure framebuffer failed", __func__);
+                    reset(numLayers, list);
+                    return -1;
+                }
+            }
             if(!programYUV(ctx, list)) {
-                mCurrentFrame.reset(numLayers);
-                mCachedFrame.cacheAll(list);
+                reset(numLayers, list);
+                return -1;
             }
         } else {
-            mCurrentFrame.reset(numLayers);
-            mCachedFrame.cacheAll(list);
+            reset(numLayers, list);
+            return -1;
         }
 
         //UpdateLayerFlags
@@ -829,7 +851,7 @@
         ALOGE("%s",sDump.string());
     }
 
-    return mCurrentFrame.fbZ;
+    return 0;
 }
 
 //=============MDPCompLowRes===================================================
diff --git a/libhwcomposer/hwc_mdpcomp.h b/libhwcomposer/hwc_mdpcomp.h
index ea7c7b1..cc4b76a 100644
--- a/libhwcomposer/hwc_mdpcomp.h
+++ b/libhwcomposer/hwc_mdpcomp.h
@@ -164,6 +164,7 @@
     void updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list);
     bool programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list);
     bool programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list);
+    void reset(const int& numAppLayers, hwc_display_contents_1_t* list);
 
     int mDpy;
     static bool sEnabled;
@@ -227,5 +228,6 @@
 
     virtual int pipesNeeded(hwc_context_t *ctx, hwc_display_contents_1_t* list);
 };
+
 }; //namespace
 #endif