summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLajos Molnar <lajos@ti.com>2012-02-29 15:24:49 +0530
committerJason Simmons <jsimmons@google.com>2012-10-22 15:23:02 -0700
commitf11c7bb8c6e7d0254eeaa4aadb8eae412580ac0e (patch)
treebe3d27c4902c708b87faed93bf948bd3fa482a8f
parent58aa32dc9d23875627e39f16831ffb471baf7890 (diff)
downloadomap4-aah-f11c7bb8c6e7d0254eeaa4aadb8eae412580ac0e.tar.gz
hwc: don't force upscaled NV12 layer to SGX when force_sgx is used
Let NV12 layer be rendered with overlay even when force_sgx is used, if it is upscaled by more than a configurable limit (default 2x). This will limit video twitching because of SGX limitations when scaling NV12 layer. Rebased from p-ics-mr1: 3eb31b9 hwc: Don't force upscaled NV12 layer to SGX when force_sgx is used. Change-Id: I114633447c2d54677dce45e047c5a121e200185f Signed-Off-By: Rajesh Vandanapu<rajeshv@ti.com> Signed-off-by: Lajos Molnar <lajos@ti.com> Signed-off-by: Tony Lofthouse <a0741364@ti.com> (cherry picked from commit 2b826707289cd0052357187311d8d7bc1d5572a5) Conflicts: hwc/hwc.c
-rw-r--r--hwc/hwc.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/hwc/hwc.c b/hwc/hwc.c
index 03d73e2..e6c63d0 100644
--- a/hwc/hwc.c
+++ b/hwc/hwc.c
@@ -171,6 +171,7 @@ struct omap4_hwc_device {
int flags_rgb_order;
int flags_nv12_only;
+ float upscaled_nv12_limit;
int on_tv; /* using a tv */
int force_sgx;
@@ -456,7 +457,26 @@ static int is_NV12(IMG_native_handle_t *handle)
}
}
-static int dockable(hwc_layer_1_t *layer)
+static int is_upscaled_NV12(omap4_hwc_device_t *hwc_dev, hwc_layer_t *layer)
+{
+ if (!layer)
+ return 0;
+
+ IMG_native_handle_t *handle = (IMG_native_handle_t *)layer->handle;
+ if (!is_NV12(handle))
+ return 0;
+
+ int w = WIDTH(layer->sourceCrop);
+ int h = HEIGHT(layer->sourceCrop);
+
+ if (layer->transform & HWC_TRANSFORM_ROT_90)
+ swap(w, h);
+
+ return (WIDTH(layer->displayFrame) >= w * hwc_dev->upscaled_nv12_limit ||
+ HEIGHT(layer->displayFrame) >= h * hwc_dev->upscaled_nv12_limit);
+}
+
+static int dockable(hwc_layer_t *layer)
{
IMG_native_handle_t *handle = (IMG_native_handle_t *)layer->handle;
@@ -1599,6 +1619,7 @@ static int omap4_hwc_prepare(struct hwc_composer_device_1 *dev, size_t numDispla
(!hwc_dev->force_sgx ||
/* render protected and dockable layers via DSS */
is_protected(layer) ||
+ is_upscaled_NV12(hwc_dev, layer) ||
(hwc_dev->ext.current.docking && hwc_dev->ext.current.enabled && dockable(layer))) &&
mem_used + mem1d(handle) < limits.tiler1d_slot_size &&
/* can't have a transparent overlay in the middle of the framebuffer stack */
@@ -2741,6 +2762,12 @@ static int omap4_hwc_device_open(const hw_module_t* module, const char* name,
}
}
+ property_get("persist.hwc.upscaled_nv12_limit", value, "2.");
+ sscanf(value, "%f", &hwc_dev->upscaled_nv12_limit);
+ if (hwc_dev->upscaled_nv12_limit < 0. || hwc_dev->upscaled_nv12_limit > 2048.) {
+ ALOGW("Invalid upscaled_nv12_limit (%s), setting to 2.", value);
+ hwc_dev->upscaled_nv12_limit = 2.;
+ }
done:
if (err && hwc_dev) {
if (hwc_dev->dsscomp_fd >= 0)