hwc: Perform MDP downscaling for WFD/HDMI Scenario
On WFD/HDMI connection, if the configured resolution is less than
Primary Resolution, Display HAL does the following:
1. sends hpd notification to SF with primary resolution.
2. configures MDP pipes with configured Resolution.
This is done to improve UI quality as MDP has better downscale
filter options compared to GPU.
This works only for QCOM WFD proprietary solution.
Change-Id: Ic20e837bf02c0f7b6718946e70b936f3a469fa7c
diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp
index b5ac2b8..7c2e643 100644
--- a/libhwcomposer/hwc_fbupdate.cpp
+++ b/libhwcomposer/hwc_fbupdate.cpp
@@ -26,10 +26,12 @@
#include "hwc_fbupdate.h"
#include "mdp_version.h"
#include "external.h"
+#include "virtual.h"
using namespace qdutils;
using namespace overlay;
using overlay::Rotator;
+using namespace overlay::utils;
namespace qhwc {
@@ -118,27 +120,32 @@
// 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;
displayFrame = sourceCrop;
- } else if((!mDpy || (mDpy && !ctx->mExtOrientation))
- && extOnlyLayerIndex == -1) {
+ } else if((!mDpy ||
+ (mDpy && !ctx->mExtOrientation
+ && !ctx->dpyAttr[mDpy].mDownScaleMode))
+ && (extOnlyLayerIndex == -1)) {
if(!qdutils::MDPVersion::getInstance().is8x26()) {
getNonWormholeRegion(list, sourceCrop);
displayFrame = sourceCrop;
}
}
-
if(mDpy && !qdutils::MDPVersion::getInstance().is8x26()) {
- if(ctx->mExtOrientation) {
- calcExtDisplayPosition(ctx, mDpy, displayFrame);
+ if(ctx->mExtOrientation || ctx->dpyAttr[mDpy].mDownScaleMode) {
+ calcExtDisplayPosition(ctx, mDpy, sourceCrop, displayFrame);
// If there is a external orientation set, use that
- transform = ctx->mExtOrientation;
- orient = static_cast<ovutils::eTransform >(ctx->mExtOrientation);
+ if(ctx->mExtOrientation) {
+ transform = ctx->mExtOrientation;
+ orient =
+ static_cast<ovutils::eTransform >(ctx->mExtOrientation);
+ }
}
// Calculate the actionsafe dimensions for External(dpy = 1 or 2)
getActionSafePosition(ctx, mDpy, displayFrame);
- }
+ }
setMdpFlags(layer, mdpFlags, 0, transform);
// For External use rotator if there is a rotation value set
if(mDpy && (ctx->mExtOrientation & HWC_TRANSFORM_ROT_90)) {