h/q/d: Check for MDP upscale limitations
- Expose API to get maximum upscale value supported by MDP
- Check for MDP limitation before programming pipes
Change-Id: Id9faac54a7b3e393b6c4b60574e5e985b495bf59
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 9221b71..3d391ab 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -325,8 +325,8 @@
int crop_h = crop.bottom - crop.top;
int dst_w = dst.right - dst.left;
int dst_h = dst.bottom - dst.top;
- float w_dscale = ceilf((float)crop_w / (float)dst_w);
- float h_dscale = ceilf((float)crop_h / (float)dst_h);
+ float w_scale = ((float)crop_w / (float)dst_w);
+ float h_scale = ((float)crop_h / (float)dst_h);
/* Workaround for MDP HW limitation in DSI command mode panels where
* FPS will not go beyond 30 if buffers on RGB pipes are of width or height
@@ -337,9 +337,12 @@
if((crop_w < 5)||(crop_h < 5))
return false;
- if((w_dscale > 1.0f) || (h_dscale > 1.0f)) {
+ if((w_scale > 1.0f) || (h_scale > 1.0f)) {
const uint32_t downscale =
qdutils::MDPVersion::getInstance().getMaxMDPDownscale();
+ const float w_dscale = w_scale;
+ const float h_dscale = h_scale;
+
if(ctx->mMDP.version >= qdutils::MDSS_V5) {
/* Workaround for downscales larger than 4x.
* Will be removed once decimator block is enabled for MDSS
@@ -358,6 +361,16 @@
}
}
+ if((w_scale < 1.0f) || (h_scale < 1.0f)) {
+ const uint32_t upscale =
+ qdutils::MDPVersion::getInstance().getMaxMDPUpscale();
+ const float w_uscale = 1.0f / w_scale;
+ const float h_uscale = 1.0f / h_scale;
+
+ if(w_uscale > upscale || h_uscale > upscale)
+ return false;
+ }
+
return true;
}