diff mbox series

[v2,1/4] drm: Use original src rect while initializing damage iterator

Message ID 20220823112920.352563-2-jouni.hogander@intel.com (mailing list archive)
State New, archived
Headers show
Series Fixes for damage clips handling | expand

Commit Message

Hogander, Jouni Aug. 23, 2022, 11:29 a.m. UTC
drm_plane_state->src might be modified by the driver. This is done
e.g. in i915 driver when there is bigger framebuffer than the plane
and there is some offset within framebuffer. I915 driver calculates
separate offset and adjusts src rect coords to be relative to this
offset. Damage clips are still relative to original src coords
provided by user-space.

This patch ensures original coordinates provided by user-space are
used when initiliazing damage iterator.

Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
 drivers/gpu/drm/drm_damage_helper.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

Comments

Kahola, Mika Sept. 2, 2022, 10:58 a.m. UTC | #1
> -----Original Message-----
> From: dri-devel <dri-devel-bounces@lists.freedesktop.org> On Behalf Of Jouni
> Högander
> Sent: Tuesday, August 23, 2022 2:29 PM
> To: dri-devel@lists.freedesktop.org; intel-gfx@lists.freedesktop.org
> Cc: Hogander, Jouni <jouni.hogander@intel.com>
> Subject: [PATCH v2 1/4] drm: Use original src rect while initializing damage
> iterator
> 
> drm_plane_state->src might be modified by the driver. This is done e.g. in i915
> driver when there is bigger framebuffer than the plane and there is some offset
> within framebuffer. I915 driver calculates separate offset and adjusts src rect
> coords to be relative to this offset. Damage clips are still relative to original src
> coords provided by user-space.
> 
> This patch ensures original coordinates provided by user-space are used when
> initiliazing damage iterator.
> 
Looks ok.

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
> ---
>  drivers/gpu/drm/drm_damage_helper.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_damage_helper.c
> b/drivers/gpu/drm/drm_damage_helper.c
> index 937b699ac2a8..d8b2955e88fd 100644
> --- a/drivers/gpu/drm/drm_damage_helper.c
> +++ b/drivers/gpu/drm/drm_damage_helper.c
> @@ -224,6 +224,7 @@ drm_atomic_helper_damage_iter_init(struct
> drm_atomic_helper_damage_iter *iter,
>  				   const struct drm_plane_state *old_state,
>  				   const struct drm_plane_state *state)  {
> +	struct drm_rect src;
>  	memset(iter, 0, sizeof(*iter));
> 
>  	if (!state || !state->crtc || !state->fb || !state->visible) @@ -233,10
> +234,12 @@ drm_atomic_helper_damage_iter_init(struct
> drm_atomic_helper_damage_iter *iter,
>  	iter->num_clips = drm_plane_get_damage_clips_count(state);
> 
>  	/* Round down for x1/y1 and round up for x2/y2 to catch all pixels */
> -	iter->plane_src.x1 = state->src.x1 >> 16;
> -	iter->plane_src.y1 = state->src.y1 >> 16;
> -	iter->plane_src.x2 = (state->src.x2 >> 16) + !!(state->src.x2 & 0xFFFF);
> -	iter->plane_src.y2 = (state->src.y2 >> 16) + !!(state->src.y2 & 0xFFFF);
> +	src = drm_plane_state_src(state);
> +
> +	iter->plane_src.x1 = src.x1 >> 16;
> +	iter->plane_src.y1 = src.y1 >> 16;
> +	iter->plane_src.x2 = (src.x2 >> 16) + !!(src.x2 & 0xFFFF);
> +	iter->plane_src.y2 = (src.y2 >> 16) + !!(src.y2 & 0xFFFF);
> 
>  	if (!iter->clips || !drm_rect_equals(&state->src, &old_state->src)) {
>  		iter->clips = NULL;
> --
> 2.34.1
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_damage_helper.c b/drivers/gpu/drm/drm_damage_helper.c
index 937b699ac2a8..d8b2955e88fd 100644
--- a/drivers/gpu/drm/drm_damage_helper.c
+++ b/drivers/gpu/drm/drm_damage_helper.c
@@ -224,6 +224,7 @@  drm_atomic_helper_damage_iter_init(struct drm_atomic_helper_damage_iter *iter,
 				   const struct drm_plane_state *old_state,
 				   const struct drm_plane_state *state)
 {
+	struct drm_rect src;
 	memset(iter, 0, sizeof(*iter));
 
 	if (!state || !state->crtc || !state->fb || !state->visible)
@@ -233,10 +234,12 @@  drm_atomic_helper_damage_iter_init(struct drm_atomic_helper_damage_iter *iter,
 	iter->num_clips = drm_plane_get_damage_clips_count(state);
 
 	/* Round down for x1/y1 and round up for x2/y2 to catch all pixels */
-	iter->plane_src.x1 = state->src.x1 >> 16;
-	iter->plane_src.y1 = state->src.y1 >> 16;
-	iter->plane_src.x2 = (state->src.x2 >> 16) + !!(state->src.x2 & 0xFFFF);
-	iter->plane_src.y2 = (state->src.y2 >> 16) + !!(state->src.y2 & 0xFFFF);
+	src = drm_plane_state_src(state);
+
+	iter->plane_src.x1 = src.x1 >> 16;
+	iter->plane_src.y1 = src.y1 >> 16;
+	iter->plane_src.x2 = (src.x2 >> 16) + !!(src.x2 & 0xFFFF);
+	iter->plane_src.y2 = (src.y2 >> 16) + !!(src.y2 & 0xFFFF);
 
 	if (!iter->clips || !drm_rect_equals(&state->src, &old_state->src)) {
 		iter->clips = NULL;