diff options
Diffstat (limited to '0005-drm-i915-Ensure-damage-clip-area-is-within-pipe-area.patch')
-rw-r--r-- | 0005-drm-i915-Ensure-damage-clip-area-is-within-pipe-area.patch | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/0005-drm-i915-Ensure-damage-clip-area-is-within-pipe-area.patch b/0005-drm-i915-Ensure-damage-clip-area-is-within-pipe-area.patch new file mode 100644 index 000000000000..16ed6035bcdf --- /dev/null +++ b/0005-drm-i915-Ensure-damage-clip-area-is-within-pipe-area.patch @@ -0,0 +1,121 @@ +From b7c36a998b8027386b5ea43ecff46057c83655cb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jouni=20H=C3=B6gander?= <jouni.hogander@intel.com> +Date: Fri, 13 May 2022 17:28:11 +0300 +Subject: [PATCH 5/6] drm/i915: Ensure damage clip area is within pipe area +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Current update area calculation is not handling situation where +e.g. cursor plane is fully or partially outside pipe area. + +Fix this by checking damage area against pipe_src area using +drm_rect_intersect. + +v2: Set x1 and x2 in damaged_area initialization +v3: Move drm_rect_intersect into clip_area_update +v4: draw_area -> pipe_src + +Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/5440 +Cc: José Roberto de Souza <jose.souza@intel.com> +Cc: Mika Kahola <mika.kahola@intel.com> + +Reviewed-by: José Roberto de Souza <jose.souza@intel.com> +Signed-off-by: Jouni Högander <jouni.hogander@intel.com> + +Backported to 5.18. +--- + drivers/gpu/drm/i915/display/intel_psr.c | 23 ++++++++++++++++------- + 1 file changed, 16 insertions(+), 7 deletions(-) + +diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c +index 43dc4a9bc702..cdc968d5c630 100644 +--- a/drivers/gpu/drm/i915/display/intel_psr.c ++++ b/drivers/gpu/drm/i915/display/intel_psr.c +@@ -1588,8 +1588,12 @@ static void psr2_man_trk_ctl_calc(struct intel_crtc_state *crtc_state, + } + + static void clip_area_update(struct drm_rect *overlap_damage_area, +- struct drm_rect *damage_area) ++ struct drm_rect *damage_area, ++ struct drm_rect *pipe_src) + { ++ if (!drm_rect_intersect(damage_area, pipe_src)) ++ return; ++ + if (overlap_damage_area->y1 == -1) { + overlap_damage_area->y1 = damage_area->y1; + overlap_damage_area->y2 = damage_area->y2; +@@ -1658,6 +1662,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, + struct drm_i915_private *dev_priv = to_i915(state->base.dev); + struct intel_crtc_state *crtc_state = intel_atomic_get_new_crtc_state(state, crtc); + struct drm_rect pipe_clip = { .x1 = 0, .y1 = -1, .x2 = INT_MAX, .y2 = -1 }; ++ struct drm_rect pipe_src = { .x1 = 0, .y1 = 0 }; + struct intel_plane_state *new_plane_state, *old_plane_state; + struct intel_plane *plane; + bool full_update = false; +@@ -1671,6 +1676,9 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, + goto skip_sel_fetch_set_loop; + } + ++ pipe_src.x2 = crtc_state->pipe_src_w; ++ pipe_src.y2 = crtc_state->pipe_src_h; ++ + /* + * Calculate minimal selective fetch area of each plane and calculate + * the pipe damaged area. +@@ -1679,7 +1687,8 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, + */ + for_each_oldnew_intel_plane_in_state(state, plane, old_plane_state, + new_plane_state, i) { +- struct drm_rect src, damaged_area = { .y1 = -1 }; ++ struct drm_rect src, damaged_area = { .x1 = 0, .y1 = -1, ++ .x2 = INT_MAX }; + struct drm_atomic_helper_damage_iter iter; + struct drm_rect clip; + +@@ -1706,20 +1715,20 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, + if (old_plane_state->uapi.visible) { + damaged_area.y1 = old_plane_state->uapi.dst.y1; + damaged_area.y2 = old_plane_state->uapi.dst.y2; +- clip_area_update(&pipe_clip, &damaged_area); ++ clip_area_update(&pipe_clip, &damaged_area, &pipe_src); + } + + if (new_plane_state->uapi.visible) { + damaged_area.y1 = new_plane_state->uapi.dst.y1; + damaged_area.y2 = new_plane_state->uapi.dst.y2; +- clip_area_update(&pipe_clip, &damaged_area); ++ clip_area_update(&pipe_clip, &damaged_area, &pipe_src); + } + continue; + } else if (new_plane_state->uapi.alpha != old_plane_state->uapi.alpha) { + /* If alpha changed mark the whole plane area as damaged */ + damaged_area.y1 = new_plane_state->uapi.dst.y1; + damaged_area.y2 = new_plane_state->uapi.dst.y2; +- clip_area_update(&pipe_clip, &damaged_area); ++ clip_area_update(&pipe_clip, &damaged_area, &pipe_src); + continue; + } + +@@ -1730,7 +1739,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, + &new_plane_state->uapi); + drm_atomic_for_each_plane_damage(&iter, &clip) { + if (drm_rect_intersect(&clip, &src)) +- clip_area_update(&damaged_area, &clip); ++ clip_area_update(&damaged_area, &clip, &pipe_src); + } + + if (damaged_area.y1 == -1) +@@ -1738,7 +1747,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, + + damaged_area.y1 += new_plane_state->uapi.dst.y1 - src.y1; + damaged_area.y2 += new_plane_state->uapi.dst.y1 - src.y1; +- clip_area_update(&pipe_clip, &damaged_area); ++ clip_area_update(&pipe_clip, &damaged_area, &pipe_src); + } + + /* +-- +2.37.1 + |