From: Aric Cyr <[email protected]>

[Why]
Cursor position needs to take into account plane scaling as well.

[How]
Translate cursor coords from stream space to plane space.

Signed-off-by: Aric Cyr <[email protected]>
Reviewed-by: Anthony Koo <[email protected]>
Acked-by: Leo Li <[email protected]>
Acked-by: Nicholas Kazlauskas <[email protected]>
---
 .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 33 ++++++++++++++-----
 1 file changed, 24 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index 9551fefb9d1d..61d2f1233f8c 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -2913,15 +2913,30 @@ void dcn10_set_cursor_position(struct pipe_ctx 
*pipe_ctx)
                .rotation = pipe_ctx->plane_state->rotation,
                .mirror = pipe_ctx->plane_state->horizontal_mirror
        };
-       uint32_t x_plane = pipe_ctx->plane_state->dst_rect.x;
-       uint32_t y_plane = pipe_ctx->plane_state->dst_rect.y;
-       uint32_t x_offset = min(x_plane, pos_cpy.x);
-       uint32_t y_offset = min(y_plane, pos_cpy.y);
-
-       pos_cpy.x -= x_offset;
-       pos_cpy.y -= y_offset;
-       pos_cpy.x_hotspot += (x_plane - x_offset);
-       pos_cpy.y_hotspot += (y_plane - y_offset);
+
+       int x_plane = pipe_ctx->plane_state->dst_rect.x;
+       int y_plane = pipe_ctx->plane_state->dst_rect.y;
+       int x_pos = pos_cpy.x;
+       int y_pos = pos_cpy.y;
+
+       // translate cursor from stream space to plane space
+       x_pos = (x_pos - x_plane) * pipe_ctx->plane_state->src_rect.width /
+                       pipe_ctx->plane_state->dst_rect.width;
+       y_pos = (y_pos - y_plane) * pipe_ctx->plane_state->src_rect.height /
+                       pipe_ctx->plane_state->dst_rect.height;
+
+       if (x_pos < 0) {
+               pos_cpy.x_hotspot -= x_pos;
+               x_pos = 0;
+       }
+
+       if (y_pos < 0) {
+               pos_cpy.y_hotspot -= y_pos;
+               y_pos = 0;
+       }
+
+       pos_cpy.x = (uint32_t)x_pos;
+       pos_cpy.y = (uint32_t)y_pos;
 
        if (pipe_ctx->plane_state->address.type
                        == PLN_ADDR_TYPE_VIDEO_PROGRESSIVE)
-- 
2.24.0

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to