diff options
author | Lajos Molnar <lajos@ti.com> | 2012-02-29 15:24:49 +0530 |
---|---|---|
committer | Jason Simmons <jsimmons@google.com> | 2012-10-22 15:23:02 -0700 |
commit | f11c7bb8c6e7d0254eeaa4aadb8eae412580ac0e (patch) | |
tree | be3d27c4902c708b87faed93bf948bd3fa482a8f | |
parent | 58aa32dc9d23875627e39f16831ffb471baf7890 (diff) | |
download | omap4-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.c | 29 |
1 files changed, 28 insertions, 1 deletions
@@ -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) |