[igt-dev] [PATCH i-g-t v2 2/3] tests/kms_psr2_sf: Add new move continuous testcases

Kahola, Mika mika.kahola at intel.com
Wed May 18 12:20:14 UTC 2022


> -----Original Message-----
> From: igt-dev <igt-dev-bounces at lists.freedesktop.org> On Behalf Of Jouni
> Högander
> Sent: Wednesday, May 18, 2022 2:55 PM
> To: igt-dev at lists.freedesktop.org
> Subject: [igt-dev] [PATCH i-g-t v2 2/3] tests/kms_psr2_sf: Add new move
> continuous testcases
> 
> Adding new continuous move testcases for cursor and overlay planes. These
> new testcases are testing selective fetch when updated plane is fully or partially
> out of visible area. This was found to reveal bug in selective fetch area
> calculation:
> 
> https://gitlab.freedesktop.org/drm/intel/-/issues/5440
> 
> Signed-off-by: Jouni Högander <jouni.hogander at intel.com>

Reviewed-by: Mika Kahola <mika.kahola at intel.com>

> ---
>  tests/i915/kms_psr2_sf.c | 124 ++++++++++++++++++++++++++++++++++-----
>  1 file changed, 110 insertions(+), 14 deletions(-)
> 
> diff --git a/tests/i915/kms_psr2_sf.c b/tests/i915/kms_psr2_sf.c index
> 5024fb14..75232973 100644
> --- a/tests/i915/kms_psr2_sf.c
> +++ b/tests/i915/kms_psr2_sf.c
> @@ -45,6 +45,8 @@ enum operations {
>  	PLANE_UPDATE_CONTINUOUS,
>  	PLANE_MOVE,
>  	PLANE_MOVE_CONTINUOUS,
> +	PLANE_MOVE_CONTINUOUS_EXCEED,
> +	PLANE_MOVE_CONTINUOUS_EXCEED_FULLY,
>  	OVERLAY_PRIM_UPDATE
>  };
> 
> @@ -89,6 +91,9 @@ static const char *op_str(enum operations op)
>  		[PLANE_UPDATE] = "plane-update",
>  		[PLANE_UPDATE_CONTINUOUS] = "plane-update-continuous",
>  		[PLANE_MOVE_CONTINUOUS] = "plane-move-continuous",
> +		[PLANE_MOVE_CONTINUOUS_EXCEED] = "plane-move-
> continuous-exceed",
> +		[PLANE_MOVE_CONTINUOUS_EXCEED_FULLY] =
> +		"plane-move-continuous-exceed-fully",
>  		[PLANE_MOVE] = "plane-move",
>  		[OVERLAY_PRIM_UPDATE] = "overlay-primary-update",
>  	};
> @@ -417,43 +422,51 @@ static void plane_move_expected_output(enum
> plane_move_postion pos)  static void
> plane_move_continuous_expected_output(data_t *data)  {
>  	char expected[128] = {};
> +	int ret = 0;
> 
>  	switch (data->pos) {
>  	case POS_TOP_LEFT:
> -		sprintf(expected,
> -			"screen Green with Blue box on top left corner");
> +		ret = sprintf(expected,
> +			      "screen Green with Blue box on top left corner");
>  		break;
>  	case POS_TOP_RIGHT:
> -		sprintf(expected,
> -			"screen Green with Blue box on top right corner");
> +		ret = sprintf(expected,
> +			      "screen Green with Blue box on top right corner");
>  		break;
>  	case POS_BOTTOM_LEFT:
> -		sprintf(expected,
> -			"screen Green with Blue box on bottom left corner");
> +		ret = sprintf(expected,
> +			      "screen Green with Blue box on bottom left
> corner");
>  		break;
>  	case POS_BOTTOM_RIGHT:
> -		sprintf(expected,
> -			"screen Green with Blue box on bottom right corner");
> +		ret = sprintf(expected,
> +			      "screen Green with Blue box on bottom right
> corner");
>  		break;
>  	case POS_CENTER:
> -		sprintf(expected, "screen Green with Blue box on center");
> +		ret = sprintf(expected, "screen Green with Blue box on center");
>  		break;
>  	case POS_TOP:
> -		sprintf(expected, "screen Green with Blue box on top");
> +		ret = sprintf(expected, "screen Green with Blue box on top");
>  		break;
>  	case POS_BOTTOM:
> -		sprintf(expected, "screen Green with Blue box on bottom");
> +		ret = sprintf(expected, "screen Green with Blue box on
> bottom");
>  		break;
>  	case POS_LEFT:
> -		sprintf(expected, "screen Green with Blue box on left");
> +		ret = sprintf(expected, "screen Green with Blue box on left");
>  		break;
>  	case POS_RIGHT:
> -		sprintf(expected, "screen Green with Blue box on right");
> +		ret = sprintf(expected, "screen Green with Blue box on right");
>  		break;
>  	default:
>  		igt_assert(false);
>  	}
> 
> +	if (ret) {
> +		if (data->op == PLANE_MOVE_CONTINUOUS_EXCEED)
> +			sprintf(expected + ret, "(partly exceeding area)");
> +		else if (data->op ==
> PLANE_MOVE_CONTINUOUS_EXCEED_FULLY)
> +			sprintf(expected + ret, "(fully exceeding area)");
> +	}
> +
>  	manual(expected);
>  }
> 
> @@ -476,6 +489,8 @@ static void expected_output(data_t *data)
>  		plane_move_expected_output(data->pos);
>  		break;
>  	case PLANE_MOVE_CONTINUOUS:
> +	case PLANE_MOVE_CONTINUOUS_EXCEED:
> +	case PLANE_MOVE_CONTINUOUS_EXCEED_FULLY:
>  		plane_move_continuous_expected_output(data);
>  		break;
>  	case PLANE_UPDATE:
> @@ -542,7 +557,7 @@ static void damaged_plane_move(data_t *data)  }
> static void get_target_coords(data_t *data, int *x, int *y)  {
> -	int target_x, target_y;
> +	int target_x, target_y, exceed_x, exceed_y;
> 
>  	switch (data->pos) {
>  	case POS_TOP_LEFT:
> @@ -585,6 +600,49 @@ static void get_target_coords(data_t *data, int *x, int
> *y)
>  		igt_assert(false);
>  	}
> 
> +	if (data->op == PLANE_MOVE_CONTINUOUS_EXCEED) {
> +		exceed_x  = data->fb_test.width / 2;
> +		exceed_y  = data->fb_test.height / 2;
> +	} else if (data->op == PLANE_MOVE_CONTINUOUS_EXCEED_FULLY) {
> +		exceed_x  = data->fb_test.width;
> +		exceed_y  = data->fb_test.height;
> +	}
> +
> +	if (data->op != PLANE_MOVE_CONTINUOUS) {
> +		switch (data->pos) {
> +		case POS_TOP_LEFT:
> +			target_x -= exceed_x;
> +			target_y -= exceed_y;
> +			break;
> +		case POS_TOP_RIGHT:
> +			target_x += exceed_x;
> +			target_y -= exceed_y;
> +			break;
> +		case POS_BOTTOM_LEFT:
> +			target_x -= exceed_x;
> +			target_y += exceed_y;
> +			break;
> +		case POS_BOTTOM_RIGHT:
> +			target_x += exceed_x;
> +			target_y += exceed_y;
> +			break;
> +		case POS_BOTTOM:
> +			target_y += exceed_y;
> +			break;
> +		case POS_TOP:
> +			target_y -= exceed_y;
> +			break;
> +		case POS_RIGHT:
> +			target_x += exceed_x;
> +			break;
> +		case POS_LEFT:
> +			target_x -= exceed_x;
> +			break;
> +		case POS_CENTER:
> +			break;
> +		}
> +	}
> +
>  	*x = target_x;
>  	*y = target_y;
>  }
> @@ -676,6 +734,8 @@ static void run(data_t *data)
>  		damaged_plane_move(data);
>  		break;
>  	case PLANE_MOVE_CONTINUOUS:
> +	case PLANE_MOVE_CONTINUOUS_EXCEED:
> +	case PLANE_MOVE_CONTINUOUS_EXCEED_FULLY:
>  		/*
>  		 * Start from top left corner and keep plane position
>  		 * over iterations.
> @@ -804,6 +864,24 @@ igt_main
>  		cleanup(&data);
>  	}
> 
> +	data.op = PLANE_MOVE_CONTINUOUS_EXCEED;
> +	igt_describe("Test that selective fetch works on moving cursor plane
> exceeding partially visible area (no update)");
> +	igt_subtest_f("cursor-%s-sf", op_str(data.op)) {
> +		data.test_plane_id = DRM_PLANE_TYPE_CURSOR;
> +		prepare(&data);
> +		run(&data);
> +		cleanup(&data);
> +	}
> +
> +	data.op = PLANE_MOVE_CONTINUOUS_EXCEED_FULLY;
> +	igt_describe("Test that selective fetch works on moving cursor plane
> exceeding fully visible area (no update)");
> +	igt_subtest_f("cursor-%s-sf", op_str(data.op)) {
> +		data.test_plane_id = DRM_PLANE_TYPE_CURSOR;
> +		prepare(&data);
> +		run(&data);
> +		cleanup(&data);
> +	}
> +
>  	/* Only for overlay plane */
>  	data.op = PLANE_MOVE;
>  	/* Verify overlay plane move selective fetch */ @@ -827,6 +905,24 @@
> igt_main
>  		cleanup(&data);
>  	}
> 
> +	data.op = PLANE_MOVE_CONTINUOUS_EXCEED;
> +	igt_describe("Test that selective fetch works on moving overlay plane
> partially exceeding visible area (no update)");
> +	igt_subtest_f("overlay-%s-sf", op_str(data.op)) {
> +		data.test_plane_id = DRM_PLANE_TYPE_OVERLAY;
> +		prepare(&data);
> +		run(&data);
> +		cleanup(&data);
> +	}
> +
> +	data.op = PLANE_MOVE_CONTINUOUS_EXCEED_FULLY;
> +	igt_describe("Test that selective fetch works on moving overlay plane
> fully exceeding visible area (no update)");
> +	igt_subtest_f("overlay-%s-sf", op_str(data.op)) {
> +		data.test_plane_id = DRM_PLANE_TYPE_OVERLAY;
> +		prepare(&data);
> +		run(&data);
> +		cleanup(&data);
> +	}
> +
>  	/* Verify primary plane selective fetch with overplay plane blended */
>  	data.op = OVERLAY_PRIM_UPDATE;
>  	igt_describe("Test that selective fetch works on primary plane "
> --
> 2.25.1



More information about the igt-dev mailing list