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);