On Fri, Jun 17, 2016 at 05:13:10PM +0300, ville.syrjala at linux.intel.com wrote: > From: Ville Syrjälä <ville.syrjala at linux.intel.com> > > drm_plane_helper_check_update() needs to account for the plane rotation > for correct clipping/scaling calculations. Do so. > > There was an earlier attempt [1] to add this into > intel_check_primary_plane() but I requested that it'd be put into the > helper instead. An updated patch never materialized AFAICS, so I went > ahead and cooked one up myself. > > v2: Deal with new drm_plane_helper_check_update() callers > > [1] https://patchwork.freedesktop.org/patch/65177/ > Cc: Nabendu Maiti <nabendu.bikash.maiti at intel.com> > Cc: Noralf Trønnes <noralf at tronnes.org> > Cc: CK Hu <ck.hu at mediatek.com> > Cc: Mark Yao <mark.yao at rock-chips.com> > Cc: Russell King <rmk+kernel at armlinux.org.uk> > Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com> > Reviewed-by: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>
Applied to drm-misc, thanks. -Daniel > --- > drivers/gpu/drm/armada/armada_overlay.c | 1 + > drivers/gpu/drm/drm_plane_helper.c | 28 ++++++++++++++++++---------- > drivers/gpu/drm/drm_simple_kms_helper.c | 1 + > drivers/gpu/drm/i915/intel_display.c | 2 ++ > drivers/gpu/drm/mediatek/mtk_drm_plane.c | 1 + > drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 1 + > include/drm/drm_plane_helper.h | 1 + > 7 files changed, 25 insertions(+), 10 deletions(-) > > diff --git a/drivers/gpu/drm/armada/armada_overlay.c > b/drivers/gpu/drm/armada/armada_overlay.c > index 148e8a42b2c6..1ee707ef6b8d 100644 > --- a/drivers/gpu/drm/armada/armada_overlay.c > +++ b/drivers/gpu/drm/armada/armada_overlay.c > @@ -121,6 +121,7 @@ armada_ovl_plane_update(struct drm_plane *plane, struct > drm_crtc *crtc, > int ret; > > ret = drm_plane_helper_check_update(plane, crtc, fb, &src, &dest, &clip, > + BIT(DRM_ROTATE_0), > 0, INT_MAX, true, false, &visible); > if (ret) > return ret; > diff --git a/drivers/gpu/drm/drm_plane_helper.c > b/drivers/gpu/drm/drm_plane_helper.c > index fc51306fe365..16c4a7bd7465 100644 > --- a/drivers/gpu/drm/drm_plane_helper.c > +++ b/drivers/gpu/drm/drm_plane_helper.c > @@ -115,6 +115,7 @@ static int get_connectors_for_crtc(struct drm_crtc *crtc, > * @src: source coordinates in 16.16 fixed point > * @dest: integer destination coordinates > * @clip: integer clipping coordinates > + * @rotation: plane rotation > * @min_scale: minimum @src:@dest scaling factor in 16.16 fixed point > * @max_scale: maximum @src:@dest scaling factor in 16.16 fixed point > * @can_position: is it legal to position the plane such that it > @@ -134,16 +135,17 @@ static int get_connectors_for_crtc(struct drm_crtc > *crtc, > * Zero if update appears valid, error code on failure > */ > int drm_plane_helper_check_update(struct drm_plane *plane, > - struct drm_crtc *crtc, > - struct drm_framebuffer *fb, > - struct drm_rect *src, > - struct drm_rect *dest, > - const struct drm_rect *clip, > - int min_scale, > - int max_scale, > - bool can_position, > - bool can_update_disabled, > - bool *visible) > + struct drm_crtc *crtc, > + struct drm_framebuffer *fb, > + struct drm_rect *src, > + struct drm_rect *dest, > + const struct drm_rect *clip, > + unsigned int rotation, > + int min_scale, > + int max_scale, > + bool can_position, > + bool can_update_disabled, > + bool *visible) > { > int hscale, vscale; > > @@ -163,6 +165,8 @@ int drm_plane_helper_check_update(struct drm_plane *plane, > return -EINVAL; > } > > + drm_rect_rotate(src, fb->width << 16, fb->height << 16, rotation); > + > /* Check scaling */ > hscale = drm_rect_calc_hscale(src, dest, min_scale, max_scale); > vscale = drm_rect_calc_vscale(src, dest, min_scale, max_scale); > @@ -174,6 +178,9 @@ int drm_plane_helper_check_update(struct drm_plane *plane, > } > > *visible = drm_rect_clip_scaled(src, dest, clip, hscale, vscale); > + > + drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, rotation); > + > if (!*visible) > /* > * Plane isn't visible; some drivers can handle this > @@ -267,6 +274,7 @@ int drm_primary_helper_update(struct drm_plane *plane, > struct drm_crtc *crtc, > > ret = drm_plane_helper_check_update(plane, crtc, fb, > &src, &dest, &clip, > + BIT(DRM_ROTATE_0), > DRM_PLANE_HELPER_NO_SCALING, > DRM_PLANE_HELPER_NO_SCALING, > false, false, &visible); > diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c > b/drivers/gpu/drm/drm_simple_kms_helper.c > index b2071d495ada..0db36d27e90b 100644 > --- a/drivers/gpu/drm/drm_simple_kms_helper.c > +++ b/drivers/gpu/drm/drm_simple_kms_helper.c > @@ -105,6 +105,7 @@ static int drm_simple_kms_plane_atomic_check(struct > drm_plane *plane, > ret = drm_plane_helper_check_update(plane, &pipe->crtc, > plane_state->fb, > &src, &dest, &clip, > + plane_state->rotation, > DRM_PLANE_HELPER_NO_SCALING, > DRM_PLANE_HELPER_NO_SCALING, > false, true, &visible); > diff --git a/drivers/gpu/drm/i915/intel_display.c > b/drivers/gpu/drm/i915/intel_display.c > index 8c6f4e2a2cb8..029456cfc57e 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -14184,6 +14184,7 @@ intel_check_primary_plane(struct drm_plane *plane, > > return drm_plane_helper_check_update(plane, crtc, fb, &state->src, > &state->dst, &state->clip, > + state->base.rotation, > min_scale, max_scale, > can_position, true, > &state->visible); > @@ -14375,6 +14376,7 @@ intel_check_cursor_plane(struct drm_plane *plane, > > ret = drm_plane_helper_check_update(plane, crtc, fb, &state->src, > &state->dst, &state->clip, > + state->base.rotation, > DRM_PLANE_HELPER_NO_SCALING, > DRM_PLANE_HELPER_NO_SCALING, > true, true, &state->visible); > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c > b/drivers/gpu/drm/mediatek/mtk_drm_plane.c > index 51bc8988fc26..3995765a90dc 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c > @@ -170,6 +170,7 @@ static int mtk_plane_atomic_check(struct drm_plane *plane, > > return drm_plane_helper_check_update(plane, state->crtc, fb, > &src, &dest, &clip, > + state->rotation, > DRM_PLANE_HELPER_NO_SCALING, > DRM_PLANE_HELPER_NO_SCALING, > true, true, &visible); > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > index 8cd840f602b7..6255e5bcd954 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > @@ -626,6 +626,7 @@ static int vop_plane_atomic_check(struct drm_plane *plane, > > ret = drm_plane_helper_check_update(plane, crtc, state->fb, > src, dest, &clip, > + state->rotation, > min_scale, > max_scale, > true, true, &visible); > diff --git a/include/drm/drm_plane_helper.h b/include/drm/drm_plane_helper.h > index 4421f3f4ca8d..0e0c3573cce0 100644 > --- a/include/drm/drm_plane_helper.h > +++ b/include/drm/drm_plane_helper.h > @@ -46,6 +46,7 @@ int drm_plane_helper_check_update(struct drm_plane *plane, > struct drm_rect *src, > struct drm_rect *dest, > const struct drm_rect *clip, > + unsigned int rotation, > int min_scale, > int max_scale, > bool can_position, > -- > 2.7.4 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch