On 2020-01-30 1:29 p.m., Nicholas Kazlauskas wrote: > [Why] > In current code we're essentially drawing the cursor on every pipe > that contains it. This only works when the planes have the same > scaling for src to dest rect, otherwise we'll get "double cursor" where > one cursor is incorrectly filtered and offset from the real position. > > [How] > Without dedicated cursor planes on DCN we require at least one pipe > that matches the scaling of the current timing. > > This is an optimization and workaround for the most common case where > the top-most plane is not scaled but the bottom-most plane is scaled. > > Whenever a pipe has a parent pipe in the blending tree whose recout > fully contains the current pipe we can disable the pipe. > > This only applies when the pipe is actually visible of course. > > Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@xxxxxxx> Reviewed-by: Harry Wentland <harry.wentland@xxxxxxx> Harry > --- > .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 30 +++++++++++++++++++ > 1 file changed, 30 insertions(+) > > 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 f2127afb37b2..1008ac8a0f2a 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 > @@ -2911,6 +2911,33 @@ void dcn10_update_dchub(struct dce_hwseq *hws, struct dchub_init_data *dh_data) > hubbub->funcs->update_dchub(hubbub, dh_data); > } > > +static bool dcn10_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx) > +{ > + struct pipe_ctx *test_pipe; > + const struct rect *r1 = &pipe_ctx->plane_res.scl_data.recout, *r2; > + int r1_r = r1->x + r1->width, r1_b = r1->y + r1->height, r2_r, r2_b; > + > + /** > + * Disable the cursor if there's another pipe above this with a > + * plane that contains this pipe's viewport to prevent double cursor > + * and incorrect scaling artifacts. > + */ > + for (test_pipe = pipe_ctx->top_pipe; test_pipe; > + test_pipe = test_pipe->top_pipe) { > + if (!test_pipe->plane_state->visible) > + continue; > + > + r2 = &test_pipe->plane_res.scl_data.recout; > + r2_r = r2->x + r2->width; > + r2_b = r2->y + r2->height; > + > + if (r1->x >= r2->x && r1->y >= r2->y && r1_r <= r2_r && r1_b <= r2_b) > + return true; > + } > + > + return false; > +} > + > void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx) > { > struct dc_cursor_position pos_cpy = pipe_ctx->stream->cursor_position; > @@ -2956,6 +2983,9 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx) > == PLN_ADDR_TYPE_VIDEO_PROGRESSIVE) > pos_cpy.enable = false; > > + if (pos_cpy.enable && dcn10_can_pipe_disable_cursor(pipe_ctx)) > + pos_cpy.enable = false; > + > // Swap axis and mirror horizontally > if (param.rotation == ROTATION_ANGLE_90) { > uint32_t temp_x = pos_cpy.x; > _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx