diff mbox

[i-g-t] i-g-t: kms_plane_scaling: Enhanced scaling tests

Message ID 1511338504-20453-1-git-send-email-vidya.srinivas@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Srinivas, Vidya Nov. 22, 2017, 8:15 a.m. UTC
From: Jyoti Yadav <jyoti.r.yadav@intel.com>

Added subtests to cover below gaps.
	1. scaler with pixelformat and tiling.
	2. scaler with rotation
	3. scaler with multiple planes
	4. scaler with multi pipe
	5. scaler with clipping/clamping scenario

Signed-off-by: Jyoti Yadav <jyoti.r.yadav@intel.com>
---
 tests/kms_plane_scaling.c | 480 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 476 insertions(+), 4 deletions(-)

Comments

Juha-Pekka Heikkila Nov. 23, 2017, 4:01 p.m. UTC | #1
On 22.11.2017 10:15, Vidya Srinivas wrote:
> From: Jyoti Yadav <jyoti.r.yadav@intel.com>
> 
> Added subtests to cover below gaps.
> 	1. scaler with pixelformat and tiling.
> 	2. scaler with rotation
> 	3. scaler with multiple planes
> 	4. scaler with multi pipe
> 	5. scaler with clipping/clamping scenario
> 
> Signed-off-by: Jyoti Yadav <jyoti.r.yadav@intel.com>
> ---
>   tests/kms_plane_scaling.c | 480 +++++++++++++++++++++++++++++++++++++++++++++-
>   1 file changed, 476 insertions(+), 4 deletions(-)
> 
> diff --git a/tests/kms_plane_scaling.c b/tests/kms_plane_scaling.c
> index 403df47..2be6acc 100644
> --- a/tests/kms_plane_scaling.c
> +++ b/tests/kms_plane_scaling.c
> @@ -43,10 +43,11 @@ typedef struct {
>   	struct igt_fb fb1;
>   	struct igt_fb fb2;
>   	struct igt_fb fb3;
> +	struct igt_fb fb4;
>   	int fb_id1;
>   	int fb_id2;
>   	int fb_id3;
> -
> +	int fb_id4;
>   	igt_plane_t *plane1;
>   	igt_plane_t *plane2;
>   	igt_plane_t *plane3;
> @@ -54,6 +55,51 @@ typedef struct {
>   } data_t;
>   
>   #define FILE_NAME   "1080p-left.png"
> +#define MIN_SRC_WIDTH 8
> +#define MAX_SRC_WIDTH 4096
> +static uint32_t check_pixel_format(uint32_t pixel_format)
> +{
> +	const uint32_t *igt_formats;
> +	int num_igt_formats;
> +	int i;
> +
> +
> +	igt_get_all_cairo_formats(&igt_formats, &num_igt_formats);
> +	for (i = 0; i < num_igt_formats; i++) {
> +		if (pixel_format == igt_formats[i])
> +			return 0;
> +	}
> +
> +	return -1;
> +}
> +bool is_igt_output_connected(igt_output_t *output)

^^ static

> +{
> +	/* Something went wrong during probe? */
> +	if (!output->config.connector)
> +		return false;
> +
> +	if (output->config.connector->connection == DRM_MODE_CONNECTED)
> +		return true;
> +
> +	return false;
> +}
> +
> +static igt_output_t *get_next_valid_output(igt_display_t *data, int i)
> +{
> +	int j = 0, valid_output = 0;
> +	drmModeModeInfo *mode;
> +	for (j = 0; j < data->n_outputs; j++) {
> +		if (is_igt_output_connected(&data->outputs[j])) {
> +			mode = igt_output_get_mode(&data->outputs[j]);
> +			if (mode->hdisplay != 0 && mode->vdisplay != 0) {
> +				valid_output++;
> +				if (valid_output == i)
> +					return &data->outputs[j];
> +			}
> +		}
> +	}
> +	return NULL;
> +}
>   
>   static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe,
>   			igt_plane_t *plane, drmModeModeInfo *mode, enum igt_commit_style s)
> @@ -298,7 +344,418 @@ static void test_plane_scaling(data_t *d)
>   	igt_require_f(valid_tests, "no valid crtc/connector combinations found\n");
>   }
>   
> -igt_simple_main
> +uint64_t get_tiling(int i)

^^ static

