Merge "hwc: Fallback to gpu comp when copybit cannot handle scaling"
diff --git a/libhwcomposer/hwc_copybit.cpp b/libhwcomposer/hwc_copybit.cpp
index 2104bff..bb1b032 100644
--- a/libhwcomposer/hwc_copybit.cpp
+++ b/libhwcomposer/hwc_copybit.cpp
@@ -170,11 +170,32 @@
// Following are MDP3 limitations for which we
// need to fallback to GPU composition:
// 1. Plane alpha is not supported by MDP3.
+ // 2. Scaling is within range
if (qdutils::MDPVersion::getInstance().getMDPVersion() < 400) {
for (int i = ctx->listStats[dpy].numAppLayers-1; i >= 0 ; i--) {
+ int dst_h, dst_w, src_h, src_w;
+ float dx, dy;
hwc_layer_1_t *layer = (hwc_layer_1_t *) &list->hwLayers[i];
if (layer->planeAlpha != 0xFF)
return true;
+
+ if (layer->transform & HAL_TRANSFORM_ROT_90) {
+ src_h = layer->sourceCrop.right - layer->sourceCrop.left;
+ src_w = layer->sourceCrop.bottom - layer->sourceCrop.top;
+ } else {
+ src_h = layer->sourceCrop.bottom - layer->sourceCrop.top;
+ src_w = layer->sourceCrop.right - layer->sourceCrop.left;
+ }
+ dst_h = layer->displayFrame.bottom - layer->displayFrame.top;
+ dst_w = layer->displayFrame.right - layer->displayFrame.left;
+
+ dx = (float)dst_w/src_w;
+ dy = (float)dst_h/src_h;
+ if (dx > MAX_SCALE_FACTOR || dx < MIN_SCALE_FACTOR)
+ return false;
+
+ if (dy > MAX_SCALE_FACTOR || dy < MIN_SCALE_FACTOR)
+ return false;
}
}
diff --git a/libhwcomposer/hwc_copybit.h b/libhwcomposer/hwc_copybit.h
index 8278ff3..fd5c939 100644
--- a/libhwcomposer/hwc_copybit.h
+++ b/libhwcomposer/hwc_copybit.h
@@ -22,6 +22,11 @@
#include "hwc_utils.h"
#define NUM_RENDER_BUFFERS 3
+//These scaling factors are specific for MDP3. Normally scaling factor
+//is only 4, but copybit will create temp buffer to let it run through
+//twice
+#define MAX_SCALE_FACTOR 16
+#define MIN_SCALE_FACTOR 0.0625
namespace qhwc {