drm/i915/display/psr: Use drm damage helpers to calculate plane damaged area

drm_atomic_helper_damage_iter_init() + drm_atomic_for_each_plane_damage()
returns the full plane area in case no damaged area was set by
userspace or it was discarted by driver.

This is important to fix the rendering of userspace applications that
does frontbuffer rendering and notify driver about dirty areas but do
not set any dirty clips.

With this we don't need to worry about to check and mark the whole
area as damaged in page flips.

Another important change here is the move of
drm_atomic_add_affected_planes() call, it needs to called late
otherwise the area of all the planes would be added to pipe_clip and
not saving power.

Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
Reviewed-by: default avatarGwan-gyeong Mun <gwan-gyeong.mun@intel.com>
Signed-off-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210914212507.177511-4-jose.souza@intel.com
parent 1f3a11c3
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
*/ */
#include <drm/drm_atomic_helper.h> #include <drm/drm_atomic_helper.h>
#include <drm/drm_damage_helper.h>
#include "display/intel_dp.h" #include "display/intel_dp.h"
...@@ -1578,10 +1579,6 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, ...@@ -1578,10 +1579,6 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
if (!crtc_state->enable_psr2_sel_fetch) if (!crtc_state->enable_psr2_sel_fetch)
return 0; return 0;
ret = drm_atomic_add_affected_planes(&state->base, &crtc->base);
if (ret)
return ret;
/* /*
* Calculate minimal selective fetch area of each plane and calculate * Calculate minimal selective fetch area of each plane and calculate
* the pipe damaged area. * the pipe damaged area.
...@@ -1591,8 +1588,8 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, ...@@ -1591,8 +1588,8 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
for_each_oldnew_intel_plane_in_state(state, plane, old_plane_state, for_each_oldnew_intel_plane_in_state(state, plane, old_plane_state,
new_plane_state, i) { new_plane_state, i) {
struct drm_rect src, damaged_area = { .y1 = -1 }; struct drm_rect src, damaged_area = { .y1 = -1 };
struct drm_mode_rect *damaged_clips; struct drm_atomic_helper_damage_iter iter;
u32 num_clips, j; struct drm_rect clip;
if (new_plane_state->uapi.crtc != crtc_state->uapi.crtc) if (new_plane_state->uapi.crtc != crtc_state->uapi.crtc)
continue; continue;
...@@ -1612,8 +1609,6 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, ...@@ -1612,8 +1609,6 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
break; break;
} }
num_clips = drm_plane_get_damage_clips_count(&new_plane_state->uapi);
/* /*
* If visibility or plane moved, mark the whole plane area as * If visibility or plane moved, mark the whole plane area as
* damaged as it needs to be complete redraw in the new and old * damaged as it needs to be complete redraw in the new and old
...@@ -1637,14 +1632,8 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, ...@@ -1637,14 +1632,8 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
cursor_area_workaround(new_plane_state, &damaged_area, cursor_area_workaround(new_plane_state, &damaged_area,
&pipe_clip); &pipe_clip);
continue; continue;
} else if (new_plane_state->uapi.alpha != old_plane_state->uapi.alpha || } else if (new_plane_state->uapi.alpha != old_plane_state->uapi.alpha) {
(!num_clips && /* If alpha changed mark the whole plane area as damaged */
new_plane_state->uapi.fb != old_plane_state->uapi.fb)) {
/*
* If the plane don't have damaged areas but the
* framebuffer changed or alpha changed, mark the whole
* plane area as damaged.
*/
damaged_area.y1 = new_plane_state->uapi.dst.y1; damaged_area.y1 = new_plane_state->uapi.dst.y1;
damaged_area.y2 = new_plane_state->uapi.dst.y2; damaged_area.y2 = new_plane_state->uapi.dst.y2;
clip_area_update(&pipe_clip, &damaged_area); clip_area_update(&pipe_clip, &damaged_area);
...@@ -1652,15 +1641,11 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, ...@@ -1652,15 +1641,11 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
} }
drm_rect_fp_to_int(&src, &new_plane_state->uapi.src); drm_rect_fp_to_int(&src, &new_plane_state->uapi.src);
damaged_clips = drm_plane_get_damage_clips(&new_plane_state->uapi);
for (j = 0; j < num_clips; j++) { drm_atomic_helper_damage_iter_init(&iter,
struct drm_rect clip; &old_plane_state->uapi,
&new_plane_state->uapi);
clip.x1 = damaged_clips[j].x1; drm_atomic_for_each_plane_damage(&iter, &clip) {
clip.y1 = damaged_clips[j].y1;
clip.x2 = damaged_clips[j].x2;
clip.y2 = damaged_clips[j].y2;
if (drm_rect_intersect(&clip, &src)) if (drm_rect_intersect(&clip, &src))
clip_area_update(&damaged_area, &clip); clip_area_update(&damaged_area, &clip);
} }
...@@ -1676,6 +1661,10 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, ...@@ -1676,6 +1661,10 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
if (full_update) if (full_update)
goto skip_sel_fetch_set_loop; goto skip_sel_fetch_set_loop;
ret = drm_atomic_add_affected_planes(&state->base, &crtc->base);
if (ret)
return ret;
intel_psr2_sel_fetch_pipe_alignment(crtc_state, &pipe_clip); intel_psr2_sel_fetch_pipe_alignment(crtc_state, &pipe_clip);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment