* [PATCH] drm/amd/display: Fix cursor disable with horizontally split planes @ 2026-08-31 7:28 Yuling Li 2026-08-31 16:26 ` Leo Li 0 siblings, 1 reply; 3+ messages in thread From: Yuling Li @ 2026-08-31 7:28 UTC (permalink / raw) To: amd-gfx; +Cc: Harry Wentland, Leo Li, Yuling Li From: Yuling Li <Yuling.Li@amd.com> [WHY] resource_can_pipe_disable_cursor() disables the hardware cursor on a pipe when a higher layer fully covers that pipe's recout, to avoid double-cursor and scaling artifacts. When merging pipe-split halves of the same overlay layer, the inner loop walks every pipe above the current one and looks for siblings sharing test_pipe's layer_index. Because test_pipe itself satisfies that condition, it can be treated as its own split partner. That incorrectly doubles r2.width and makes the covering check succeed even when the overlay does not fully contain the underlying pipe. On horizontally split or multi-quadrant layouts this causes the cursor to disappear over overlay regions while input/coordinate mapping remains correct. [HOW] Skip test_pipe when searching for a pipe-split sibling on the same layer, so only the other half of the split plane is merged into r2. Signed-off-by: Yuling Li <yulingli@amd.com> --- drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c index ac558e715b72..7bbbe118e365 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c @@ -1801,7 +1801,10 @@ bool resource_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx) * pipe-split, merge together per same height. */ for (split_pipe = pipe_ctx->top_pipe; split_pipe; - split_pipe = split_pipe->top_pipe) + split_pipe = split_pipe->top_pipe) { + if (split_pipe == test_pipe) + continue; + if (split_pipe->plane_state->layer_index == test_pipe->plane_state->layer_index) { struct rect r2_half; @@ -1813,6 +1816,7 @@ bool resource_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx) r2_bottom = min(r2_bottom, r2_half.y + r2_half.height); break; } + } if (r1.x >= r2.x && r1.y >= r2.y && r1_right <= r2_right && r1_bottom <= r2_bottom) return true; -- 2.43.0 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] drm/amd/display: Fix cursor disable with horizontally split planes 2026-08-31 7:28 [PATCH] drm/amd/display: Fix cursor disable with horizontally split planes Yuling Li @ 2026-08-31 16:26 ` Leo Li 2026-09-01 7:40 ` Li, Yuling 0 siblings, 1 reply; 3+ messages in thread From: Leo Li @ 2026-08-31 16:26 UTC (permalink / raw) To: Yuling Li, amd-gfx; +Cc: Harry Wentland, Yuling Li On 2026-08-31 03:28, Yuling Li wrote: > From: Yuling Li <Yuling.Li@amd.com> > > [WHY] > resource_can_pipe_disable_cursor() disables the hardware cursor on a > pipe when a higher layer fully covers that pipe's recout, to avoid > double-cursor and scaling artifacts. > > When merging pipe-split halves of the same overlay layer, the inner > loop walks every pipe above the current one and looks for siblings > sharing test_pipe's layer_index. Because test_pipe itself satisfies > that condition, it can be treated as its own split partner. That > incorrectly doubles r2.width and makes the covering check succeed even > when the overlay does not fully contain the underlying pipe. > > On horizontally split or multi-quadrant layouts this causes the cursor > to disappear over overlay regions while input/coordinate mapping remains > correct. > > [HOW] > Skip test_pipe when searching for a pipe-split sibling on the same > layer, so only the other half of the split plane is merged into r2. > > Signed-off-by: Yuling Li <yulingli@amd.com> > --- > drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c > index ac558e715b72..7bbbe118e365 100644 > --- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c > +++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c > @@ -1801,7 +1801,10 @@ bool resource_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx) > * pipe-split, merge together per same height. > */ > for (split_pipe = pipe_ctx->top_pipe; split_pipe; > - split_pipe = split_pipe->top_pipe) > + split_pipe = split_pipe->top_pipe) { Nit: add a newline here. Otherwise, it makes sense to me: Reviewed-by: Leo Li <sunpeng.li@amd.com> Curious, what was the specific use case where you saw the cursor disappearing? Which compositor/app? Thanks, Leo > + if (split_pipe == test_pipe) > + continue; > + > if (split_pipe->plane_state->layer_index == test_pipe->plane_state->layer_index) { > struct rect r2_half; > > @@ -1813,6 +1816,7 @@ bool resource_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx) > r2_bottom = min(r2_bottom, r2_half.y + r2_half.height); > break; > } > + } > > if (r1.x >= r2.x && r1.y >= r2.y && r1_right <= r2_right && r1_bottom <= r2_bottom) > return true; ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] drm/amd/display: Fix cursor disable with horizontally split planes 2026-08-31 16:26 ` Leo Li @ 2026-09-01 7:40 ` Li, Yuling 0 siblings, 0 replies; 3+ messages in thread From: Li, Yuling @ 2026-09-01 7:40 UTC (permalink / raw) To: Li, Sun peng (Leo), amd-gfx@lists.freedesktop.org; +Cc: Wentland, Harry [-- Attachment #1.1: Type: text/plain, Size: 3763 bytes --] AMD General Hi Leo, I wrote a test case originally on Android VM to test plane offset and happened to find this issue. It was run on SurfaceFlinger in guest and Weston in host. And I then wrote another test case on bare metal with DRM/KMS directly to confirm the error's location. For the test case (see as below), each quadrant tile is a plane, and they can switch position by dragging. With 4 planes, kernel first hit Surface: can not attach plane_state ... Maximum is: 4. Then after some switches, the cursor will disappear on one of the right overlay planes. [cid:e98526f9-1c25-41b0-9666-0fbc99166164] Sincerely Yuling ________________________________ From: Leo Li <sunpeng.li@amd.com> Sent: Tuesday, September 1, 2026 12:26 AM To: Li, Yuling <Yuling.Li@amd.com>; amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org> Cc: Wentland, Harry <Harry.Wentland@amd.com>; Li, Yuling <Yuling.Li@amd.com> Subject: Re: [PATCH] drm/amd/display: Fix cursor disable with horizontally split planes On 2026-08-31 03:28, Yuling Li wrote: > From: Yuling Li <Yuling.Li@amd.com> > > [WHY] > resource_can_pipe_disable_cursor() disables the hardware cursor on a > pipe when a higher layer fully covers that pipe's recout, to avoid > double-cursor and scaling artifacts. > > When merging pipe-split halves of the same overlay layer, the inner > loop walks every pipe above the current one and looks for siblings > sharing test_pipe's layer_index. Because test_pipe itself satisfies > that condition, it can be treated as its own split partner. That > incorrectly doubles r2.width and makes the covering check succeed even > when the overlay does not fully contain the underlying pipe. > > On horizontally split or multi-quadrant layouts this causes the cursor > to disappear over overlay regions while input/coordinate mapping remains > correct. > > [HOW] > Skip test_pipe when searching for a pipe-split sibling on the same > layer, so only the other half of the split plane is merged into r2. > > Signed-off-by: Yuling Li <yulingli@amd.com> > --- > drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c > index ac558e715b72..7bbbe118e365 100644 > --- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c > +++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c > @@ -1801,7 +1801,10 @@ bool resource_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx) > * pipe-split, merge together per same height. > */ > for (split_pipe = pipe_ctx->top_pipe; split_pipe; > - split_pipe = split_pipe->top_pipe) > + split_pipe = split_pipe->top_pipe) { Nit: add a newline here. Otherwise, it makes sense to me: Reviewed-by: Leo Li <sunpeng.li@amd.com> Curious, what was the specific use case where you saw the cursor disappearing? Which compositor/app? Thanks, Leo > + if (split_pipe == test_pipe) > + continue; > + > if (split_pipe->plane_state->layer_index == test_pipe->plane_state->layer_index) { > struct rect r2_half; > > @@ -1813,6 +1816,7 @@ bool resource_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx) > r2_bottom = min(r2_bottom, r2_half.y + r2_half.height); > break; > } > + } > > if (r1.x >= r2.x && r1.y >= r2.y && r1_right <= r2_right && r1_bottom <= r2_bottom) > return true; [-- Attachment #1.2: Type: text/html, Size: 8216 bytes --] [-- Attachment #2: image.png --] [-- Type: image/png, Size: 147043 bytes --] ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-09-01 7:40 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-08-31 7:28 [PATCH] drm/amd/display: Fix cursor disable with horizontally split planes Yuling Li 2026-08-31 16:26 ` Leo Li 2026-09-01 7:40 ` Li, Yuling
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox