drm/amd/display: Fix incorrect cursor position for dcn401
[Why] Incorrect cursor position calculation in some scenarios. Also for mirror and rotation cases. [How] Fix for incorrect cursor position. Added new test scenarios for diags cursor test. Updated CRC for few of the diags cursor test scenarios. Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com> Signed-off-by: Sridevi <sarvinde@amd.com> Acked-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -185,15 +185,23 @@ void dpp401_set_cursor_position(
|
||||
rec_y_offset = y_pos - (cursor_height - y_hotspot);
|
||||
}
|
||||
|
||||
if (rec_x_offset >= (int)param->recout.width)
|
||||
cur_en = 0; /* not visible beyond right edge*/
|
||||
if (param->rotation == ROTATION_ANGLE_0 && !param->mirror) {
|
||||
if (rec_x_offset >= (int)param->recout.width)
|
||||
cur_en = 0; /* not visible beyond right edge*/
|
||||
|
||||
if (rec_y_offset >= (int)param->recout.height)
|
||||
cur_en = 0; /* not visible beyond bottom edge*/
|
||||
} else {
|
||||
if (rec_x_offset > (int)param->recout.width)
|
||||
cur_en = 0; /* not visible beyond right edge*/
|
||||
|
||||
if (rec_y_offset > (int)param->recout.height)
|
||||
cur_en = 0; /* not visible beyond bottom edge*/
|
||||
}
|
||||
|
||||
if (rec_x_offset + cursor_width <= 0)
|
||||
cur_en = 0; /* not visible beyond left edge*/
|
||||
|
||||
if (rec_y_offset >= (int)param->recout.height)
|
||||
cur_en = 0; /* not visible beyond bottom edge*/
|
||||
|
||||
if (rec_y_offset + cursor_height <= 0)
|
||||
cur_en = 0; /* not visible beyond top edge*/
|
||||
|
||||
|
||||
@@ -1126,14 +1126,14 @@ void dcn401_set_cursor_position(struct pipe_ctx *pipe_ctx)
|
||||
*/
|
||||
|
||||
if (param.rotation == ROTATION_ANGLE_90 || param.rotation == ROTATION_ANGLE_270) {
|
||||
x_pos = x_pos * pipe_ctx->stream->dst.width /
|
||||
x_pos = pipe_ctx->stream->dst.x + x_pos * pipe_ctx->stream->dst.width /
|
||||
pipe_ctx->stream->src.height;
|
||||
y_pos = y_pos * pipe_ctx->stream->dst.height /
|
||||
y_pos = pipe_ctx->stream->dst.y + y_pos * pipe_ctx->stream->dst.height /
|
||||
pipe_ctx->stream->src.width;
|
||||
} else {
|
||||
x_pos = x_pos * pipe_ctx->stream->dst.width /
|
||||
x_pos = pipe_ctx->stream->dst.x + x_pos * pipe_ctx->stream->dst.width /
|
||||
pipe_ctx->stream->src.width;
|
||||
y_pos = y_pos * pipe_ctx->stream->dst.height /
|
||||
y_pos = pipe_ctx->stream->dst.y + y_pos * pipe_ctx->stream->dst.height /
|
||||
pipe_ctx->stream->src.height;
|
||||
}
|
||||
|
||||
@@ -1225,10 +1225,15 @@ void dcn401_set_cursor_position(struct pipe_ctx *pipe_ctx)
|
||||
}
|
||||
}
|
||||
} else if (param.rotation == ROTATION_ANGLE_90) {
|
||||
uint32_t temp_y = pos_cpy.y;
|
||||
if (!param.mirror) {
|
||||
uint32_t temp_y = pos_cpy.y;
|
||||
|
||||
pos_cpy.y = pipe_ctx->plane_res.scl_data.recout.height - pos_cpy.x;
|
||||
pos_cpy.x = temp_y - prev_odm_width;
|
||||
} else {
|
||||
swap(pos_cpy.x, pos_cpy.y);
|
||||
}
|
||||
|
||||
pos_cpy.y = pipe_ctx->plane_res.scl_data.recout.height - pos_cpy.x;
|
||||
pos_cpy.x = temp_y - prev_odm_width;
|
||||
} else if (param.rotation == ROTATION_ANGLE_270) {
|
||||
// Swap axis and mirror vertically
|
||||
uint32_t temp_x = pos_cpy.x;
|
||||
@@ -1279,8 +1284,15 @@ void dcn401_set_cursor_position(struct pipe_ctx *pipe_ctx)
|
||||
pos_cpy.y = temp_x;
|
||||
}
|
||||
} else {
|
||||
pos_cpy.x = pipe_ctx->plane_res.scl_data.recout.width - pos_cpy.y;
|
||||
pos_cpy.y = temp_x;
|
||||
if (param.mirror) {
|
||||
swap(pos_cpy.x, pos_cpy.y);
|
||||
|
||||
pos_cpy.x = pipe_ctx->plane_res.scl_data.recout.width - pos_cpy.x + 2 * pipe_ctx->plane_res.scl_data.recout.x;
|
||||
pos_cpy.y = (2 * pipe_ctx->plane_res.scl_data.recout.y) + pipe_ctx->plane_res.scl_data.recout.height - pos_cpy.y;
|
||||
} else {
|
||||
pos_cpy.x = pipe_ctx->plane_res.scl_data.recout.width - pos_cpy.y;
|
||||
pos_cpy.y = temp_x;
|
||||
}
|
||||
}
|
||||
} else if (param.rotation == ROTATION_ANGLE_180) {
|
||||
// Mirror horizontally and vertically
|
||||
|
||||
Reference in New Issue
Block a user