Commit 63f8bee4 authored by Dale Zhao's avatar Dale Zhao Committed by Alex Deucher

drm/amd/display: Refine condition of cursor visibility for pipe-split

[Why]
In some scenarios like fullscreen game, major plane is scaled. Then
if a upper layer owns the cursor, cursor is invisiable in the
majority of the screen.

[How]
Instead assuming upper plane handles cursor, summing up upper
split planes on the same layer. If whole upper plane covers current
half/whole pipe plane, disable cursor.
Reviewed-by: default avatarKrunoslav Kovac <Krunoslav.Kovac@amd.com>
Acked-by: default avatarMikita Lipski <mikita.lipski@amd.com>
Signed-off-by: default avatarDale Zhao <dale.zhao@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 34316c1e
...@@ -3241,13 +3241,11 @@ void dcn10_update_dchub(struct dce_hwseq *hws, struct dchub_init_data *dh_data) ...@@ -3241,13 +3241,11 @@ void dcn10_update_dchub(struct dce_hwseq *hws, struct dchub_init_data *dh_data)
static bool dcn10_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx) static bool dcn10_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx)
{ {
struct pipe_ctx *test_pipe; struct pipe_ctx *test_pipe, *split_pipe;
const struct scaler_data *scl_data = &pipe_ctx->plane_res.scl_data; const struct scaler_data *scl_data = &pipe_ctx->plane_res.scl_data;
const struct rect *r1 = &scl_data->recout, *r2; struct rect r1 = scl_data->recout, r2, r2_half;
int r1_r = r1->x + r1->width, r1_b = r1->y + r1->height, r2_r, r2_b; int r1_r = r1.x + r1.width, r1_b = r1.y + r1.height, r2_r, r2_b;
int cur_layer = pipe_ctx->plane_state->layer_index; int cur_layer = pipe_ctx->plane_state->layer_index;
bool upper_pipe_exists = false;
struct fixed31_32 one = dc_fixpt_from_int(1);
/** /**
* Disable the cursor if there's another pipe above this with a * Disable the cursor if there's another pipe above this with a
...@@ -3256,25 +3254,32 @@ static bool dcn10_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx) ...@@ -3256,25 +3254,32 @@ static bool dcn10_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx)
*/ */
for (test_pipe = pipe_ctx->top_pipe; test_pipe; for (test_pipe = pipe_ctx->top_pipe; test_pipe;
test_pipe = test_pipe->top_pipe) { test_pipe = test_pipe->top_pipe) {
if (!test_pipe->plane_state->visible) // Skip invisible layer and pipe-split plane on same layer
if (!test_pipe->plane_state->visible || test_pipe->plane_state->layer_index == cur_layer)
continue; continue;
r2 = &test_pipe->plane_res.scl_data.recout; r2 = test_pipe->plane_res.scl_data.recout;
r2_r = r2->x + r2->width; r2_r = r2.x + r2.width;
r2_b = r2->y + r2->height; r2_b = r2.y + r2.height;
split_pipe = test_pipe;
if (r1->x >= r2->x && r1->y >= r2->y && r1_r <= r2_r && r1_b <= r2_b) /**
return true; * There is another half plane on same layer because of
* pipe-split, merge together per same height.
if (test_pipe->plane_state->layer_index < cur_layer) */
upper_pipe_exists = true; for (split_pipe = pipe_ctx->top_pipe; split_pipe;
split_pipe = split_pipe->top_pipe)
if (split_pipe->plane_state->layer_index == test_pipe->plane_state->layer_index) {
r2_half = split_pipe->plane_res.scl_data.recout;
r2.x = (r2_half.x < r2.x) ? r2_half.x : r2.x;
r2.width = r2.width + r2_half.width;
r2_r = r2.x + r2.width;
break;
} }
// if plane scaled, assume an upper plane can handle cursor if it exists. if (r1.x >= r2.x && r1.y >= r2.y && r1_r <= r2_r && r1_b <= r2_b)
if (upper_pipe_exists &&
(scl_data->ratios.horz.value != one.value ||
scl_data->ratios.vert.value != one.value))
return true; return true;
}
return false; return false;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment