hwc: Use correct z-order in video overlay

Set z-order of video layer to 0 and framebuffer to 1 in case
of video overlay composition so that the blending takes effect.
Also set is_fg OFF for framebuffer.

Change-Id: I05f930074d265d690f29a1003b7c28077df89bbf
CRs-fixed: 458180
diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp
index 7a740ee..5f524c7 100644
--- a/libhwcomposer/hwc_fbupdate.cpp
+++ b/libhwcomposer/hwc_fbupdate.cpp
@@ -21,6 +21,7 @@
 #define DEBUG_FBUPDATE 0
 #include <gralloc_priv.h>
 #include "hwc_fbupdate.h"
+#include "hwc_video.h"
 
 namespace qhwc {
 
@@ -82,11 +83,20 @@
         mDest = dest;
 
         ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE;
+        // If any of the layers has pre-multiplied alpha, set Pre multiplied
+        // Flag as the compositied output is alpha pre-multiplied.
+        if(ctx->listStats[mDpy].preMultipliedAlpha == true)
+               ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_BLEND_FG_PREMULT);
+
+        ovutils::eZorder z_order =
+              ctx->mVidOv[mDpy]->isModeOn()?ovutils::ZORDER_1:ovutils::ZORDER_0;
+        ovutils::eIsFg is_fg =
+           ctx->mVidOv[mDpy]->isModeOn()? ovutils::IS_FG_OFF:ovutils::IS_FG_SET;
 
         ovutils::PipeArgs parg(mdpFlags,
                 info,
-                ovutils::ZORDER_0,
-                ovutils::IS_FG_SET,
+                z_order,
+                is_fg,
                 ovutils::ROT_FLAGS_NONE);
         ov.setSource(parg, dest);
 
@@ -189,11 +199,20 @@
         mDestRight = destR;
 
         ovutils::eMdpFlags mdpFlagsL = ovutils::OV_MDP_FLAGS_NONE;
+        //If any layer has pre-multiplied alpha, set Pre multiplied
+        //Flag as the compositied output is alpha pre-multiplied.
+        if(ctx->listStats[mDpy].preMultipliedAlpha == true)
+            ovutils::setMdpFlags(mdpFlagsL, ovutils::OV_MDP_BLEND_FG_PREMULT);
+
+        ovutils::eZorder z_order =
+              ctx->mVidOv[mDpy]->isModeOn()?ovutils::ZORDER_1:ovutils::ZORDER_0;
+        ovutils::eIsFg is_fg =
+           ctx->mVidOv[mDpy]->isModeOn()? ovutils::IS_FG_OFF:ovutils::IS_FG_SET;
 
         ovutils::PipeArgs pargL(mdpFlagsL,
                 info,
-                ovutils::ZORDER_0,
-                ovutils::IS_FG_SET,
+                z_order,
+                is_fg,
                 ovutils::ROT_FLAGS_NONE);
         ov.setSource(pargL, destL);
 
@@ -201,8 +220,8 @@
         ovutils::setMdpFlags(mdpFlagsR, ovutils::OV_MDSS_MDP_RIGHT_MIXER);
         ovutils::PipeArgs pargR(mdpFlagsR,
                 info,
-                ovutils::ZORDER_0,
-                ovutils::IS_FG_SET,
+                z_order,
+                is_fg,
                 ovutils::ROT_FLAGS_NONE);
         ov.setSource(pargR, destR);
 
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 7444777..8764171 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -298,6 +298,7 @@
     ctx->listStats[dpy].fbLayerIndex = list->numHwLayers - 1;
     ctx->listStats[dpy].skipCount = 0;
     ctx->listStats[dpy].needsAlphaScale = false;
+    ctx->listStats[dpy].preMultipliedAlpha = false;
     ctx->listStats[dpy].yuvCount = 0;
 
     for (size_t i = 0; i < list->numHwLayers; i++) {
@@ -320,6 +321,8 @@
             if(layer->transform & HWC_TRANSFORM_ROT_90)
                 ctx->mNeedsRotator = true;
         }
+        if(layer->blending == HWC_BLENDING_PREMULT)
+            ctx->listStats[dpy].preMultipliedAlpha = true;
 
         if(!ctx->listStats[dpy].needsAlphaScale)
             ctx->listStats[dpy].needsAlphaScale = isAlphaScaled(layer);
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index 52069ba..bb602bc 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -94,6 +94,7 @@
     int yuvCount;
     int yuvIndices[MAX_NUM_LAYERS];
     bool needsAlphaScale;
+    bool preMultipliedAlpha;
 };
 
 struct LayerProp {
diff --git a/libhwcomposer/hwc_video.cpp b/libhwcomposer/hwc_video.cpp
index f09cc35..f95456b 100644
--- a/libhwcomposer/hwc_video.cpp
+++ b/libhwcomposer/hwc_video.cpp
@@ -132,7 +132,7 @@
 
     mDest = dest;
     ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE;
-    ovutils::eZorder zOrder = ovutils::ZORDER_1;
+    ovutils::eZorder zOrder = ovutils::ZORDER_0;
     ovutils::eIsFg isFg = ovutils::IS_FG_OFF;
     if (ctx->listStats[mDpy].numAppLayers == 1) {
         isFg = ovutils::IS_FG_SET;
@@ -176,6 +176,10 @@
     return true;
 }
 
+bool VideoOverlayLowRes::isModeOn() {
+    return mModeOn;
+}
+
 //===========VideoOverlayHighRes=========================
 
 VideoOverlayHighRes::VideoOverlayHighRes(const int& dpy): IVideoOverlay(dpy) {}
@@ -244,7 +248,7 @@
     }
 
     ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE;
-    ovutils::eZorder zOrder = ovutils::ZORDER_1;
+    ovutils::eZorder zOrder = ovutils::ZORDER_0;
     ovutils::eIsFg isFg = ovutils::IS_FG_OFF;
     if (ctx->listStats[mDpy].numAppLayers == 1) {
         isFg = ovutils::IS_FG_SET;
@@ -299,5 +303,8 @@
     return true;
 }
 
+bool VideoOverlayHighRes::isModeOn() {
+    return mModeOn;
+}
 
 }; //namespace qhwc
diff --git a/libhwcomposer/hwc_video.h b/libhwcomposer/hwc_video.h
index 4acde9d..80a47f1 100644
--- a/libhwcomposer/hwc_video.h
+++ b/libhwcomposer/hwc_video.h
@@ -40,8 +40,10 @@
     virtual bool draw(hwc_context_t *ctx,
             hwc_display_contents_1_t *list) = 0;
     virtual void reset() = 0;
+    virtual bool isModeOn() = 0;
     //Factory method that returns a low-res or high-res version
     static IVideoOverlay *getObject(const int& width, const int& dpy);
+
 protected:
     const int mDpy; // display to update
     bool mModeOn; // if prepare happened
@@ -55,6 +57,7 @@
     bool prepare(hwc_context_t *ctx, hwc_display_contents_1_t *list);
     bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
     void reset();
+    bool isModeOn();
 private:
     //Configures overlay for video prim and ext
     bool configure(hwc_context_t *ctx, hwc_layer_1_t *yuvlayer);
@@ -72,6 +75,7 @@
     bool prepare(hwc_context_t *ctx, hwc_display_contents_1_t *list);
     bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
     void reset();
+    bool isModeOn();
 private:
     //Configures overlay for video prim and ext
     bool configure(hwc_context_t *ctx, hwc_layer_1_t *yuvlayer);