drm/i915/psr: Fix intel_psr2_sel_fetch_et_alignment usage
authorJouni Högander <jouni.hogander@intel.com>
Tue, 19 Mar 2024 12:33:25 +0000 (14:33 +0200)
committerJouni Högander <jouni.hogander@intel.com>
Thu, 28 Mar 2024 13:15:35 +0000 (15:15 +0200)
Currently we are not aligning selective update area to cover cursor fully
when cursor is not updated by itself but still in the selective update
area. Fix this by checking cursor separately after
drm_atomic_add_affected_planes.

Bspec: 68927

Fixes: 1bff93b8bc27 ("drm/i915/psr: Extend SU area to cover cursor fully if needed")
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
Reviewed-by: Mika Kahola <mika.kahola@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240319123327.1661097-4-jouni.hogander@intel.com
drivers/gpu/drm/i915/display/intel_psr.c

index 3198cec15fc1b387fbc736f0ca128c3a96f03e64..747abcb51debb37eb76b2066b94a48439ee4ab99 100644 (file)
@@ -2137,21 +2137,36 @@ static void intel_psr2_sel_fetch_pipe_alignment(struct intel_crtc_state *crtc_st
  * cursor fully when cursor is in SU area.
  */
 static void
-intel_psr2_sel_fetch_et_alignment(struct intel_crtc_state *crtc_state,
-                                 struct intel_plane_state *cursor_state)
+intel_psr2_sel_fetch_et_alignment(struct intel_atomic_state *state,
+                                 struct intel_crtc *crtc)
 {
-       struct drm_rect inter;
+       struct intel_crtc_state *crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
+       struct intel_plane_state *new_plane_state;
+       struct intel_plane *plane;
+       int i;
 
-       if (!crtc_state->enable_psr2_su_region_et ||
-           !cursor_state->uapi.visible)
+       if (!crtc_state->enable_psr2_su_region_et)
                return;
 
-       inter = crtc_state->psr2_su_area;
-       if (!drm_rect_intersect(&inter, &cursor_state->uapi.dst))
-               return;
+       for_each_new_intel_plane_in_state(state, plane, new_plane_state, i) {
+               struct drm_rect inter;
 
-       clip_area_update(&crtc_state->psr2_su_area, &cursor_state->uapi.dst,
-                        &crtc_state->pipe_src);
+               if (new_plane_state->uapi.crtc != crtc_state->uapi.crtc)
+                       continue;
+
+               if (plane->id != PLANE_CURSOR)
+                       continue;
+
+               if (!new_plane_state->uapi.visible)
+                       continue;
+
+               inter = crtc_state->psr2_su_area;
+               if (!drm_rect_intersect(&inter, &new_plane_state->uapi.dst))
+                       continue;
+
+               clip_area_update(&crtc_state->psr2_su_area, &new_plane_state->uapi.dst,
+                                &crtc_state->pipe_src);
+       }
 }
 
 /*
@@ -2194,8 +2209,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 intel_plane_state *new_plane_state, *old_plane_state,
-               *cursor_plane_state = NULL;
+       struct intel_plane_state *new_plane_state, *old_plane_state;
        struct intel_plane *plane;
        bool full_update = false;
        int i, ret;
@@ -2280,13 +2294,6 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
                damaged_area.x2 += new_plane_state->uapi.dst.x1 - src.x1;
 
                clip_area_update(&crtc_state->psr2_su_area, &damaged_area, &crtc_state->pipe_src);
-
-               /*
-                * Cursor plane new state is stored to adjust su area to cover
-                * cursor are fully.
-                */
-               if (plane->id == PLANE_CURSOR)
-                       cursor_plane_state = new_plane_state;
        }
 
        /*
@@ -2315,9 +2322,13 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
        if (ret)
                return ret;
 
-       /* Adjust su area to cover cursor fully as necessary */
-       if (cursor_plane_state)
-               intel_psr2_sel_fetch_et_alignment(crtc_state, cursor_plane_state);
+       /*
+        * Adjust su area to cover cursor fully as necessary (early
+        * transport). This needs to be done after
+        * drm_atomic_add_affected_planes to ensure visible cursor is added into
+        * affected planes even when cursor is not updated by itself.
+        */
+       intel_psr2_sel_fetch_et_alignment(state, crtc);
 
        intel_psr2_sel_fetch_pipe_alignment(crtc_state);