mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 07:03:03 +02:00
drm/amd/display: Fix cursor pos at overlay plane edges on DCN4
[Why&How] On DCN4, when cursor straddles the left/top edge of an overlay plane, the recout-relative position becomes negative. These negative values wrap to large positive numbers when cast to uint32_t, causing the cursor on the the overlay plane to disappear. Fix by adding hotspot adjustment and position clamping after the recout-relative calculation, matching the existing ODM/MPC slice boundary handling. Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
f44c094449
commit
d8f6c978fd
|
|
@ -1202,6 +1202,25 @@ void dcn401_set_cursor_position(struct pipe_ctx *pipe_ctx)
|
|||
x_pos = pos_cpy.x - param.recout.x;
|
||||
y_pos = pos_cpy.y - param.recout.y;
|
||||
|
||||
/**
|
||||
* If the cursor position is negative after recout adjustment, we need
|
||||
* to shift the hotspot to compensate and clamp position to 0. This
|
||||
* handles the case where cursor straddles the left/top edge of an
|
||||
* overlay plane - the cursor is partially visible and needs correct
|
||||
* hotspot adjustment to render the visible portion.
|
||||
*/
|
||||
if (x_pos < 0) {
|
||||
pos_cpy.x_hotspot -= x_pos;
|
||||
if (hubp->curs_attr.attribute_flags.bits.ENABLE_MAGNIFICATION)
|
||||
adjust_hotspot_between_slices_for_2x_magnify(hubp->curs_attr.width, &pos_cpy);
|
||||
x_pos = 0;
|
||||
}
|
||||
|
||||
if (y_pos < 0) {
|
||||
pos_cpy.y_hotspot -= y_pos;
|
||||
y_pos = 0;
|
||||
}
|
||||
|
||||
recout_x_pos = x_pos - pos_cpy.x_hotspot;
|
||||
recout_y_pos = y_pos - pos_cpy.y_hotspot;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user