hwc: Add needsScalingWithSplit for high resolution display.
- needsScaling does not check for scaling required in left & right
mixers when the crop values are sanitized. So it leads to issue
if DMA pipes are picked-up as high resolution layer does not need
scaling but left or right mixer configuration needs scaling after
the split.
- needsScalingWithSplit takes care of this with checking for the
sanitized cropped values.
Change-Id: I1f5b1952a59a84f5ccbaef123251b3c8cd46e4dd
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 7ec99c1..9751055 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -1163,7 +1163,7 @@
if(isYuvBuffer(hnd)) {
type = MDPCOMP_OV_VG;
- } else if(!qhwc::needsScaling(ctx, layer, mDpy)
+ } else if(!qhwc::needsScalingWithSplit(ctx, layer, mDpy)
&& Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
&& ctx->mMDP.version >= qdutils::MDSS_V5) {
type = MDPCOMP_OV_DMA;
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 5ea79b5..c55f314 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -608,6 +608,59 @@
return false;
}
+// Checks if layer needs scaling with split
+bool needsScalingWithSplit(hwc_context_t* ctx, hwc_layer_1_t const* layer,
+ const int& dpy) {
+
+ int src_width_l, src_height_l;
+ int src_width_r, src_height_r;
+ int dst_width_l, dst_height_l;
+ int dst_width_r, dst_height_r;
+ int hw_w = ctx->dpyAttr[dpy].xres;
+ int hw_h = ctx->dpyAttr[dpy].yres;
+ hwc_rect_t cropL, dstL, cropR, dstR;
+ const int lSplit = getLeftSplit(ctx, dpy);
+ hwc_rect_t sourceCrop = layer->sourceCrop;
+ hwc_rect_t displayFrame = layer->displayFrame;
+ private_handle_t *hnd = (private_handle_t *)layer->handle;
+ trimLayer(ctx, dpy, layer->transform, sourceCrop, displayFrame);
+
+ cropL = sourceCrop;
+ dstL = displayFrame;
+ hwc_rect_t scissorL = { 0, 0, lSplit, hw_h };
+ qhwc::calculate_crop_rects(cropL, dstL, scissorL, 0);
+
+ cropR = sourceCrop;
+ dstR = displayFrame;
+ hwc_rect_t scissorR = { lSplit, 0, hw_w, hw_h };
+ qhwc::calculate_crop_rects(cropR, dstR, scissorR, 0);
+
+ // Sanitize Crop to stitch
+ sanitizeSourceCrop(cropL, cropR, hnd);
+
+ // Calculate the left dst
+ dst_width_l = dstL.right - dstL.left;
+ dst_height_l = dstL.bottom - dstL.top;
+ src_width_l = cropL.right - cropL.left;
+ src_height_l = cropL.bottom - cropL.top;
+
+ // check if there is any scaling on the left
+ if(((src_width_l != dst_width_l) || (src_height_l != dst_height_l)))
+ return true;
+
+ // Calculate the right dst
+ dst_width_r = dstR.right - dstR.left;
+ dst_height_r = dstR.bottom - dstR.top;
+ src_width_r = cropR.right - cropR.left;
+ src_height_r = cropR.bottom - cropR.top;
+
+ // check if there is any scaling on the right
+ if(((src_width_r != dst_width_r) || (src_height_r != dst_height_r)))
+ return true;
+
+ return false;
+}
+
bool isAlphaScaled(hwc_context_t* ctx, hwc_layer_1_t const* layer,
const int& dpy) {
if(needsScaling(ctx, layer, dpy) && isAlphaPresent(layer)) {
@@ -1282,7 +1335,7 @@
}
//Helper to 1) Ensure crops dont have gaps 2) Ensure L and W are even
-static void sanitizeSourceCrop(hwc_rect_t& cropL, hwc_rect_t& cropR,
+void sanitizeSourceCrop(hwc_rect_t& cropL, hwc_rect_t& cropR,
private_handle_t *hnd) {
if(cropL.right - cropL.left) {
if(isYuvBuffer(hnd)) {
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index d77673b..71b1068 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -169,7 +169,12 @@
bool isSecuring(hwc_context_t* ctx, hwc_layer_1_t const* layer);
bool isSecureModePolicy(int mdpVersion);
bool isExternalActive(hwc_context_t* ctx);
-bool needsScaling(hwc_context_t* ctx, hwc_layer_1_t const* layer, const int& dpy);
+bool needsScaling(hwc_context_t* ctx, hwc_layer_1_t const* layer,
+ const int& dpy);
+bool needsScalingWithSplit(hwc_context_t* ctx, hwc_layer_1_t const* layer,
+ const int& dpy);
+void sanitizeSourceCrop(hwc_rect_t& cropL, hwc_rect_t& cropR,
+ private_handle_t *hnd);
bool isAlphaPresent(hwc_layer_1_t const* layer);
int hwc_vsync_control(hwc_context_t* ctx, int dpy, int enable);
int getBlending(int blending);