|
@@ -1457,6 +1457,7 @@ static void dispc_ovl_set_scaling_uv(enum omap_plane plane,
|
|
|
{
|
|
|
int scale_x = out_width != orig_width;
|
|
|
int scale_y = out_height != orig_height;
|
|
|
+ bool chroma_upscale = true;
|
|
|
|
|
|
if (!dss_has_feature(FEAT_HANDLE_UV_SEPARATE))
|
|
|
return;
|
|
@@ -1473,23 +1474,34 @@ static void dispc_ovl_set_scaling_uv(enum omap_plane plane,
|
|
|
|
|
|
switch (color_mode) {
|
|
|
case OMAP_DSS_COLOR_NV12:
|
|
|
- /* UV is subsampled by 2 vertically*/
|
|
|
- orig_height >>= 1;
|
|
|
- /* UV is subsampled by 2 horz.*/
|
|
|
- orig_width >>= 1;
|
|
|
+ if (chroma_upscale) {
|
|
|
+ /* UV is subsampled by 2 horizontally and vertically */
|
|
|
+ orig_height >>= 1;
|
|
|
+ orig_width >>= 1;
|
|
|
+ } else {
|
|
|
+ /* UV is downsampled by 2 horizontally and vertically */
|
|
|
+ orig_height <<= 1;
|
|
|
+ orig_width <<= 1;
|
|
|
+ }
|
|
|
+
|
|
|
break;
|
|
|
case OMAP_DSS_COLOR_YUV2:
|
|
|
case OMAP_DSS_COLOR_UYVY:
|
|
|
- /*For YUV422 with 90/270 rotation,
|
|
|
- *we don't upsample chroma
|
|
|
- */
|
|
|
+ /* For YUV422 with 90/270 rotation, we don't upsample chroma */
|
|
|
if (rotation == OMAP_DSS_ROT_0 ||
|
|
|
- rotation == OMAP_DSS_ROT_180)
|
|
|
- /* UV is subsampled by 2 hrz*/
|
|
|
- orig_width >>= 1;
|
|
|
+ rotation == OMAP_DSS_ROT_180) {
|
|
|
+ if (chroma_upscale)
|
|
|
+ /* UV is subsampled by 2 horizontally */
|
|
|
+ orig_width >>= 1;
|
|
|
+ else
|
|
|
+ /* UV is downsampled by 2 horizontally */
|
|
|
+ orig_width <<= 1;
|
|
|
+ }
|
|
|
+
|
|
|
/* must use FIR for YUV422 if rotated */
|
|
|
if (rotation != OMAP_DSS_ROT_0)
|
|
|
scale_x = scale_y = true;
|
|
|
+
|
|
|
break;
|
|
|
default:
|
|
|
BUG();
|