> +{
> +	switch (i) {
> +	case 0:
> +		return LOCAL_DRM_FORMAT_MOD_NONE;
> +		break;
> +	case 1:
> +		return LOCAL_I915_FORMAT_MOD_X_TILED;
> +		break;
> +	case 2:
> +		return LOCAL_I915_FORMAT_MOD_Y_TILED;
> +		break;
> +	case 3:
> +		return LOCAL_I915_FORMAT_MOD_Yf_TILED;
> +		break;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +void loop_plane_scaling(data_t *d, igt_plane_t *plane, uint32_t pixel_format,

^^ static

> +			uint64_t tiling, enum pipe pipe, igt_output_t *output)
> +{
> +	igt_display_t *display = &d->display;
> +	int width, height;
> +	/* create buffer in the range of  min and max source side limit.*/
> +	for (width = MIN_SRC_WIDTH; width <= MAX_SRC_WIDTH; width = width + 500) {
> +		igt_output_set_pipe(output, pipe);
> +		height = width + 10;
> +		d->fb_id1 = igt_create_pattern_fb(display->drm_fd, width, height,
> +						pixel_format, tiling, &d->fb1);
> +		igt_assert(d->fb_id1);
> +		igt_plane_set_fb(plane, &d->fb1);
> +		/* check upscaling */
> +		igt_fb_set_position(&d->fb1, plane, 0, 0);
> +		igt_fb_set_size(&d->fb1, plane, d->fb1.width, d->fb1.height);
> +		igt_plane_set_position(plane, 10, 10);
> +		igt_plane_set_size(plane, width*2, height*2);
> +		igt_display_commit2(display, COMMIT_ATOMIC);

When it says 'check' here, should here be used 'igt_display_try_commit2' 
instead of 'igt_display_commit2'? I was bit confused where the checking 
is really happening. Same goes for all the tests, I see the setup 
asserted but for actual 'check' I didn't find asserts about any results.

> +		igt_plane_set_fb(plane, NULL);
> +		igt_plane_set_position(plane, 0, 0);
> +		if (d->fb_id1) {
> +			igt_remove_fb(d->drm_fd, &d->fb1);
> +			d->fb_id1 = 0;
> +		}
> +	}
> +}
> +void test_scaler_with_pixel_format(data_t *d)

^^ static

> +{
> +	igt_display_t *display = &d->display;
> +	igt_output_t *output;
> +	enum pipe pipe;
> +	igt_plane_t *plane;
> +	int valid_tests = 0;

valid_tests seem not to be used anywhere.

> +	igt_require(d->num_scalers);
> +	for_each_pipe_with_valid_output(display, pipe, output) {
> +		drmModeModeInfo *mode;
> +		igt_output_set_pipe(output, pipe);
> +		mode = igt_output_get_mode(output);
> +		for_each_plane_on_pipe(display, pipe, plane) {
> +			/* check if plane is cursor. */
> +			if (plane->type == DRM_PLANE_TYPE_CURSOR)
> +				continue;
> +			/* run loop for all pixel formats.*/
> +			drmModePlanePtr plane_kms;
> +			plane_kms = plane->drm_plane;
> +			for (int j = 0; j < plane_kms->count_formats; j++) {
> +				/* check plane pixel format is supported in
> +				 * cairo pixel formats.
> +				 */
> +				if (check_pixel_format(plane_kms->formats[j])	== 0) {
> +					/* loop for tiling */
> +					igt_require_fb_modifiers(d->drm_fd);
> +					for (int i = 0; i < 4; i++) {
> +						uint64_t tiling = get_tiling(i);
> +						loop_plane_scaling(d, plane, plane_kms->formats[j],
> +								tiling, pipe, output);
> +					}
> +				}
> +			}
> +		}
> +	}
> +}
> +
> +static igt_rotation_t get_rotation_angle(int i)
> +{
> +	switch (i) {
> +	case 0:
> +		return IGT_ROTATION_0;
> +		break;
> +	case 1:
> +		return IGT_ROTATION_90;
> +		break;
> +	case 2:
> +		return IGT_ROTATION_180;
> +		break;
> +	case 3:
> +		return IGT_ROTATION_270;
> +		break;
> +	default:
> +		return -1;
> +	}
> +}
> +
> +void test_scaler_with_rotation(data_t *d)

^^ static

> +{
> +	igt_display_t *display = &d->display;
> +	igt_output_t *output;
> +	enum pipe pipe;
> +	igt_plane_t *plane;
> +	int valid_tests = 0;

valid_tests seem not to be used anywhere here either.

> +	igt_require(d->num_scalers);
> +	for_each_pipe_with_valid_output(display, pipe, output) {
> +		drmModeModeInfo *mode;
> +		mode = igt_output_get_mode(output);
> +		for_each_plane_on_pipe(display, pipe, plane) {
> +			if (plane->type == DRM_PLANE_TYPE_CURSOR)
> +				continue;
> +			/* run loop for all pixel formats.*/
> +			drmModePlanePtr plane_kms;
> +			plane_kms = plane->drm_plane;
> +			for (int j = 0; j < plane_kms->count_formats; j++) {
> +				/* 90/270 degree rotation is not supported on RGB565 and C8 pixel
> +				 * formats
> +				 */
> +				if (plane_kms->formats[j] == DRM_FORMAT_RGB565 ||
> +					plane_kms->formats[j] == DRM_FORMAT_C8) {
> +					continue;
> +				}
> +				if (check_pixel_format(plane_kms->formats[j]) == 0) {
> +					igt_output_set_pipe(output, pipe);
> +					d->fb_id1 = igt_create_pattern_fb(display->drm_fd,
> +									  mode->hdisplay, mode->vdisplay,
> +									  plane_kms->formats[j],
> +									  LOCAL_I915_FORMAT_MOD_Y_TILED, &d->fb1);
> +					igt_assert(d->fb_id1);
> +					/* check all the supported rotation format*/
> +					for (int i = 0; i < 4; i++) {
> +						igt_plane_set_fb(plane, &d->fb1);
> +						/* check upscaling */
> +						igt_fb_set_position(&d->fb1, plane, 0, 0);
> +						igt_fb_set_size(&d->fb1, plane, 300, 400);
> +						igt_plane_set_position(plane, 0, 0);
> +						igt_plane_set_size(plane, mode->hdisplay-200, mode->vdisplay-200);
> +						igt_plane_set_rotation(plane, get_rotation_angle(i));
> +						igt_display_commit2(display, COMMIT_ATOMIC);
> +						/* check downscaling */
> +						igt_fb_set_position(&d->fb1, plane, 0, 0);
> +						igt_fb_set_size(&d->fb1, plane, 300, 400);
> +						igt_plane_set_position(plane, 0, 0);
> +						igt_plane_set_size(plane, 350, 250); /* downscale by 50 pixels*/
> +						igt_plane_set_rotation(plane, get_rotation_angle(i));
> +						igt_display_commit2(display, COMMIT_ATOMIC);
> +						/* disable Plane*/
> +						igt_plane_set_fb(plane, NULL);
> +						igt_plane_set_position(plane, 0, 0);
> +					}
> +					if (d->fb_id1) {
> +						igt_remove_fb(d->drm_fd, &d->fb1);
> +						d->fb_id1 = 0;
> +					}
> +				}
> +			}
> +		}
> +	}
> +}
> +
> +void test_scaler_with_multiple_planes(data_t *d)

^^ static

> +{
> +	igt_display_t *display = &d->display;
> +	igt_output_t *output;
> +	enum pipe pipe;
> +	int valid_tests = 0;

valid_tests seem not to be used anywhere here too.

> +	igt_require(d->num_scalers);
> +	for_each_pipe_with_valid_output(display, pipe, output) {
> +		/* For Gen 9, Pipe C supports only 1 scaler*/
> +		if (intel_gen(d->devid) == 9 && pipe == PIPE_C)
> +			continue;
> +		drmModeModeInfo *mode;
> +		igt_output_set_pipe(output, pipe);
> +		mode = igt_output_get_mode(output);
> +		/* Create 2 Framebuffers */
> +		d->fb_id2 = igt_create_pattern_fb(d->drm_fd, mode->hdisplay, mode->vdisplay,
> +						DRM_FORMAT_XRGB8888,
> +						LOCAL_I915_FORMAT_MOD_X_TILED, /* tiled */
> +						&d->fb2);
> +		igt_assert(d->fb_id2);
> +
> +		d->fb_id3 = igt_create_pattern_fb(d->drm_fd,
> +						  mode->hdisplay, mode->vdisplay,
> +						  DRM_FORMAT_XRGB8888,
> +						  LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
> +						  &d->fb3);
> +		igt_assert(d->fb_id3);
> +
> +		d->plane1 = igt_output_get_plane(output, 0);
> +		igt_plane_set_fb(d->plane1, &d->fb2);
> +		d->plane2 = igt_output_get_plane(output, 1);
> +		igt_plane_set_fb(d->plane2, &d->fb3);
> +		/* plane upscaling  on 2 planes*/
> +		igt_fb_set_position(&d->fb2, d->plane1, 0, 0);
> +		igt_fb_set_size(&d->fb2, d->plane1, 300, 300);
> +		igt_plane_set_position(d->plane1, 0, 0);
> +		igt_plane_set_size(d->plane1, 400, 400);
> +
> +		igt_fb_set_position(&d->fb3, d->plane2, 0, 0);
> +		igt_fb_set_size(&d->fb3, d->plane2, 400, 400);
> +		igt_plane_set_position(d->plane2, 100, 100);
> +		igt_plane_set_size(d->plane2, 500, 500);
> +
> +		igt_display_commit2(display, COMMIT_ATOMIC);
> +		/* disbale above 2planes*/
> +		igt_plane_set_fb(d->plane1, NULL);
> +		igt_plane_set_position(d->plane1, 0, 0);
> +		igt_plane_set_fb(d->plane2, NULL);
> +		igt_plane_set_position(d->plane2, 0, 0);
> +
> +		/* Switch scaler from above 2 planes to next 2 planes*/
> +		d->plane3 = igt_output_get_plane(output, 2);
> +		igt_plane_set_fb(d->plane3, &d->fb2);
> +		d->plane4 = igt_output_get_plane(output, 3);
> +		igt_plane_set_fb(d->plane4, &d->fb3);
> +
> +		igt_fb_set_position(&d->fb2, d->plane3, 0, 0);
> +		igt_fb_set_size(&d->fb2, d->plane3, 300, 300);
> +		igt_plane_set_position(d->plane3, 0, 0);
> +		igt_plane_set_size(d->plane3, 600, 600);
> +
> +		igt_fb_set_position(&d->fb3, d->plane4, 0, 0);
> +		igt_fb_set_size(&d->fb3, d->plane4, 400, 400);
> +		igt_plane_set_position(d->plane4, 100, 100);
> +		igt_plane_set_size(d->plane4, 700, 700);
> +
> +		igt_display_commit2(display, COMMIT_ATOMIC);
> +		/* disbale above 2planes and remove FB*/
> +		igt_plane_set_fb(d->plane3, NULL);
> +		igt_plane_set_position(d->plane3, 0, 0);
> +		igt_plane_set_fb(d->plane4, NULL);
> +		igt_plane_set_position(d->plane4, 0, 0);
> +		if (d->fb_id2) {
> +			igt_remove_fb(d->drm_fd, &d->fb2);
> +			d->fb_id2 = 0;
> +		}
> +		if (d->fb_id3) {
> +			igt_remove_fb(d->drm_fd, &d->fb3);
> +			d->fb_id3 = 0;
> +		}
> +	}
> +}
> +
> +void test_scaler_with_clipping_clamping_scenario(data_t *d)

^^ static

> +{
> +	igt_display_t *display = &d->display;
> +	igt_output_t *output;
> +	enum pipe pipe;
> +	int valid_tests = 0;
valid_tests here too..

> +	igt_require(d->num_scalers);
> +
> +	for_each_pipe_with_valid_output(display, pipe, output) {
> +
> +		if (intel_gen(d->devid) == 9 && pipe == PIPE_C)
> +			continue;
> +		drmModeModeInfo *mode;
> +		igt_output_set_pipe(output, pipe);
> +		mode = igt_output_get_mode(output);
> +		/* allocate fb2 and fb3 */
> +		d->fb_id2 = igt_create_pattern_fb(d->drm_fd, mode->hdisplay, mode->vdisplay,
> +						DRM_FORMAT_XRGB8888,
> +						LOCAL_I915_FORMAT_MOD_X_TILED, /* tiled */
> +						&d->fb2);
> +		igt_assert(d->fb_id2);
> +
> +		d->fb_id3 = igt_create_pattern_fb(d->drm_fd,
> +						  mode->hdisplay, mode->vdisplay,
> +						  DRM_FORMAT_XRGB8888,
> +						  LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
> +						  &d->fb3);
> +		igt_assert(d->fb_id3);
> +
> +		/* Set up display with plane 1 */
> +		d->plane1 = igt_output_get_plane(output, 0);
> +		igt_plane_set_fb(d->plane1, &d->fb2);
> +		d->plane2 = igt_output_get_plane(output, 1);
> +		igt_plane_set_fb(d->plane2, &d->fb3);
> +
> +		/* plane upscaling  on 2 planes*/
> +		igt_fb_set_position(&d->fb2, d->plane1, 0, 0);
> +		igt_fb_set_size(&d->fb2, d->plane1, 300, 300);
> +		igt_plane_set_position(d->plane1, 100, 400);
> +		/* scaled window size is outside the modeset area.*/
> +		igt_plane_set_size(d->plane1, mode->hdisplay + 200, mode->vdisplay + 200);
> +
> +		igt_fb_set_position(&d->fb3, d->plane2, 0, 0);
> +		igt_fb_set_size(&d->fb3, d->plane2, 400, 400);
> +		igt_plane_set_position(d->plane2, 100, 100);
> +		/* scaled window size is outside the modeset area.*/
> +		igt_plane_set_size(d->plane2, mode->hdisplay + 100, mode->vdisplay + 100);
> +		igt_display_commit2(display, COMMIT_ATOMIC);
> +		/* disbale above 2planes*/
> +		igt_plane_set_fb(d->plane1, NULL);
> +		igt_plane_set_position(d->plane1, 0, 0);
> +		igt_plane_set_fb(d->plane2, NULL);
> +		igt_plane_set_position(d->plane2, 0, 0);
> +		if (d->fb_id2) {
> +			igt_remove_fb(d->drm_fd, &d->fb2);
> +			d->fb_id2 = 0;
> +		}
> +		if (d->fb_id3) {
> +			igt_remove_fb(d->drm_fd, &d->fb3);
> +			d->fb_id3 = 0;
> +		}
> +	}
> +}
> +
> +void test_scaler_with_multi_pipe_plane(data_t *d)

^^ static

> +{
> +	igt_display_t *display = &d->display;
> +	igt_output_t *output1, *output2;
> +	/*check whether 2 connectors are active .*/
> +	igt_skip_on(display->n_outputs < 2);
> +	output1 = get_next_valid_output(display, 1);
> +	output2 = get_next_valid_output(display, 2);
> +	igt_output_set_pipe(output1, 0);
> +	igt_output_set_pipe(output2, 1);
> +	d->plane1 = igt_output_get_plane_type(output1, DRM_PLANE_TYPE_PRIMARY);
> +	d->plane2 = igt_output_get_plane_type(output1, DRM_PLANE_TYPE_OVERLAY);
> +	d->plane3 = igt_output_get_plane_type(output2, DRM_PLANE_TYPE_PRIMARY);
> +	d->plane4 = igt_output_get_plane_type(output2, DRM_PLANE_TYPE_OVERLAY);
> +	drmModeModeInfo *mode1, *mode2;
> +	mode1 = igt_output_get_mode(output1);
> +	mode2 = igt_output_get_mode(output2);
> +	/* allocate fb with mode size */
> +	d->fb_id1 = igt_create_pattern_fb(d->drm_fd, mode1->hdisplay, mode1->vdisplay,
> +					DRM_FORMAT_XRGB8888, LOCAL_I915_FORMAT_MOD_X_TILED, /* tiled */
> +					&d->fb1);
> +	igt_assert(d->fb_id1);
> +
> +	d->fb_id2 = igt_create_pattern_fb(d->drm_fd,
> +					  mode1->hdisplay, mode1->vdisplay,
> +					  DRM_FORMAT_XRGB8888,
> +					  LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
> +					  &d->fb2);
> +	igt_assert(d->fb_id2);
> +	d->fb_id3 = igt_create_pattern_fb(d->drm_fd, mode2->hdisplay, mode2->vdisplay,
> +					DRM_FORMAT_XRGB8888,
> +					LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
> +					&d->fb3);
> +	igt_assert(d->fb_id3);
> +
> +	d->fb_id4 = igt_create_pattern_fb(d->drm_fd,
> +					  mode2->hdisplay, mode2->vdisplay,
> +					  DRM_FORMAT_XRGB8888,
> +					  LOCAL_DRM_FORMAT_MOD_NONE, /* tiled */
> +					  &d->fb4);
> +	igt_assert(d->fb_id4);
> +	/* Set up display with plane 1 */
> +	igt_plane_set_fb(d->plane1, &d->fb1);
> +	igt_plane_set_fb(d->plane2, &d->fb2);
> +	igt_plane_set_fb(d->plane3, &d->fb3);
> +	igt_plane_set_fb(d->plane4, &d->fb4);
> +
> +	/* plane upscaling  on 2 planes*/
> +	igt_fb_set_position(&d->fb1, d->plane1, 0, 0);
> +	igt_fb_set_size(&d->fb1, d->plane1, 300, 300);
> +	igt_plane_set_position(d->plane1, 100, 100);
> +	igt_plane_set_size(d->plane1, mode1->hdisplay - 100, mode1->vdisplay - 50);
> +
> +	igt_fb_set_position(&d->fb2, d->plane2, 100, 100);
> +	igt_fb_set_size(&d->fb2, d->plane2, d->fb2.width - 100, d->fb2.height - 100);
> +	igt_plane_set_position(d->plane2, 100, 100);
> +	/* downscale by 50 pixels*/
> +	igt_plane_set_size(d->plane2, d->fb2.width - 150, d->fb2.height - 150);
> +
> +	igt_fb_set_position(&d->fb3, d->plane3, 0, 0);
> +	igt_fb_set_size(&d->fb3, d->plane3, 400, 400);
> +	igt_plane_set_position(d->plane3, 100, 100);
> +	igt_plane_set_size(d->plane3, mode2->hdisplay - 50, mode2->vdisplay - 50);
> +
> +	igt_fb_set_position(&d->fb4, d->plane4, 100, 100);
> +	igt_fb_set_size(&d->fb2, d->plane4, d->fb4.width - 100, d->fb4.height - 100);
> +	igt_plane_set_position(d->plane4, 100, 100);
> +	/* downscale by 50 pixels*/
> +	igt_plane_set_size(d->plane4, d->fb4.width - 150, d->fb4.height - 150);
> +
> +	igt_display_commit2(display, COMMIT_ATOMIC);
> +	/* disbale above 4 planes*/
> +	igt_plane_set_fb(d->plane1, NULL);
> +	igt_plane_set_position(d->plane1, 0, 0);
> +	igt_plane_set_fb(d->plane2, NULL);
> +	igt_plane_set_position(d->plane2, 0, 0);
> +	igt_plane_set_fb(d->plane3, NULL);
> +	igt_plane_set_position(d->plane3, 0, 0);
> +	igt_plane_set_fb(d->plane4, NULL);
> +	igt_plane_set_position(d->plane4, 0, 0);
> +	if (d->fb_id1) {
> +		igt_remove_fb(d->drm_fd, &d->fb1);
> +		d->fb_id1 = 0;
> +	}
> +	if (d->fb_id2) {
> +		igt_remove_fb(d->drm_fd, &d->fb2);
> +		d->fb_id2 = 0;
> +	}
> +	if (d->fb_id3) {
> +		igt_remove_fb(d->drm_fd, &d->fb3);
> +		d->fb_id3 = 0;
> +	}
> +	if (d->fb_id4) {
> +		igt_remove_fb(d->drm_fd, &d->fb4);
> +		d->fb_id4 = 0;
> +	}
> +}
> +igt_main
>   {
>   	data_t data = {};
>   
> @@ -308,11 +765,26 @@ igt_simple_main
>   	data.drm_fd = drm_open_driver(DRIVER_INTEL);
>   	igt_require_pipe_crc(data.drm_fd);
>   	igt_display_init(&data.display, data.drm_fd);
> +	igt_require(data.display.is_atomic);
>   	data.devid = intel_get_drm_devid(data.drm_fd);
>   
>   	data.num_scalers = intel_gen(data.devid) >= 9 ? 2 : 0;
>   
> -	test_plane_scaling(&data);
> -
> +	//test_plane_scaling(&data);

^^ this comment probably is not needed.

> +	igt_subtest_f("scaler_with_pixel_format") {
> +		test_scaler_with_pixel_format(&data);
> +	}
> +	igt_subtest_f("scaler_with_rotation") {
> +		test_scaler_with_rotation(&data);
> +	}
> +	igt_subtest_f("scaler_with_multiple_planes") {
> +		test_scaler_with_multiple_planes(&data);
> +	}
> +	igt_subtest_f("scaler_with_clipping_clamping") {
> +		test_scaler_with_clipping_clamping_scenario(&data);
> +	}
> +	igt_subtest_f("scaler_with_multi_pipe_plane") {
> +		test_scaler_with_multi_pipe_plane(&data);
> +	}
>   	igt_display_fini(&data.display);
>   }
> 

I think this test need to add checks if commits succeeded in the first 
place. For testing of scalers I did not spot anything that would test 
validity, I mean did the scaler actually produce expected scaled image.

/Juha-Pekka
Srinivas, Vidya Nov. 27, 2017, 6:09 a.m. UTC | #2
> -----Original Message-----
> From: Latvala, Petri
> Sent: Friday, November 24, 2017 2:58 PM
> To: Srinivas, Vidya <vidya.srinivas@intel.com>
> Cc: intel-gfx@lists.freedesktop.org
> Subject: Re: [Intel-gfx] [PATCH i-g-t] i-g-t: kms_plane_scaling: Enhanced
> scaling tests
> 
> On Wed, Nov 22, 2017 at 01:45:04PM +0530, Vidya Srinivas wrote:
> > From: Jyoti Yadav <jyoti.r.yadav@intel.com>
> >
> > Added subtests to cover below gaps.
> > 	1. scaler with pixelformat and tiling.
> > 	2. scaler with rotation
> > 	3. scaler with multiple planes
> > 	4. scaler with multi pipe
> > 	5. scaler with clipping/clamping scenario
> >
> > Signed-off-by: Jyoti Yadav <jyoti.r.yadav@intel.com>
> > ---
> >  tests/kms_plane_scaling.c | 480
> > +++++++++++++++++++++++++++++++++++++++++++++-
> >  1 file changed, 476 insertions(+), 4 deletions(-)
> >
> > diff --git a/tests/kms_plane_scaling.c b/tests/kms_plane_scaling.c
> > index 403df47..2be6acc 100644
> > --- a/tests/kms_plane_scaling.c
> > +++ b/tests/kms_plane_scaling.c
> > @@ -43,10 +43,11 @@ typedef struct {
> >  	struct igt_fb fb1;
> >  	struct igt_fb fb2;
> >  	struct igt_fb fb3;
> > +	struct igt_fb fb4;
> >  	int fb_id1;
> >  	int fb_id2;
> >  	int fb_id3;
> > -
> > +	int fb_id4;
> >  	igt_plane_t *plane1;
> >  	igt_plane_t *plane2;
> >  	igt_plane_t *plane3;
> > @@ -54,6 +55,51 @@ typedef struct {
> >  } data_t;
> >
> >  #define FILE_NAME   "1080p-left.png"
> > +#define MIN_SRC_WIDTH 8
> > +#define MAX_SRC_WIDTH 4096
> > +static uint32_t check_pixel_format(uint32_t pixel_format) {
> > +	const uint32_t *igt_formats;
> > +	int num_igt_formats;
> > +	int i;
> > +
> > +
> > +	igt_get_all_cairo_formats(&igt_formats, &num_igt_formats);
> > +	for (i = 0; i < num_igt_formats; i++) {
> > +		if (pixel_format == igt_formats[i])
> > +			return 0;
> > +	}
> > +
> > +	return -1;
> > +}
> > +bool is_igt_output_connected(igt_output_t *output) {
> > +	/* Something went wrong during probe? */
> > +	if (!output->config.connector)
> > +		return false;
> > +
> > +	if (output->config.connector->connection ==
> DRM_MODE_CONNECTED)
> > +		return true;
> > +
> > +	return false;
> > +}
> > +
> > +static igt_output_t *get_next_valid_output(igt_display_t *data, int
> > +i) {
> > +	int j = 0, valid_output = 0;
> > +	drmModeModeInfo *mode;
> > +	for (j = 0; j < data->n_outputs; j++) {
> > +		if (is_igt_output_connected(&data->outputs[j])) {
> > +			mode = igt_output_get_mode(&data->outputs[j]);
> > +			if (mode->hdisplay != 0 && mode->vdisplay != 0) {
> > +				valid_output++;
> > +				if (valid_output == i)
> > +					return &data->outputs[j];
> > +			}
> > +		}
> > +	}
> > +	return NULL;
> > +}
> >
> >  static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe
> pipe,
> >  			igt_plane_t *plane, drmModeModeInfo *mode,
> enum igt_commit_style
> > s) @@ -298,7 +344,418 @@ static void test_plane_scaling(data_t *d)
> >  	igt_require_f(valid_tests, "no valid crtc/connector combinations
> > found\n");  }
> >
> > -igt_simple_main
> > +uint64_t get_tiling(int i)
> > +{
> > +	switch (i) {
> > +	case 0:
> > +		return LOCAL_DRM_FORMAT_MOD_NONE;
> > +		break;
> > +	case 1:
> > +		return LOCAL_I915_FORMAT_MOD_X_TILED;
> > +		break;
> > +	case 2:
> > +		return LOCAL_I915_FORMAT_MOD_Y_TILED;
> > +		break;
> > +	case 3:
> > +		return LOCAL_I915_FORMAT_MOD_Yf_TILED;
> > +		break;
> > +	default:
> > +		return -1;
> > +	}
> > +}
> > +
> > +void loop_plane_scaling(data_t *d, igt_plane_t *plane, uint32_t
> pixel_format,
> > +			uint64_t tiling, enum pipe pipe, igt_output_t
> *output) {
> > +	igt_display_t *display = &d->display;
> > +	int width, height;
> > +	/* create buffer in the range of  min and max source side limit.*/
> > +	for (width = MIN_SRC_WIDTH; width <= MAX_SRC_WIDTH; width =
> width + 500) {
> > +		igt_output_set_pipe(output, pipe);
> > +		height = width + 10;
> > +		d->fb_id1 = igt_create_pattern_fb(display->drm_fd, width,
> height,
> > +						pixel_format, tiling, &d-
> >fb1);
> > +		igt_assert(d->fb_id1);
> > +		igt_plane_set_fb(plane, &d->fb1);
> > +		/* check upscaling */
> > +		igt_fb_set_position(&d->fb1, plane, 0, 0);
> > +		igt_fb_set_size(&d->fb1, plane, d->fb1.width, d-
> >fb1.height);
> > +		igt_plane_set_position(plane, 10, 10);
> > +		igt_plane_set_size(plane, width*2, height*2);
> > +		igt_display_commit2(display, COMMIT_ATOMIC);
> > +		igt_plane_set_fb(plane, NULL);
> > +		igt_plane_set_position(plane, 0, 0);
> > +		if (d->fb_id1) {
> > +			igt_remove_fb(d->drm_fd, &d->fb1);
> > +			d->fb_id1 = 0;
> > +		}
> > +	}
> > +}
> > +void test_scaler_with_pixel_format(data_t *d) {
> > +	igt_display_t *display = &d->display;
> > +	igt_output_t *output;
> > +	enum pipe pipe;
> > +	igt_plane_t *plane;
> > +	int valid_tests = 0;
> > +	igt_require(d->num_scalers);
> > +	for_each_pipe_with_valid_output(display, pipe, output) {
> > +		drmModeModeInfo *mode;
> > +		igt_output_set_pipe(output, pipe);
> > +		mode = igt_output_get_mode(output);
> > +		for_each_plane_on_pipe(display, pipe, plane) {
> > +			/* check if plane is cursor. */
> > +			if (plane->type == DRM_PLANE_TYPE_CURSOR)
> > +				continue;
> > +			/* run loop for all pixel formats.*/
> > +			drmModePlanePtr plane_kms;
> > +			plane_kms = plane->drm_plane;
> > +			for (int j = 0; j < plane_kms->count_formats; j++) {
> > +				/* check plane pixel format is supported in
> > +				 * cairo pixel formats.
> > +				 */
> > +				if (check_pixel_format(plane_kms-
> >formats[j])	== 0) {
> > +					/* loop for tiling */
> > +					igt_require_fb_modifiers(d-
> >drm_fd);
> > +					for (int i = 0; i < 4; i++) {
> > +						uint64_t tiling = get_tiling(i);
> > +						loop_plane_scaling(d, plane,
> plane_kms->formats[j],
> > +								tiling, pipe,
> output);
> > +					}
> > +				}
> > +			}
> > +		}
> > +	}
> > +}
> > +
> > +static igt_rotation_t get_rotation_angle(int i) {
> > +	switch (i) {
> > +	case 0:
> > +		return IGT_ROTATION_0;
> > +		break;
> > +	case 1:
> > +		return IGT_ROTATION_90;
> > +		break;
> > +	case 2:
> > +		return IGT_ROTATION_180;
> > +		break;
> > +	case 3:
> > +		return IGT_ROTATION_270;
> > +		break;
> > +	default:
> > +		return -1;
> > +	}
> > +}
> > +
> > +void test_scaler_with_rotation(data_t *d) {
> > +	igt_display_t *display = &d->display;
> > +	igt_output_t *output;
> > +	enum pipe pipe;
> > +	igt_plane_t *plane;
> > +	int valid_tests = 0;
> > +	igt_require(d->num_scalers);
> > +	for_each_pipe_with_valid_output(display, pipe, output) {
> > +		drmModeModeInfo *mode;
> > +		mode = igt_output_get_mode(output);
> > +		for_each_plane_on_pipe(display, pipe, plane) {
> > +			if (plane->type == DRM_PLANE_TYPE_CURSOR)
> > +				continue;
> > +			/* run loop for all pixel formats.*/
> > +			drmModePlanePtr plane_kms;
> > +			plane_kms = plane->drm_plane;
> > +			for (int j = 0; j < plane_kms->count_formats; j++) {
> > +				/* 90/270 degree rotation is not supported
> on RGB565 and C8 pixel
> > +				 * formats
> > +				 */
> > +				if (plane_kms->formats[j] ==
> DRM_FORMAT_RGB565 ||
> > +					plane_kms->formats[j] ==
> DRM_FORMAT_C8) {
> > +					continue;
> > +				}
> > +				if (check_pixel_format(plane_kms-
> >formats[j]) == 0) {
> > +					igt_output_set_pipe(output, pipe);
> > +					d->fb_id1 =
> igt_create_pattern_fb(display->drm_fd,
> > +
> mode->hdisplay, mode->vdisplay,
> > +
> plane_kms->formats[j],
> > +
> LOCAL_I915_FORMAT_MOD_Y_TILED, &d->fb1);
> > +					igt_assert(d->fb_id1);
> > +					/* check all the supported rotation
> format*/
> > +					for (int i = 0; i < 4; i++) {
> > +						igt_plane_set_fb(plane, &d-
> >fb1);
> > +						/* check upscaling */
> > +						igt_fb_set_position(&d->fb1,
> plane, 0, 0);
> > +						igt_fb_set_size(&d->fb1,
> plane, 300, 400);
> > +
> 	igt_plane_set_position(plane, 0, 0);
> > +						igt_plane_set_size(plane,
> mode->hdisplay-200, mode->vdisplay-200);
> > +
> 	igt_plane_set_rotation(plane, get_rotation_angle(i));
> > +
> 	igt_display_commit2(display, COMMIT_ATOMIC);
> > +						/* check downscaling */
> > +						igt_fb_set_position(&d->fb1,
> plane, 0, 0);
> > +						igt_fb_set_size(&d->fb1,
> plane, 300, 400);
> > +
> 	igt_plane_set_position(plane, 0, 0);
> > +						igt_plane_set_size(plane,
> 350, 250); /* downscale by 50 pixels*/
> > +
> 	igt_plane_set_rotation(plane, get_rotation_angle(i));
> > +
> 	igt_display_commit2(display, COMMIT_ATOMIC);
> > +						/* disable Plane*/
> > +						igt_plane_set_fb(plane,
> NULL);
> > +
> 	igt_plane_set_position(plane, 0, 0);
> > +					}
> > +					if (d->fb_id1) {
> > +						igt_remove_fb(d->drm_fd,
> &d->fb1);
> > +						d->fb_id1 = 0;
> > +					}
> > +				}
> > +			}
> > +		}
> > +	}
> > +}
> > +
> > +void test_scaler_with_multiple_planes(data_t *d) {
> > +	igt_display_t *display = &d->display;
> > +	igt_output_t *output;
> > +	enum pipe pipe;
> > +	int valid_tests = 0;
> > +	igt_require(d->num_scalers);
> > +	for_each_pipe_with_valid_output(display, pipe, output) {
> > +		/* For Gen 9, Pipe C supports only 1 scaler*/
> > +		if (intel_gen(d->devid) == 9 && pipe == PIPE_C)
> > +			continue;
> > +		drmModeModeInfo *mode;
> > +		igt_output_set_pipe(output, pipe);
> > +		mode = igt_output_get_mode(output);
> > +		/* Create 2 Framebuffers */
> > +		d->fb_id2 = igt_create_pattern_fb(d->drm_fd, mode-
> >hdisplay, mode->vdisplay,
> > +						DRM_FORMAT_XRGB8888,
> > +
> 	LOCAL_I915_FORMAT_MOD_X_TILED, /* tiled */
> > +						&d->fb2);
> > +		igt_assert(d->fb_id2);
> > +
> > +		d->fb_id3 = igt_create_pattern_fb(d->drm_fd,
> > +						  mode->hdisplay, mode-
> >vdisplay,
> > +						  DRM_FORMAT_XRGB8888,
> > +
> LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
> > +						  &d->fb3);
> > +		igt_assert(d->fb_id3);
> > +
> > +		d->plane1 = igt_output_get_plane(output, 0);
> > +		igt_plane_set_fb(d->plane1, &d->fb2);
> > +		d->plane2 = igt_output_get_plane(output, 1);
> > +		igt_plane_set_fb(d->plane2, &d->fb3);
> > +		/* plane upscaling  on 2 planes*/
> > +		igt_fb_set_position(&d->fb2, d->plane1, 0, 0);
> > +		igt_fb_set_size(&d->fb2, d->plane1, 300, 300);
> > +		igt_plane_set_position(d->plane1, 0, 0);
> > +		igt_plane_set_size(d->plane1, 400, 400);
> > +
> > +		igt_fb_set_position(&d->fb3, d->plane2, 0, 0);
> > +		igt_fb_set_size(&d->fb3, d->plane2, 400, 400);
> > +		igt_plane_set_position(d->plane2, 100, 100);
> > +		igt_plane_set_size(d->plane2, 500, 500);
> > +
> > +		igt_display_commit2(display, COMMIT_ATOMIC);
> > +		/* disbale above 2planes*/
> > +		igt_plane_set_fb(d->plane1, NULL);
> > +		igt_plane_set_position(d->plane1, 0, 0);
> > +		igt_plane_set_fb(d->plane2, NULL);
> > +		igt_plane_set_position(d->plane2, 0, 0);
> > +
> > +		/* Switch scaler from above 2 planes to next 2 planes*/
> > +		d->plane3 = igt_output_get_plane(output, 2);
> > +		igt_plane_set_fb(d->plane3, &d->fb2);
> > +		d->plane4 = igt_output_get_plane(output, 3);
> > +		igt_plane_set_fb(d->plane4, &d->fb3);
> > +
> > +		igt_fb_set_position(&d->fb2, d->plane3, 0, 0);
> > +		igt_fb_set_size(&d->fb2, d->plane3, 300, 300);
> > +		igt_plane_set_position(d->plane3, 0, 0);
> > +		igt_plane_set_size(d->plane3, 600, 600);
> > +
> > +		igt_fb_set_position(&d->fb3, d->plane4, 0, 0);
> > +		igt_fb_set_size(&d->fb3, d->plane4, 400, 400);
> > +		igt_plane_set_position(d->plane4, 100, 100);
> > +		igt_plane_set_size(d->plane4, 700, 700);
> > +
> > +		igt_display_commit2(display, COMMIT_ATOMIC);
> > +		/* disbale above 2planes and remove FB*/
> > +		igt_plane_set_fb(d->plane3, NULL);
> > +		igt_plane_set_position(d->plane3, 0, 0);
> > +		igt_plane_set_fb(d->plane4, NULL);
> > +		igt_plane_set_position(d->plane4, 0, 0);
> > +		if (d->fb_id2) {
> > +			igt_remove_fb(d->drm_fd, &d->fb2);
> > +			d->fb_id2 = 0;
> > +		}
> > +		if (d->fb_id3) {
> > +			igt_remove_fb(d->drm_fd, &d->fb3);
> > +			d->fb_id3 = 0;
> > +		}
> > +	}
> > +}
> > +
> > +void test_scaler_with_clipping_clamping_scenario(data_t *d) {
> > +	igt_display_t *display = &d->display;
> > +	igt_output_t *output;
> > +	enum pipe pipe;
> > +	int valid_tests = 0;
> > +	igt_require(d->num_scalers);
> > +
> > +	for_each_pipe_with_valid_output(display, pipe, output) {
> > +
> > +		if (intel_gen(d->devid) == 9 && pipe == PIPE_C)
> > +			continue;
> > +		drmModeModeInfo *mode;
> > +		igt_output_set_pipe(output, pipe);
> > +		mode = igt_output_get_mode(output);
> > +		/* allocate fb2 and fb3 */
> > +		d->fb_id2 = igt_create_pattern_fb(d->drm_fd, mode-
> >hdisplay, mode->vdisplay,
> > +						DRM_FORMAT_XRGB8888,
> > +
> 	LOCAL_I915_FORMAT_MOD_X_TILED, /* tiled */
> > +						&d->fb2);
> > +		igt_assert(d->fb_id2);
> > +
> > +		d->fb_id3 = igt_create_pattern_fb(d->drm_fd,
> > +						  mode->hdisplay, mode-
> >vdisplay,
> > +						  DRM_FORMAT_XRGB8888,
> > +
> LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
> > +						  &d->fb3);
> > +		igt_assert(d->fb_id3);
> > +
> > +		/* Set up display with plane 1 */
> > +		d->plane1 = igt_output_get_plane(output, 0);
> > +		igt_plane_set_fb(d->plane1, &d->fb2);
> > +		d->plane2 = igt_output_get_plane(output, 1);
> > +		igt_plane_set_fb(d->plane2, &d->fb3);
> > +
> > +		/* plane upscaling  on 2 planes*/
> > +		igt_fb_set_position(&d->fb2, d->plane1, 0, 0);
> > +		igt_fb_set_size(&d->fb2, d->plane1, 300, 300);
> > +		igt_plane_set_position(d->plane1, 100, 400);
> > +		/* scaled window size is outside the modeset area.*/
> > +		igt_plane_set_size(d->plane1, mode->hdisplay + 200, mode-
> >vdisplay
> > ++ 200);
> > +
> > +		igt_fb_set_position(&d->fb3, d->plane2, 0, 0);
> > +		igt_fb_set_size(&d->fb3, d->plane2, 400, 400);
> > +		igt_plane_set_position(d->plane2, 100, 100);
> > +		/* scaled window size is outside the modeset area.*/
> > +		igt_plane_set_size(d->plane2, mode->hdisplay + 100, mode-
> >vdisplay + 100);
> > +		igt_display_commit2(display, COMMIT_ATOMIC);
> > +		/* disbale above 2planes*/
> > +		igt_plane_set_fb(d->plane1, NULL);
> > +		igt_plane_set_position(d->plane1, 0, 0);
> > +		igt_plane_set_fb(d->plane2, NULL);
> > +		igt_plane_set_position(d->plane2, 0, 0);
> > +		if (d->fb_id2) {
> > +			igt_remove_fb(d->drm_fd, &d->fb2);
> > +			d->fb_id2 = 0;
> > +		}
> > +		if (d->fb_id3) {
> > +			igt_remove_fb(d->drm_fd, &d->fb3);
> > +			d->fb_id3 = 0;
> > +		}
> > +	}
> > +}
> > +
> > +void test_scaler_with_multi_pipe_plane(data_t *d) {
> > +	igt_display_t *display = &d->display;
> > +	igt_output_t *output1, *output2;
> > +	/*check whether 2 connectors are active .*/
> > +	igt_skip_on(display->n_outputs < 2);
> > +	output1 = get_next_valid_output(display, 1);
> > +	output2 = get_next_valid_output(display, 2);
> > +	igt_output_set_pipe(output1, 0);
> > +	igt_output_set_pipe(output2, 1);
> > +	d->plane1 = igt_output_get_plane_type(output1,
> DRM_PLANE_TYPE_PRIMARY);
> > +	d->plane2 = igt_output_get_plane_type(output1,
> DRM_PLANE_TYPE_OVERLAY);
> > +	d->plane3 = igt_output_get_plane_type(output2,
> DRM_PLANE_TYPE_PRIMARY);
> > +	d->plane4 = igt_output_get_plane_type(output2,
> DRM_PLANE_TYPE_OVERLAY);
> > +	drmModeModeInfo *mode1, *mode2;
> > +	mode1 = igt_output_get_mode(output1);
> > +	mode2 = igt_output_get_mode(output2);
> > +	/* allocate fb with mode size */
> > +	d->fb_id1 = igt_create_pattern_fb(d->drm_fd, mode1->hdisplay,
> mode1->vdisplay,
> > +					DRM_FORMAT_XRGB8888,
> LOCAL_I915_FORMAT_MOD_X_TILED, /* tiled */
> > +					&d->fb1);
> > +	igt_assert(d->fb_id1);
> > +
> > +	d->fb_id2 = igt_create_pattern_fb(d->drm_fd,
> > +					  mode1->hdisplay, mode1->vdisplay,
> > +					  DRM_FORMAT_XRGB8888,
> > +
> LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
> > +					  &d->fb2);
> > +	igt_assert(d->fb_id2);
> > +	d->fb_id3 = igt_create_pattern_fb(d->drm_fd, mode2->hdisplay,
> mode2->vdisplay,
> > +					DRM_FORMAT_XRGB8888,
> > +
> 	LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
> > +					&d->fb3);
> > +	igt_assert(d->fb_id3);
> > +
> > +	d->fb_id4 = igt_create_pattern_fb(d->drm_fd,
> > +					  mode2->hdisplay, mode2->vdisplay,
> > +					  DRM_FORMAT_XRGB8888,
> > +
> LOCAL_DRM_FORMAT_MOD_NONE, /* tiled */
> > +					  &d->fb4);
> > +	igt_assert(d->fb_id4);
> > +	/* Set up display with plane 1 */
> > +	igt_plane_set_fb(d->plane1, &d->fb1);
> > +	igt_plane_set_fb(d->plane2, &d->fb2);
> > +	igt_plane_set_fb(d->plane3, &d->fb3);
> > +	igt_plane_set_fb(d->plane4, &d->fb4);
> > +
> > +	/* plane upscaling  on 2 planes*/
> > +	igt_fb_set_position(&d->fb1, d->plane1, 0, 0);
> > +	igt_fb_set_size(&d->fb1, d->plane1, 300, 300);
> > +	igt_plane_set_position(d->plane1, 100, 100);
> > +	igt_plane_set_size(d->plane1, mode1->hdisplay - 100, mode1-
> >vdisplay
> > +- 50);
> > +
> > +	igt_fb_set_position(&d->fb2, d->plane2, 100, 100);
> > +	igt_fb_set_size(&d->fb2, d->plane2, d->fb2.width - 100, d-
> >fb2.height - 100);
> > +	igt_plane_set_position(d->plane2, 100, 100);
> > +	/* downscale by 50 pixels*/
> > +	igt_plane_set_size(d->plane2, d->fb2.width - 150, d->fb2.height -
> > +150);
> > +
> > +	igt_fb_set_position(&d->fb3, d->plane3, 0, 0);
> > +	igt_fb_set_size(&d->fb3, d->plane3, 400, 400);
> > +	igt_plane_set_position(d->plane3, 100, 100);
> > +	igt_plane_set_size(d->plane3, mode2->hdisplay - 50, mode2-
> >vdisplay
> > +- 50);
> > +
> > +	igt_fb_set_position(&d->fb4, d->plane4, 100, 100);
> > +	igt_fb_set_size(&d->fb2, d->plane4, d->fb4.width - 100, d-
> >fb4.height - 100);
> > +	igt_plane_set_position(d->plane4, 100, 100);
> > +	/* downscale by 50 pixels*/
> > +	igt_plane_set_size(d->plane4, d->fb4.width - 150, d->fb4.height -
> > +150);
> > +
> > +	igt_display_commit2(display, COMMIT_ATOMIC);
> > +	/* disbale above 4 planes*/
> > +	igt_plane_set_fb(d->plane1, NULL);
> > +	igt_plane_set_position(d->plane1, 0, 0);
> > +	igt_plane_set_fb(d->plane2, NULL);
> > +	igt_plane_set_position(d->plane2, 0, 0);
> > +	igt_plane_set_fb(d->plane3, NULL);
> > +	igt_plane_set_position(d->plane3, 0, 0);
> > +	igt_plane_set_fb(d->plane4, NULL);
> > +	igt_plane_set_position(d->plane4, 0, 0);
> > +	if (d->fb_id1) {
> > +		igt_remove_fb(d->drm_fd, &d->fb1);
> > +		d->fb_id1 = 0;
> > +	}
> > +	if (d->fb_id2) {
> > +		igt_remove_fb(d->drm_fd, &d->fb2);
> > +		d->fb_id2 = 0;
> > +	}
> > +	if (d->fb_id3) {
> > +		igt_remove_fb(d->drm_fd, &d->fb3);
> > +		d->fb_id3 = 0;
> > +	}
> > +	if (d->fb_id4) {
> > +		igt_remove_fb(d->drm_fd, &d->fb4);
> > +		d->fb_id4 = 0;
> > +	}
> > +}
> > +igt_main
> >  {
> >  	data_t data = {};
> >
> > @@ -308,11 +765,26 @@ igt_simple_main
> >  	data.drm_fd = drm_open_driver(DRIVER_INTEL);
> >  	igt_require_pipe_crc(data.drm_fd);
> >  	igt_display_init(&data.display, data.drm_fd);
> > +	igt_require(data.display.is_atomic);
> >  	data.devid = intel_get_drm_devid(data.drm_fd);
> >
> 
> 
> The CI results are cut off before the important parts that state what's wrong
> here. The test that fails is igt_command_line.sh. You can run the script
> directly yourself to see the output.
> 
> You're changing a test-without-subtests to one with subtests, and that
> means you need to do stuff like drm_open_driver() inside an igt_fixture.
> 
>

Thank you very much. I will include things you mentioned to see if it runs clearly.

Regards
Vidya
 
> --
> Petri Latvala
> 
> 
> 
> >  	data.num_scalers = intel_gen(data.devid) >= 9 ? 2 : 0;
> >
> > -	test_plane_scaling(&data);
> > -
> > +	//test_plane_scaling(&data);
> > +	igt_subtest_f("scaler_with_pixel_format") {
> > +		test_scaler_with_pixel_format(&data);
> > +	}
> > +	igt_subtest_f("scaler_with_rotation") {
> > +		test_scaler_with_rotation(&data);
> > +	}
> > +	igt_subtest_f("scaler_with_multiple_planes") {
> > +		test_scaler_with_multiple_planes(&data);
> > +	}
> > +	igt_subtest_f("scaler_with_clipping_clamping") {
> > +		test_scaler_with_clipping_clamping_scenario(&data);
> > +	}
> > +	igt_subtest_f("scaler_with_multi_pipe_plane") {
> > +		test_scaler_with_multi_pipe_plane(&data);
> > +	}
> >  	igt_display_fini(&data.display);
> >  }
> > --
> > 2.7.4
> >
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Daniel Vetter Nov. 27, 2017, 9:16 a.m. UTC | #3
Somehow I forgot to send out my irc feedback to the m-l.

On Wed, Nov 22, 2017 at 9:15 AM, Vidya Srinivas
<vidya.srinivas@intel.com> wrote:
> +igt_main
>  {
>         data_t data = {};
>
> @@ -308,11 +765,26 @@ igt_simple_main
>         data.drm_fd = drm_open_driver(DRIVER_INTEL);
>         igt_require_pipe_crc(data.drm_fd);
>         igt_display_init(&data.display, data.drm_fd);
> +       igt_require(data.display.is_atomic);
>         data.devid = intel_get_drm_devid(data.drm_fd);
>
>         data.num_scalers = intel_gen(data.devid) >= 9 ? 2 : 0;
>
> -       test_plane_scaling(&data);
> -
> +       //test_plane_scaling(&data);
> +       igt_subtest_f("scaler_with_pixel_format") {
> +               test_scaler_with_pixel_format(&data);
> +       }
> +       igt_subtest_f("scaler_with_rotation") {
> +               test_scaler_with_rotation(&data);
> +       }
> +       igt_subtest_f("scaler_with_multiple_planes") {
> +               test_scaler_with_multiple_planes(&data);
> +       }
> +       igt_subtest_f("scaler_with_clipping_clamping") {
> +               test_scaler_with_clipping_clamping_scenario(&data);
> +       }
> +       igt_subtest_f("scaler_with_multi_pipe_plane") {
> +               test_scaler_with_multi_pipe_plane(&data);
> +       }

Commenting out the existing testcase and replacing it with new ones
entirely, without explaining what's wrong with the old one, or
removing it (we have git for source control, not comments), and how
new tests are better isn't how we do things. Presumably the existing
tests once worked, so the first step should be to fix that up first
and explain why the changes are necessary. When this code was typed 2
years ago someone put some thought into it, throwing all that work
away isn't good.

And _then_ (in follow-up patches) fix the gaps in test coverage.

Thanks, Daniel

>         igt_display_fini(&data.display);
>  }
> --
> 2.7.4
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Srinivas, Vidya Nov. 27, 2017, 9:20 a.m. UTC | #4
> -----Original Message-----

> From: daniel.vetter@ffwll.ch [mailto:daniel.vetter@ffwll.ch] On Behalf Of

> Daniel Vetter

> Sent: Monday, November 27, 2017 2:47 PM

> To: Srinivas, Vidya <vidya.srinivas@intel.com>

> Cc: intel-gfx <intel-gfx@lists.freedesktop.org>

> Subject: Re: [Intel-gfx] [PATCH i-g-t] i-g-t: kms_plane_scaling: Enhanced

> scaling tests

> 

> Somehow I forgot to send out my irc feedback to the m-l.

> 

> On Wed, Nov 22, 2017 at 9:15 AM, Vidya Srinivas

> <vidya.srinivas@intel.com> wrote:

> > +igt_main

> >  {

> >         data_t data = {};

> >

> > @@ -308,11 +765,26 @@ igt_simple_main

> >         data.drm_fd = drm_open_driver(DRIVER_INTEL);

> >         igt_require_pipe_crc(data.drm_fd);

> >         igt_display_init(&data.display, data.drm_fd);

> > +       igt_require(data.display.is_atomic);

> >         data.devid = intel_get_drm_devid(data.drm_fd);

> >

> >         data.num_scalers = intel_gen(data.devid) >= 9 ? 2 : 0;

> >

> > -       test_plane_scaling(&data);

> > -

> > +       //test_plane_scaling(&data);

> > +       igt_subtest_f("scaler_with_pixel_format") {

> > +               test_scaler_with_pixel_format(&data);

> > +       }

> > +       igt_subtest_f("scaler_with_rotation") {

> > +               test_scaler_with_rotation(&data);

> > +       }

> > +       igt_subtest_f("scaler_with_multiple_planes") {

> > +               test_scaler_with_multiple_planes(&data);

> > +       }

> > +       igt_subtest_f("scaler_with_clipping_clamping") {

> > +               test_scaler_with_clipping_clamping_scenario(&data);

> > +       }

> > +       igt_subtest_f("scaler_with_multi_pipe_plane") {

> > +               test_scaler_with_multi_pipe_plane(&data);

> > +       }

> 

> Commenting out the existing testcase and replacing it with new ones

> entirely, without explaining what's wrong with the old one, or removing it

> (we have git for source control, not comments), and how new tests are

> better isn't how we do things. Presumably the existing tests once worked, so

> the first step should be to fix that up first and explain why the changes are

> necessary. When this code was typed 2 years ago someone put some

> thought into it, throwing all that work away isn't good.

> 

> And _then_ (in follow-up patches) fix the gaps in test coverage.

> 

> Thanks, Daniel


Thank you. I think the explanation was missing. This test with format
will enhance the existing cases. I will work on these and re-submit the same.

Regards
Vidya

> 

> >         igt_display_fini(&data.display);  }

> > --

> > 2.7.4

> >

> > _______________________________________________

> > Intel-gfx mailing list

> > Intel-gfx@lists.freedesktop.org

> > https://lists.freedesktop.org/mailman/listinfo/intel-gfx

> 

> 

> 

> --

> Daniel Vetter

> Software Engineer, Intel Corporation

> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
Daniel Vetter Nov. 29, 2017, 10:42 a.m. UTC | #5
On Mon, Nov 27, 2017 at 09:20:33AM +0000, Srinivas, Vidya wrote:
> 
> 
> > -----Original Message-----
> > From: daniel.vetter@ffwll.ch [mailto:daniel.vetter@ffwll.ch] On Behalf Of
> > Daniel Vetter
> > Sent: Monday, November 27, 2017 2:47 PM
> > To: Srinivas, Vidya <vidya.srinivas@intel.com>
> > Cc: intel-gfx <intel-gfx@lists.freedesktop.org>
> > Subject: Re: [Intel-gfx] [PATCH i-g-t] i-g-t: kms_plane_scaling: Enhanced
> > scaling tests
> > 
> > Somehow I forgot to send out my irc feedback to the m-l.
> > 
> > On Wed, Nov 22, 2017 at 9:15 AM, Vidya Srinivas
> > <vidya.srinivas@intel.com> wrote:
> > > +igt_main
> > >  {
> > >         data_t data = {};
> > >
> > > @@ -308,11 +765,26 @@ igt_simple_main
> > >         data.drm_fd = drm_open_driver(DRIVER_INTEL);
> > >         igt_require_pipe_crc(data.drm_fd);
> > >         igt_display_init(&data.display, data.drm_fd);
> > > +       igt_require(data.display.is_atomic);
> > >         data.devid = intel_get_drm_devid(data.drm_fd);
> > >
> > >         data.num_scalers = intel_gen(data.devid) >= 9 ? 2 : 0;
> > >
> > > -       test_plane_scaling(&data);
> > > -
> > > +       //test_plane_scaling(&data);

You're commenting out the existing testcase ...

> > > +       igt_subtest_f("scaler_with_pixel_format") {
> > > +               test_scaler_with_pixel_format(&data);
> > > +       }
> > > +       igt_subtest_f("scaler_with_rotation") {
> > > +               test_scaler_with_rotation(&data);
> > > +       }
> > > +       igt_subtest_f("scaler_with_multiple_planes") {
> > > +               test_scaler_with_multiple_planes(&data);
> > > +       }
> > > +       igt_subtest_f("scaler_with_clipping_clamping") {
> > > +               test_scaler_with_clipping_clamping_scenario(&data);
> > > +       }
> > > +       igt_subtest_f("scaler_with_multi_pipe_plane") {
> > > +               test_scaler_with_multi_pipe_plane(&data);
> > > +       }
> > 
> > Commenting out the existing testcase and replacing it with new ones
> > entirely, without explaining what's wrong with the old one, or removing it
> > (we have git for source control, not comments), and how new tests are
> > better isn't how we do things. Presumably the existing tests once worked, so
> > the first step should be to fix that up first and explain why the changes are
> > necessary. When this code was typed 2 years ago someone put some
> > thought into it, throwing all that work away isn't good.
> > 
> > And _then_ (in follow-up patches) fix the gaps in test coverage.
> > 
> > Thanks, Daniel
> 
> Thank you. I think the explanation was missing. This test with format
> will enhance the existing cases. I will work on these and re-submit the same.

Which means it's not enhancing it, it's outright remove it and replacing
with something new. Either you need to show that the existing testcase is
totally broken (with a patch that removes it and explain why it's
unfixable).

Or (and that's really the preferred thing), patch 1 in this series fixes
up the existing test as the first step.
-Daniel
diff mbox

Patch

diff --git a/tests/kms_plane_scaling.c b/tests/kms_plane_scaling.c
index 403df47..2be6acc 100644
--- a/tests/kms_plane_scaling.c
+++ b/tests/kms_plane_scaling.c
@@ -43,10 +43,11 @@  typedef struct {
 	struct igt_fb fb1;
 	struct igt_fb fb2;
 	struct igt_fb fb3;
+	struct igt_fb fb4;
 	int fb_id1;
 	int fb_id2;
 	int fb_id3;
-
+	int fb_id4;
 	igt_plane_t *plane1;
 	igt_plane_t *plane2;
 	igt_plane_t *plane3;
@@ -54,6 +55,51 @@  typedef struct {
 } data_t;
 
 #define FILE_NAME   "1080p-left.png"
+#define MIN_SRC_WIDTH 8
+#define MAX_SRC_WIDTH 4096
+static uint32_t check_pixel_format(uint32_t pixel_format)
+{
+	const uint32_t *igt_formats;
+	int num_igt_formats;
+	int i;
+
+
+	igt_get_all_cairo_formats(&igt_formats, &num_igt_formats);
+	for (i = 0; i < num_igt_formats; i++) {
+		if (pixel_format == igt_formats[i])
+			return 0;
+	}
+
+	return -1;
+}
+bool is_igt_output_connected(igt_output_t *output)
+{
+	/* Something went wrong during probe? */
+	if (!output->config.connector)
+		return false;
+
+	if (output->config.connector->connection == DRM_MODE_CONNECTED)
+		return true;
+
+	return false;
+}
+
+static igt_output_t *get_next_valid_output(igt_display_t *data, int i)
+{
+	int j = 0, valid_output = 0;
+	drmModeModeInfo *mode;
+	for (j = 0; j < data->n_outputs; j++) {
+		if (is_igt_output_connected(&data->outputs[j])) {
+			mode = igt_output_get_mode(&data->outputs[j]);
+			if (mode->hdisplay != 0 && mode->vdisplay != 0) {
+				valid_output++;
+				if (valid_output == i)
+					return &data->outputs[j];
+			}
+		}
+	}
+	return NULL;
+}
 
 static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe,
 			igt_plane_t *plane, drmModeModeInfo *mode, enum igt_commit_style s)
@@ -298,7 +344,418 @@  static void test_plane_scaling(data_t *d)
 	igt_require_f(valid_tests, "no valid crtc/connector combinations found\n");
 }
 
-igt_simple_main
+uint64_t get_tiling(int i)
+{
+	switch (i) {
+	case 0:
+		return LOCAL_DRM_FORMAT_MOD_NONE;
+		break;
+	case 1:
+		return LOCAL_I915_FORMAT_MOD_X_TILED;
+		break;
+	case 2:
+		return LOCAL_I915_FORMAT_MOD_Y_TILED;
+		break;
+	case 3:
+		return LOCAL_I915_FORMAT_MOD_Yf_TILED;
+		break;
+	default:
+		return -1;
+	}
+}
+
+void loop_plane_scaling(data_t *d, igt_plane_t *plane, uint32_t pixel_format,
+			uint64_t tiling, enum pipe pipe, igt_output_t *output)
+{
+	igt_display_t *display = &d->display;
+	int width, height;
+	/* create buffer in the range of  min and max source side limit.*/
+	for (width = MIN_SRC_WIDTH; width <= MAX_SRC_WIDTH; width = width + 500) {
+		igt_output_set_pipe(output, pipe);
+		height = width + 10;
+		d->fb_id1 = igt_create_pattern_fb(display->drm_fd, width, height,
+						pixel_format, tiling, &d->fb1);
+		igt_assert(d->fb_id1);
+		igt_plane_set_fb(plane, &d->fb1);
+		/* check upscaling */
+		igt_fb_set_position(&d->fb1, plane, 0, 0);
+		igt_fb_set_size(&d->fb1, plane, d->fb1.width, d->fb1.height);
+		igt_plane_set_position(plane, 10, 10);
+		igt_plane_set_size(plane, width*2, height*2);
+		igt_display_commit2(display, COMMIT_ATOMIC);
+		igt_plane_set_fb(plane, NULL);
+		igt_plane_set_position(plane, 0, 0);
+		if (d->fb_id1) {
+			igt_remove_fb(d->drm_fd, &d->fb1);
+			d->fb_id1 = 0;
+		}
+	}
+}
+void test_scaler_with_pixel_format(data_t *d)
+{
+	igt_display_t *display = &d->display;
+	igt_output_t *output;
+	enum pipe pipe;
+	igt_plane_t *plane;
+	int valid_tests = 0;
+	igt_require(d->num_scalers);
+	for_each_pipe_with_valid_output(display, pipe, output) {
+		drmModeModeInfo *mode;
+		igt_output_set_pipe(output, pipe);
+		mode = igt_output_get_mode(output);
+		for_each_plane_on_pipe(display, pipe, plane) {
+			/* check if plane is cursor. */
+			if (plane->type == DRM_PLANE_TYPE_CURSOR)
+				continue;
+			/* run loop for all pixel formats.*/
+			drmModePlanePtr plane_kms;
+			plane_kms = plane->drm_plane;
+			for (int j = 0; j < plane_kms->count_formats; j++) {
+				/* check plane pixel format is supported in
+				 * cairo pixel formats.
+				 */
+				if (check_pixel_format(plane_kms->formats[j])	== 0) {
+					/* loop for tiling */
+					igt_require_fb_modifiers(d->drm_fd);
+					for (int i = 0; i < 4; i++) {
+						uint64_t tiling = get_tiling(i);
+						loop_plane_scaling(d, plane, plane_kms->formats[j],
+								tiling, pipe, output);
+					}
+				}
+			}
+		}
+	}
+}
+
+static igt_rotation_t get_rotation_angle(int i)
+{
+	switch (i) {
+	case 0:
+		return IGT_ROTATION_0;
+		break;
+	case 1:
+		return IGT_ROTATION_90;
+		break;
+	case 2:
+		return IGT_ROTATION_180;
+		break;
+	case 3:
+		return IGT_ROTATION_270;
+		break;
+	default:
+		return -1;
+	}
+}
+
+void test_scaler_with_rotation(data_t *d)
+{
+	igt_display_t *display = &d->display;
+	igt_output_t *output;
+	enum pipe pipe;
+	igt_plane_t *plane;
+	int valid_tests = 0;
+	igt_require(d->num_scalers);
+	for_each_pipe_with_valid_output(display, pipe, output) {
+		drmModeModeInfo *mode;
+		mode = igt_output_get_mode(output);
+		for_each_plane_on_pipe(display, pipe, plane) {
+			if (plane->type == DRM_PLANE_TYPE_CURSOR)
+				continue;
+			/* run loop for all pixel formats.*/
+			drmModePlanePtr plane_kms;
+			plane_kms = plane->drm_plane;
+			for (int j = 0; j < plane_kms->count_formats; j++) {
+				/* 90/270 degree rotation is not supported on RGB565 and C8 pixel
+				 * formats
+				 */
+				if (plane_kms->formats[j] == DRM_FORMAT_RGB565 ||
+					plane_kms->formats[j] == DRM_FORMAT_C8) {
+					continue;
+				}
+				if (check_pixel_format(plane_kms->formats[j]) == 0) {
+					igt_output_set_pipe(output, pipe);
+					d->fb_id1 = igt_create_pattern_fb(display->drm_fd,
+									  mode->hdisplay, mode->vdisplay,
+									  plane_kms->formats[j],
+									  LOCAL_I915_FORMAT_MOD_Y_TILED, &d->fb1);
+					igt_assert(d->fb_id1);
+					/* check all the supported rotation format*/
+					for (int i = 0; i < 4; i++) {
+						igt_plane_set_fb(plane, &d->fb1);
+						/* check upscaling */
+						igt_fb_set_position(&d->fb1, plane, 0, 0);
+						igt_fb_set_size(&d->fb1, plane, 300, 400);
+						igt_plane_set_position(plane, 0, 0);
+						igt_plane_set_size(plane, mode->hdisplay-200, mode->vdisplay-200);
+						igt_plane_set_rotation(plane, get_rotation_angle(i));
+						igt_display_commit2(display, COMMIT_ATOMIC);
+						/* check downscaling */
+						igt_fb_set_position(&d->fb1, plane, 0, 0);
+						igt_fb_set_size(&d->fb1, plane, 300, 400);
+						igt_plane_set_position(plane, 0, 0);
+						igt_plane_set_size(plane, 350, 250); /* downscale by 50 pixels*/
+						igt_plane_set_rotation(plane, get_rotation_angle(i));
+						igt_display_commit2(display, COMMIT_ATOMIC);
+						/* disable Plane*/
+						igt_plane_set_fb(plane, NULL);
+						igt_plane_set_position(plane, 0, 0);
+					}
+					if (d->fb_id1) {
+						igt_remove_fb(d->drm_fd, &d->fb1);
+						d->fb_id1 = 0;
+					}
+				}
+			}
+		}
+	}
+}
+
+void test_scaler_with_multiple_planes(data_t *d)
+{
+	igt_display_t *display = &d->display;
+	igt_output_t *output;
+	enum pipe pipe;
+	int valid_tests = 0;
+	igt_require(d->num_scalers);
+	for_each_pipe_with_valid_output(display, pipe, output) {
+		/* For Gen 9, Pipe C supports only 1 scaler*/
+		if (intel_gen(d->devid) == 9 && pipe == PIPE_C)
+			continue;
+		drmModeModeInfo *mode;
+		igt_output_set_pipe(output, pipe);
+		mode = igt_output_get_mode(output);
+		/* Create 2 Framebuffers */
+		d->fb_id2 = igt_create_pattern_fb(d->drm_fd, mode->hdisplay, mode->vdisplay,
+						DRM_FORMAT_XRGB8888,
+						LOCAL_I915_FORMAT_MOD_X_TILED, /* tiled */
+						&d->fb2);
+		igt_assert(d->fb_id2);
+
+		d->fb_id3 = igt_create_pattern_fb(d->drm_fd,
+						  mode->hdisplay, mode->vdisplay,
+						  DRM_FORMAT_XRGB8888,
+						  LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
+						  &d->fb3);
+		igt_assert(d->fb_id3);
+
+		d->plane1 = igt_output_get_plane(output, 0);
+		igt_plane_set_fb(d->plane1, &d->fb2);
+		d->plane2 = igt_output_get_plane(output, 1);
+		igt_plane_set_fb(d->plane2, &d->fb3);
+		/* plane upscaling  on 2 planes*/
+		igt_fb_set_position(&d->fb2, d->plane1, 0, 0);
+		igt_fb_set_size(&d->fb2, d->plane1, 300, 300);
+		igt_plane_set_position(d->plane1, 0, 0);
+		igt_plane_set_size(d->plane1, 400, 400);
+
+		igt_fb_set_position(&d->fb3, d->plane2, 0, 0);
+		igt_fb_set_size(&d->fb3, d->plane2, 400, 400);
+		igt_plane_set_position(d->plane2, 100, 100);
+		igt_plane_set_size(d->plane2, 500, 500);
+
+		igt_display_commit2(display, COMMIT_ATOMIC);
+		/* disbale above 2planes*/
+		igt_plane_set_fb(d->plane1, NULL);
+		igt_plane_set_position(d->plane1, 0, 0);
+		igt_plane_set_fb(d->plane2, NULL);
+		igt_plane_set_position(d->plane2, 0, 0);
+
+		/* Switch scaler from above 2 planes to next 2 planes*/
+		d->plane3 = igt_output_get_plane(output, 2);
+		igt_plane_set_fb(d->plane3, &d->fb2);
+		d->plane4 = igt_output_get_plane(output, 3);
+		igt_plane_set_fb(d->plane4, &d->fb3);
+
+		igt_fb_set_position(&d->fb2, d->plane3, 0, 0);
+		igt_fb_set_size(&d->fb2, d->plane3, 300, 300);
+		igt_plane_set_position(d->plane3, 0, 0);
+		igt_plane_set_size(d->plane3, 600, 600);
+
+		igt_fb_set_position(&d->fb3, d->plane4, 0, 0);
+		igt_fb_set_size(&d->fb3, d->plane4, 400, 400);
+		igt_plane_set_position(d->plane4, 100, 100);
+		igt_plane_set_size(d->plane4, 700, 700);
+
+		igt_display_commit2(display, COMMIT_ATOMIC);
+		/* disbale above 2planes and remove FB*/
+		igt_plane_set_fb(d->plane3, NULL);
+		igt_plane_set_position(d->plane3, 0, 0);
+		igt_plane_set_fb(d->plane4, NULL);
+		igt_plane_set_position(d->plane4, 0, 0);
+		if (d->fb_id2) {
+			igt_remove_fb(d->drm_fd, &d->fb2);
+			d->fb_id2 = 0;
+		}
+		if (d->fb_id3) {
+			igt_remove_fb(d->drm_fd, &d->fb3);
+			d->fb_id3 = 0;
+		}
+	}
+}
+
+void test_scaler_with_clipping_clamping_scenario(data_t *d)
+{
+	igt_display_t *display = &d->display;
+	igt_output_t *output;
+	enum pipe pipe;
+	int valid_tests = 0;
+	igt_require(d->num_scalers);
+
+	for_each_pipe_with_valid_output(display, pipe, output) {
+
+		if (intel_gen(d->devid) == 9 && pipe == PIPE_C)
+			continue;
+		drmModeModeInfo *mode;
+		igt_output_set_pipe(output, pipe);
+		mode = igt_output_get_mode(output);
+		/* allocate fb2 and fb3 */
+		d->fb_id2 = igt_create_pattern_fb(d->drm_fd, mode->hdisplay, mode->vdisplay,
+						DRM_FORMAT_XRGB8888,
+						LOCAL_I915_FORMAT_MOD_X_TILED, /* tiled */
+						&d->fb2);
+		igt_assert(d->fb_id2);
+
+		d->fb_id3 = igt_create_pattern_fb(d->drm_fd,
+						  mode->hdisplay, mode->vdisplay,
+						  DRM_FORMAT_XRGB8888,
+						  LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
+						  &d->fb3);
+		igt_assert(d->fb_id3);
+
+		/* Set up display with plane 1 */
+		d->plane1 = igt_output_get_plane(output, 0);
+		igt_plane_set_fb(d->plane1, &d->fb2);
+		d->plane2 = igt_output_get_plane(output, 1);
+		igt_plane_set_fb(d->plane2, &d->fb3);
+
+		/* plane upscaling  on 2 planes*/
+		igt_fb_set_position(&d->fb2, d->plane1, 0, 0);
+		igt_fb_set_size(&d->fb2, d->plane1, 300, 300);
+		igt_plane_set_position(d->plane1, 100, 400);
+		/* scaled window size is outside the modeset area.*/
+		igt_plane_set_size(d->plane1, mode->hdisplay + 200, mode->vdisplay + 200);
+
+		igt_fb_set_position(&d->fb3, d->plane2, 0, 0);
+		igt_fb_set_size(&d->fb3, d->plane2, 400, 400);
+		igt_plane_set_position(d->plane2, 100, 100);
+		/* scaled window size is outside the modeset area.*/
+		igt_plane_set_size(d->plane2, mode->hdisplay + 100, mode->vdisplay + 100);
+		igt_display_commit2(display, COMMIT_ATOMIC);
+		/* disbale above 2planes*/
+		igt_plane_set_fb(d->plane1, NULL);
+		igt_plane_set_position(d->plane1, 0, 0);
+		igt_plane_set_fb(d->plane2, NULL);
+		igt_plane_set_position(d->plane2, 0, 0);
+		if (d->fb_id2) {
+			igt_remove_fb(d->drm_fd, &d->fb2);
+			d->fb_id2 = 0;
+		}
+		if (d->fb_id3) {
+			igt_remove_fb(d->drm_fd, &d->fb3);
+			d->fb_id3 = 0;
+		}
+	}
+}
+
+void test_scaler_with_multi_pipe_plane(data_t *d)
+{
+	igt_display_t *display = &d->display;
+	igt_output_t *output1, *output2;
+	/*check whether 2 connectors are active .*/
+	igt_skip_on(display->n_outputs < 2);
+	output1 = get_next_valid_output(display, 1);
+	output2 = get_next_valid_output(display, 2);
+	igt_output_set_pipe(output1, 0);
+	igt_output_set_pipe(output2, 1);
+	d->plane1 = igt_output_get_plane_type(output1, DRM_PLANE_TYPE_PRIMARY);
+	d->plane2 = igt_output_get_plane_type(output1, DRM_PLANE_TYPE_OVERLAY);
+	d->plane3 = igt_output_get_plane_type(output2, DRM_PLANE_TYPE_PRIMARY);
+	d->plane4 = igt_output_get_plane_type(output2, DRM_PLANE_TYPE_OVERLAY);
+	drmModeModeInfo *mode1, *mode2;
+	mode1 = igt_output_get_mode(output1);
+	mode2 = igt_output_get_mode(output2);
+	/* allocate fb with mode size */
+	d->fb_id1 = igt_create_pattern_fb(d->drm_fd, mode1->hdisplay, mode1->vdisplay,
+					DRM_FORMAT_XRGB8888, LOCAL_I915_FORMAT_MOD_X_TILED, /* tiled */
+					&d->fb1);
+	igt_assert(d->fb_id1);
+
+	d->fb_id2 = igt_create_pattern_fb(d->drm_fd,
+					  mode1->hdisplay, mode1->vdisplay,
+					  DRM_FORMAT_XRGB8888,
+					  LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
+					  &d->fb2);
+	igt_assert(d->fb_id2);
+	d->fb_id3 = igt_create_pattern_fb(d->drm_fd, mode2->hdisplay, mode2->vdisplay,
+					DRM_FORMAT_XRGB8888,
+					LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
+					&d->fb3);
+	igt_assert(d->fb_id3);
+
+	d->fb_id4 = igt_create_pattern_fb(d->drm_fd,
+					  mode2->hdisplay, mode2->vdisplay,
+					  DRM_FORMAT_XRGB8888,
+					  LOCAL_DRM_FORMAT_MOD_NONE, /* tiled */
+					  &d->fb4);
+	igt_assert(d->fb_id4);
+	/* Set up display with plane 1 */
+	igt_plane_set_fb(d->plane1, &d->fb1);
+	igt_plane_set_fb(d->plane2, &d->fb2);
+	igt_plane_set_fb(d->plane3, &d->fb3);
+	igt_plane_set_fb(d->plane4, &d->fb4);
+
+	/* plane upscaling  on 2 planes*/
+	igt_fb_set_position(&d->fb1, d->plane1, 0, 0);
+	igt_fb_set_size(&d->fb1, d->plane1, 300, 300);
+	igt_plane_set_position(d->plane1, 100, 100);
+	igt_plane_set_size(d->plane1, mode1->hdisplay - 100, mode1->vdisplay - 50);
+
+	igt_fb_set_position(&d->fb2, d->plane2, 100, 100);
+	igt_fb_set_size(&d->fb2, d->plane2, d->fb2.width - 100, d->fb2.height - 100);
+	igt_plane_set_position(d->plane2, 100, 100);
+	/* downscale by 50 pixels*/
+	igt_plane_set_size(d->plane2, d->fb2.width - 150, d->fb2.height - 150);
+
+	igt_fb_set_position(&d->fb3, d->plane3, 0, 0);
+	igt_fb_set_size(&d->fb3, d->plane3, 400, 400);
+	igt_plane_set_position(d->plane3, 100, 100);
+	igt_plane_set_size(d->plane3, mode2->hdisplay - 50, mode2->vdisplay - 50);
+
+	igt_fb_set_position(&d->fb4, d->plane4, 100, 100);
+	igt_fb_set_size(&d->fb2, d->plane4, d->fb4.width - 100, d->fb4.height - 100);
+	igt_plane_set_position(d->plane4, 100, 100);
+	/* downscale by 50 pixels*/
+	igt_plane_set_size(d->plane4, d->fb4.width - 150, d->fb4.height - 150);
+
+	igt_display_commit2(display, COMMIT_ATOMIC);
+	/* disbale above 4 planes*/
+	igt_plane_set_fb(d->plane1, NULL);
+	igt_plane_set_position(d->plane1, 0, 0);
+	igt_plane_set_fb(d->plane2, NULL);
+	igt_plane_set_position(d->plane2, 0, 0);
+	igt_plane_set_fb(d->plane3, NULL);
+	igt_plane_set_position(d->plane3, 0, 0);
+	igt_plane_set_fb(d->plane4, NULL);
+	igt_plane_set_position(d->plane4, 0, 0);
+	if (d->fb_id1) {
+		igt_remove_fb(d->drm_fd, &d->fb1);
+		d->fb_id1 = 0;
+	}
+	if (d->fb_id2) {
+		igt_remove_fb(d->drm_fd, &d->fb2);
+		d->fb_id2 = 0;
+	}
+	if (d->fb_id3) {
+		igt_remove_fb(d->drm_fd, &d->fb3);
+		d->fb_id3 = 0;
+	}
+	if (d->fb_id4) {
+		igt_remove_fb(d->drm_fd, &d->fb4);
+		d->fb_id4 = 0;
+	}
+}
+igt_main
 {
 	data_t data = {};
 
@@ -308,11 +765,26 @@  igt_simple_main
 	data.drm_fd = drm_open_driver(DRIVER_INTEL);
 	igt_require_pipe_crc(data.drm_fd);
 	igt_display_init(&data.display, data.drm_fd);
+	igt_require(data.display.is_atomic);
 	data.devid = intel_get_drm_devid(data.drm_fd);
 
 	data.num_scalers = intel_gen(data.devid) >= 9 ? 2 : 0;
 
-	test_plane_scaling(&data);
-
+	//test_plane_scaling(&data);
+	igt_subtest_f("scaler_with_pixel_format") {
+		test_scaler_with_pixel_format(&data);
+	}
+	igt_subtest_f("scaler_with_rotation") {
+		test_scaler_with_rotation(&data);
+	}
+	igt_subtest_f("scaler_with_multiple_planes") {
+		test_scaler_with_multiple_planes(&data);
+	}
+	igt_subtest_f("scaler_with_clipping_clamping") {
+		test_scaler_with_clipping_clamping_scenario(&data);
+	}
+	igt_subtest_f("scaler_with_multi_pipe_plane") {
+		test_scaler_with_multi_pipe_plane(&data);
+	}
 	igt_display_fini(&data.display);
 }