Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b0131391 authored by Dmytro Laktyushkin's avatar Dmytro Laktyushkin Committed by Alex Deucher
Browse files

drm/amd/display: fix rotated surface scaling



This is a resubmit with the errors fixed

Signed-off-by: default avatarDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 5a095c40
Loading
Loading
Loading
Loading
+29 −32
Original line number Diff line number Diff line
@@ -527,12 +527,7 @@ static void calculate_recout(struct pipe_ctx *pipe_ctx, struct view *recout_skip
			pipe_ctx->bottom_pipe->plane_state == pipe_ctx->plane_state;
	bool sec_split = pipe_ctx->top_pipe &&
			pipe_ctx->top_pipe->plane_state == pipe_ctx->plane_state;

	if (stream->view_format == VIEW_3D_FORMAT_SIDE_BY_SIDE ||
		stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM) {
		pri_split = false;
		sec_split = false;
	}
	bool top_bottom_split = stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM;

	if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90 ||
			pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270)
@@ -567,17 +562,15 @@ static void calculate_recout(struct pipe_ctx *pipe_ctx, struct view *recout_skip
						- pipe_ctx->plane_res.scl_data.recout.y;

	/* Handle h & vsplit */
	if (pipe_ctx->top_pipe && pipe_ctx->top_pipe->plane_state ==
			pipe_ctx->plane_state && stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM) {
		pipe_ctx->plane_res.scl_data.recout.y += pipe_ctx->plane_res.scl_data.recout.height / 2;
	if (sec_split && top_bottom_split) {
		pipe_ctx->plane_res.scl_data.recout.y +=
				pipe_ctx->plane_res.scl_data.recout.height / 2;
		/* Floor primary pipe, ceil 2ndary pipe */
		pipe_ctx->plane_res.scl_data.recout.height = (pipe_ctx->plane_res.scl_data.recout.height + 1) / 2;
	} else if (pipe_ctx->bottom_pipe &&
			pipe_ctx->bottom_pipe->plane_state == pipe_ctx->plane_state
			&& stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM)
		pipe_ctx->plane_res.scl_data.recout.height =
				(pipe_ctx->plane_res.scl_data.recout.height + 1) / 2;
	} else if (pri_split && top_bottom_split)
		pipe_ctx->plane_res.scl_data.recout.height /= 2;

	if (pri_split || sec_split) {
	else if (pri_split || sec_split) {
		/* HMirror XOR Secondary_pipe XOR Rotation_180 */
		bool right_view = (sec_split != plane_state->horizontal_mirror) !=
					(plane_state->rotation == ROTATION_ANGLE_180);
@@ -612,21 +605,6 @@ static void calculate_recout(struct pipe_ctx *pipe_ctx, struct view *recout_skip

	recout_skip->width = pipe_ctx->plane_res.scl_data.recout.x - recout_full_x;
	recout_skip->height = pipe_ctx->plane_res.scl_data.recout.y - recout_full_y;

	/*Adjust recout_skip for rotation */
	if ((pri_split || sec_split) && (plane_state->rotation == ROTATION_ANGLE_270 || plane_state->rotation == ROTATION_ANGLE_180)) {
		bool right_view = (sec_split != plane_state->horizontal_mirror) !=
					(plane_state->rotation == ROTATION_ANGLE_180);

		if (plane_state->rotation == ROTATION_ANGLE_90
				|| plane_state->rotation == ROTATION_ANGLE_270)
			/* Secondary_pipe XOR Rotation_270 */
			right_view = (plane_state->rotation == ROTATION_ANGLE_270) != sec_split;
		if (!right_view)
			recout_skip->width = pipe_ctx->plane_res.scl_data.recout.x + pipe_ctx->plane_res.scl_data.recout.width / 2 - recout_full_x;
		else
			recout_skip->width = pipe_ctx->plane_res.scl_data.recout.x - pipe_ctx->plane_res.scl_data.recout.width / 2 - recout_full_x;
	}
}

static void calculate_scaling_ratios(struct pipe_ctx *pipe_ctx)
@@ -676,7 +654,26 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
	struct rect src = pipe_ctx->plane_state->src_rect;
	int vpc_div = (data->format == PIXEL_FORMAT_420BPP8
			|| data->format == PIXEL_FORMAT_420BPP10) ? 2 : 1;
	bool flip_vert_scan_dir = false, flip_horz_scan_dir = false;

	/*
	 * Need to calculate the scan direction for viewport to make adjustments
	 */
	if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_180) {
		flip_vert_scan_dir = true;
		flip_horz_scan_dir = true;
	} else if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90)
		flip_vert_scan_dir = true;
	else if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270)
		flip_horz_scan_dir = true;
	if (pipe_ctx->plane_state->horizontal_mirror)
		flip_horz_scan_dir = !flip_horz_scan_dir;

	/* Temp W/A for rotated displays, ignore recout_skip */
	if (flip_vert_scan_dir)
		recout_skip->height = 0;
	if (flip_horz_scan_dir)
		recout_skip->width = 0;

	if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90 ||
			pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270) {