summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@bootlin.com>2018-11-09 11:26:32 +0100
committerHoegeun Kwon <hoegeun.kwon@samsung.com>2019-04-09 16:29:03 +0900
commit78947467a6814a654f4ed8ce1032eb388c64f1b3 (patch)
tree099b1b771318d16f95bed1a3f35983e98610968f
parent85973109c48f8d90d5b74248cf5454edf906e746 (diff)
downloadlinux-rpi3-78947467a6814a654f4ed8ce1032eb388c64f1b3.tar.gz
linux-rpi3-78947467a6814a654f4ed8ce1032eb388c64f1b3.tar.bz2
linux-rpi3-78947467a6814a654f4ed8ce1032eb388c64f1b3.zip
drm/vc4: ->x_scaling[1] should never be set to VC4_SCALING_NONEsubmit/tizen/20190409.091246accepted/tizen/unified/20190410.061806
For the YUV conversion to work properly, ->x_scaling[1] should never be set to VC4_SCALING_NONE, but vc4_get_scaling_mode() might return VC4_SCALING_NONE if the horizontal scaling ratio exactly matches the horizontal subsampling factor. Add a test to turn VC4_SCALING_NONE into VC4_SCALING_PPF when that happens. The old ->x_scaling[0] adjustment is dropped as I couldn't find any mention to this constraint in the spec and it's proven to be unnecessary (I tested various multi-planar YUV formats with scaling disabled, and all of them worked fine without this adjustment). Fixes: fc04023fafec ("drm/vc4: Add support for YUV planes.") Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> Reviewed-by: Eric Anholt <eric@anholt.net> Link: https://patchwork.freedesktop.org/patch/msgid/20181109102633.32603-1-boris.brezillon@bootlin.com [hoegeun.kwon: cherry-pick mainline commit 0560054da5673 to fix the problem when none scaling of YUV format.] Signed-off-by: Hoegeun Kwon <hoegeun.kwon@samsung.com> Change-Id: I40abf400a6f5ed54c9f4940587a694175e589104
-rw-r--r--drivers/gpu/drm/vc4/vc4_plane.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
index 0d2b01ab7573..345db21a79ef 100644
--- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -315,12 +315,14 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
vc4_get_scaling_mode(vc4_state->src_h[1],
vc4_state->crtc_h);
- /* YUV conversion requires that horizontal scaling be enabled,
- * even on a plane that's otherwise 1:1. Looks like only PPF
- * works in that case, so let's pick that one.
+ /* YUV conversion requires that horizontal scaling be enabled
+ * on the UV plane even if vc4_get_scaling_mode() returned
+ * VC4_SCALING_NONE (which can happen when the down-scaling
+ * ratio is 0.5). Let's force it to VC4_SCALING_PPF in this
+ * case.
*/
- if (vc4_state->is_unity)
- vc4_state->x_scaling[0] = VC4_SCALING_PPF;
+ if (vc4_state->x_scaling[1] == VC4_SCALING_NONE)
+ vc4_state->x_scaling[1] = VC4_SCALING_PPF;
} else {
vc4_state->is_yuv = false;
vc4_state->x_scaling[1] = VC4_SCALING_NONE;