Merge "hwc: Manipulate external display position for split and src split"
diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp
index 7a2ff09..7d00d9c 100644
--- a/libhwcomposer/hwc_fbupdate.cpp
+++ b/libhwcomposer/hwc_fbupdate.cpp
@@ -290,9 +290,38 @@
         const int lSplit = getLeftSplit(ctx, mDpy);
         mDestLeft = ovutils::OV_INVALID;
         mDestRight = ovutils::OV_INVALID;
+        hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf);
+        hwc_rect_t displayFrame = layer->displayFrame;
 
-        hwc_rect_t sourceCrop = fbUpdatingRect;
-        hwc_rect_t displayFrame = fbUpdatingRect;
+        // No FB update optimization on (1) Custom FB resolution,
+        // (2) External Mirror mode, (3) External orientation
+        if(!ctx->dpyAttr[mDpy].customFBSize && !ctx->mBufferMirrorMode
+           && !ctx->mExtOrientation) {
+            sourceCrop = fbUpdatingRect;
+            displayFrame = fbUpdatingRect;
+        }
+
+        int transform = layer->transform;
+        // use ext orientation if any
+        int extOrient = getExtOrientation(ctx);
+
+        // Do not use getNonWormholeRegion() function to calculate the
+        // sourceCrop during animation on external display and
+        // Dont do wormhole calculation when extorientation is set on External
+        // Dont do wormhole calculation when extDownscale is enabled on External
+        if(ctx->listStats[mDpy].isDisplayAnimating && mDpy) {
+            sourceCrop = layer->displayFrame;
+        } else if((mDpy && !extOrient
+                  && !ctx->dpyAttr[mDpy].mDownScaleMode)) {
+            if(!qdutils::MDPVersion::getInstance().is8x26() &&
+                !ctx->dpyAttr[mDpy].customFBSize) {
+                getNonWormholeRegion(list, sourceCrop);
+                displayFrame = sourceCrop;
+            }
+        }
+
+        calcExtDisplayPosition(ctx, NULL, mDpy, sourceCrop, displayFrame,
+                                   transform, orient);
 
         ret = true;
         Overlay::PipeSpecs pipeSpecs;
@@ -425,12 +454,44 @@
             (ovutils::eBlending)
             getBlending(layer->blending));
 
+    hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf);
+    hwc_rect_t displayFrame = layer->displayFrame;
+
+    // No FB update optimization on (1) Custom FB resolution,
+    // (2) External Mirror mode, (3) External orientation
+    if(!ctx->dpyAttr[mDpy].customFBSize && !ctx->mBufferMirrorMode
+       && !ctx->mExtOrientation) {
+        sourceCrop = fbUpdatingRect;
+        displayFrame = fbUpdatingRect;
+    }
     int transform = layer->transform;
     ovutils::eTransform orient =
             static_cast<ovutils::eTransform>(transform);
 
-    hwc_rect_t cropL = fbUpdatingRect;
-    hwc_rect_t cropR = fbUpdatingRect;
+    // use ext orientation if any
+    int extOrient = getExtOrientation(ctx);
+
+    // Do not use getNonWormholeRegion() function to calculate the
+    // sourceCrop during animation on external display and
+    // Dont do wormhole calculation when extorientation is set on External
+    // Dont do wormhole calculation when extDownscale is enabled on External
+    if(ctx->listStats[mDpy].isDisplayAnimating && mDpy) {
+        sourceCrop = layer->displayFrame;
+    } else if((mDpy && !extOrient
+              && !ctx->dpyAttr[mDpy].mDownScaleMode)) {
+        if(!qdutils::MDPVersion::getInstance().is8x26() &&
+            !ctx->dpyAttr[mDpy].customFBSize) {
+            getNonWormholeRegion(list, sourceCrop);
+            displayFrame = sourceCrop;
+        }
+    }
+
+    calcExtDisplayPosition(ctx, NULL, mDpy, sourceCrop, displayFrame,
+                               transform, orient);
+    hwc_rect_t cropL = sourceCrop;
+    hwc_rect_t cropR = sourceCrop;
+    hwc_rect_t dstL = displayFrame;
+    hwc_rect_t dstR = displayFrame;
 
     //Request left pipe (or 1 by default)
     Overlay::PipeSpecs pipeSpecs;
@@ -457,7 +518,7 @@
     bool primarySplitAlways = (mDpy == HWC_DISPLAY_PRIMARY) and
             qdutils::MDPVersion::getInstance().isSrcSplitAlways();
 
-    if(((fbUpdatingRect.right - fbUpdatingRect.left) >
+    if(((sourceCrop.right - sourceCrop.left) >
             (int)qdutils::MDPVersion::getInstance().getMaxMixerWidth()) or
             primarySplitAlways) {
         destR = ov.getPipe(pipeSpecs);
@@ -472,8 +533,10 @@
         }
 
         //Split crop equally when using 2 pipes
-        cropL.right = (fbUpdatingRect.right + fbUpdatingRect.left) / 2;
+        cropL.right = (sourceCrop.right + sourceCrop.left) / 2;
         cropR.left = cropL.right;
+        dstL.right = (displayFrame.right + displayFrame.left) / 2;
+        dstR.left = dstL.right;
     }
 
     mDestLeft = destL;
@@ -481,7 +544,7 @@
 
     if(destL != OV_INVALID) {
         if(configMdp(ctx->mOverlay, parg, orient,
-                    cropL, cropL, NULL /*metadata*/, destL) < 0) {
+                    cropL, dstL, NULL /*metadata*/, destL) < 0) {
             ALOGE("%s: commit failed for left mixer config", __FUNCTION__);
             return false;
         }
@@ -490,7 +553,7 @@
     //configure right pipe
     if(destR != OV_INVALID) {
         if(configMdp(ctx->mOverlay, parg, orient,
-                    cropR, cropR, NULL /*metadata*/, destR) < 0) {
+                    cropR, dstR, NULL /*metadata*/, destR) < 0) {
             ALOGE("%s: commit failed for right mixer config", __FUNCTION__);
             return false;
         }