drm: Use original src rect while initializing damage iterator
authorJouni Högander <jouni.hogander@intel.com>
Tue, 23 Aug 2022 11:29:17 +0000 (14:29 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 13 Sep 2022 11:38:33 +0000 (14:38 +0300)
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>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220823112920.352563-2-jouni.hogander@intel.com
Reviewed-by: Mika Kahola <mika.kahola@intel.com>
drivers/gpu/drm/drm_damage_helper.c

index 937b699ac2a8f601c08e66308bcc12e69bb55d28..d8b2955e88fd0a606c37e74ed454f4a27874a26d 100644 (file)
@@ -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;