drm/i915: Ensure damage clip area is within pipe area
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> Signed-off-by: José Roberto de Souza <jose.souza@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220513142811.779331-3-jouni.hogander@intel.com
This commit is contained in:
parent
057a6a1936
commit
d6774b8c3c
@ -1618,8 +1618,12 @@ exit:
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user