diff options
author | Evgeny Myandin | 2022-08-17 20:19:47 +0300 |
---|---|---|
committer | Evgeny Myandin | 2022-08-17 20:19:47 +0300 |
commit | 7154d723cca4c9d4571fd59bc002008f14d774d6 (patch) | |
tree | 67ce13a0e65b5d888b07a0987118b7c1ef68a8b1 /0103-drm_i915_Ensure_damage_clip_area_is_within_pipe_area.patch | |
parent | 11c19a74a79b9a70edc588f1fc9060d69fedba6e (diff) | |
download | aur-7154d723cca4c9d4571fd59bc002008f14d774d6.tar.gz |
release kernel 5.19.2
Diffstat (limited to '0103-drm_i915_Ensure_damage_clip_area_is_within_pipe_area.patch')
-rw-r--r-- | 0103-drm_i915_Ensure_damage_clip_area_is_within_pipe_area.patch | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/0103-drm_i915_Ensure_damage_clip_area_is_within_pipe_area.patch b/0103-drm_i915_Ensure_damage_clip_area_is_within_pipe_area.patch new file mode 100644 index 000000000000..db3f5d3f11fb --- /dev/null +++ b/0103-drm_i915_Ensure_damage_clip_area_is_within_pipe_area.patch @@ -0,0 +1,102 @@ + From 89320fb4b95948723d00dd4d37aa12daa6ced89a 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] 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> +--- + 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 fecdaaeac39e08..36356893c7caf3 100644 +--- a/drivers/gpu/drm/i915/display/intel_psr.c ++++ b/drivers/gpu/drm/i915/display/intel_psr.c +@@ -1618,8 +1618,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; +@@ -1709,7 +1713,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; + +@@ -1736,20 +1741,23 @@ 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, ++ &crtc_state->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, ++ &crtc_state->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, ++ &crtc_state->pipe_src); + continue; + } + +@@ -1760,7 +1768,8 @@ 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, ++ &crtc_state->pipe_src); + } + + if (damaged_area.y1 == -1) +@@ -1768,7 +1777,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, &crtc_state->pipe_src); + } + + /* |