|
@@ -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);
|