aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJouni Högander <jouni.hogander@intel.com>2023-12-18 19:49:59 +0200
committerJouni Högander <jouni.hogander@intel.com>2024-01-09 15:39:57 +0200
commit1bff93b8bc27a18aa87752819bfda6f00bceb10e (patch)
treec0e2d4f62eb5d7f9292f8e629aaf09940e45839d
parentdrm: Add eDP 1.5 early transport definition (diff)
downloadwireguard-linux-1bff93b8bc27a18aa87752819bfda6f00bceb10e.tar.xz
wireguard-linux-1bff93b8bc27a18aa87752819bfda6f00bceb10e.zip
drm/i915/psr: Extend SU area to cover cursor fully if needed
In case early transport is enabled SU area needs to be extended to cover cursor area fully when cursor is in SU area. Bspec: 68927 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/20231218175004.52875-3-jouni.hogander@intel.com
-rw-r--r--drivers/gpu/drm/i915/display/intel_psr.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c
index 54120b45958b..d0495d09e3d7 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -2003,6 +2003,29 @@ static void intel_psr2_sel_fetch_pipe_alignment(const struct intel_crtc_state *c
}
/*
+ * When early transport is in use we need to extend SU area to cover
+ * 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,
+ struct drm_rect *pipe_clip)
+{
+ struct drm_rect inter;
+
+ if (!crtc_state->enable_psr2_su_region_et ||
+ !cursor_state->uapi.visible)
+ return;
+
+ inter = *pipe_clip;
+ if (!drm_rect_intersect(&inter, &cursor_state->uapi.dst))
+ return;
+
+ clip_area_update(pipe_clip, &cursor_state->uapi.dst,
+ &crtc_state->pipe_src);
+}
+
+/*
* TODO: Not clear how to handle planes with negative position,
* also planes are not updated if they have a negative X
* position so for now doing a full update in this cases
@@ -2043,7 +2066,8 @@ 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 intel_plane_state *new_plane_state, *old_plane_state;
+ struct intel_plane_state *new_plane_state, *old_plane_state,
+ *cursor_plane_state = NULL;
struct intel_plane *plane;
bool full_update = false;
int i, ret;
@@ -2123,6 +2147,13 @@ 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(&pipe_clip, &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;
}
/*
@@ -2151,6 +2182,11 @@ 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,
+ &pipe_clip);
+
intel_psr2_sel_fetch_pipe_alignment(crtc_state, &pipe_clip);
/*