[Intel-gfx] [PATCH] Improvements to kms_plane_scaling

Chandra Konduru chandra.konduru at intel.com
Mon May 11 15:51:44 PDT 2015


From: chandra konduru <chandra.konduru at intel.com>

This patch has below improvements:
 - use tile-Y for fb1 which is used for 90/270 rotation
 - add 90/270 rotation tests along with scaling
 - remove primary_plane_scaling flag which isn't required anymore
 - use helper igt_get_image_size() to get image size
 - use fb's width/height to initialize fb1 in prepare_crtc
 - position fb3 at (0,0) and set its src size to fb size

Depends on "Prep work for adding NV12 testcase" patch which adds
helper function igt_get_image_size().

v2:
-Remove primary_plane_scaling flag (Thomas)
-Fix running the test from any directory (Tvrtko)

Signed-off-by: chandra konduru <chandra.konduru at intel.com>
---
 tests/kms_plane_scaling.c | 88 ++++++++++++++++++++++++-----------------------
 1 file changed, 45 insertions(+), 43 deletions(-)

diff --git a/tests/kms_plane_scaling.c b/tests/kms_plane_scaling.c
index 00db5cb..aa88040 100644
--- a/tests/kms_plane_scaling.c
+++ b/tests/kms_plane_scaling.c
@@ -101,11 +101,11 @@ static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe,
 	data->fb_id1 = igt_create_fb(data->drm_fd,
 			mode->hdisplay, mode->vdisplay,
 			DRM_FORMAT_XRGB8888,
-			LOCAL_I915_FORMAT_MOD_X_TILED, /* tiled */
+			LOCAL_I915_FORMAT_MOD_Y_TILED, /* tiled */
 			&data->fb1);
 	igt_assert(data->fb_id1);
 
-	paint_color(data, &data->fb1, mode->hdisplay, mode->vdisplay);
+	paint_color(data, &data->fb1, data->fb1.width, data->fb1.height);
 
 	/*
 	 * We always set the primary plane to actually enable the pipe as
@@ -206,10 +206,8 @@ static void test_plane_scaling(data_t *d)
 {
 	igt_display_t *display = &d->display;
 	igt_output_t *output;
-	cairo_surface_t *image;
 	enum pipe pipe;
 	int valid_tests = 0;
-	int primary_plane_scaling = 0; /* For now */
 
 	igt_require(d->display.has_universal_planes);
 	igt_require(d->num_scalers);
@@ -223,12 +221,7 @@ static void test_plane_scaling(data_t *d)
 		mode = igt_output_get_mode(output);
 
 		/* allocate fb2 with image size */
-		image = cairo_image_surface_create_from_png(FILE_NAME);
-		igt_assert(cairo_surface_status(image) == CAIRO_STATUS_SUCCESS);
-		d->image_w = cairo_image_surface_get_width(image);
-		d->image_h = cairo_image_surface_get_height(image);
-		cairo_surface_destroy(image);
-
+		igt_get_image_size(FILE_NAME, &d->image_w, &d->image_h);
 		d->fb_id2 = igt_create_fb(d->drm_fd,
 				d->image_w, d->image_h,
 				DRM_FORMAT_XRGB8888,
@@ -249,22 +242,35 @@ static void test_plane_scaling(data_t *d)
 		d->plane1 = igt_output_get_plane(output, IGT_PLANE_PRIMARY);
 		prepare_crtc(d, output, pipe, d->plane1, mode, COMMIT_UNIVERSAL);
 
-		if (primary_plane_scaling) {
-			/* Primary plane upscaling */
-			igt_fb_set_position(&d->fb1, d->plane1, 100, 100);
-			igt_fb_set_size(&d->fb1, d->plane1, 500, 500);
-			igt_plane_set_position(d->plane1, 0, 0);
-			igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
-			igt_display_commit2(display, COMMIT_UNIVERSAL);
+		/* Primary plane upscaling with 90 rotation */
+		paint_color(d, &d->fb1, 360, 640);
+		igt_fb_set_position(&d->fb1, d->plane1, 0, 0);
+		igt_fb_set_size(&d->fb1, d->plane1, 360, 640);
+		igt_plane_set_position(d->plane1, 0, 0);
+		igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
+		igt_plane_set_rotation(d->plane1, IGT_ROTATION_90);
+		igt_display_commit2(display, COMMIT_UNIVERSAL);
 
-			/* Primary plane 1:1 no scaling */
+		/* Primary plane upscaling with 270 rotation */
+		if (d->fb1.width >= 720 && d->fb1.height >= 1280) {
+			paint_color(d, &d->fb1, 720, 1280);
 			igt_fb_set_position(&d->fb1, d->plane1, 0, 0);
-			igt_fb_set_size(&d->fb1, d->plane1, d->fb1.width, d->fb1.height);
+			igt_fb_set_size(&d->fb1, d->plane1, 720, 1280);
 			igt_plane_set_position(d->plane1, 0, 0);
 			igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
+			igt_plane_set_rotation(d->plane1, IGT_ROTATION_270);
 			igt_display_commit2(display, COMMIT_UNIVERSAL);
 		}
 
+		/* Primary plane 1:1 no scaling & no rotation */
+		paint_color(d, &d->fb1, d->fb1.width, d->fb1.height);
+		igt_fb_set_position(&d->fb1, d->plane1, 0, 0);
+		igt_fb_set_size(&d->fb1, d->plane1, d->fb1.width, d->fb1.height);
+		igt_plane_set_position(d->plane1, 0, 0);
+		igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
+		igt_plane_set_rotation(d->plane1, IGT_ROTATION_0);
+		igt_display_commit2(display, COMMIT_UNIVERSAL);
+
 		/* Set up fb2->plane2 mapping. */
 		d->plane2 = igt_output_get_plane(output, IGT_PLANE_2);
 		igt_plane_set_fb(d->plane2, &d->fb2);
@@ -292,14 +298,12 @@ static void test_plane_scaling(data_t *d)
 		igt_plane_set_size(d->plane2, 500, 500 * d->fb2.height/d->fb2.width);
 		igt_display_commit2(display, COMMIT_UNIVERSAL);
 
-		if (primary_plane_scaling) {
-			/* Primary plane up scaling */
-			igt_fb_set_position(&d->fb1, d->plane1, 100, 100);
-			igt_fb_set_size(&d->fb1, d->plane1, 500, 500);
-			igt_plane_set_position(d->plane1, 0, 0);
-			igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
-			igt_display_commit2(display, COMMIT_UNIVERSAL);
-		}
+		/* Primary plane up scaling */
+		igt_fb_set_position(&d->fb1, d->plane1, 100, 100);
+		igt_fb_set_size(&d->fb1, d->plane1, 500, 500);
+		igt_plane_set_position(d->plane1, 0, 0);
+		igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
+		igt_display_commit2(display, COMMIT_UNIVERSAL);
 
 		/* Set up fb3->plane3 mapping. */
 		d->plane3 = igt_output_get_plane(output, IGT_PLANE_3);
@@ -318,25 +322,23 @@ static void test_plane_scaling(data_t *d)
 		igt_plane_set_position(d->plane2, 100, 100);
 		igt_plane_set_size(d->plane2, d->fb2.width-200, d->fb2.height-200);
 
-		igt_fb_set_position(&d->fb3, d->plane3, 100, 100);
-		igt_fb_set_size(&d->fb3, d->plane3, d->fb3.width-400, d->fb3.height-400);
-		igt_plane_set_position(d->plane3, 10, 10);
-		igt_plane_set_size(d->plane3, mode->hdisplay-300, mode->vdisplay-300);
+		igt_fb_set_position(&d->fb3, d->plane3, 0, 0);
+		igt_fb_set_size(&d->fb3, d->plane3, d->fb3.width, d->fb3.height);
+		igt_plane_set_position(d->plane3, 500, 500);
+		igt_plane_set_size(d->plane3, d->fb3.width * 2/3, d->fb3.height * 2/3);
 		igt_display_commit2(display, COMMIT_UNIVERSAL);
 
-		if (primary_plane_scaling) {
-			/* Switch scaler from plane 1 to plane 2 */
-			igt_fb_set_position(&d->fb1, d->plane1, 0, 0);
-			igt_fb_set_size(&d->fb1, d->plane1, d->fb1.width, d->fb1.height);
-			igt_plane_set_position(d->plane1, 0, 0);
-			igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
+		/* Switch scaler from plane 1 to plane 2 */
+		igt_fb_set_position(&d->fb1, d->plane1, 0, 0);
+		igt_fb_set_size(&d->fb1, d->plane1, d->fb1.width, d->fb1.height);
+		igt_plane_set_position(d->plane1, 0, 0);
+		igt_plane_set_size(d->plane1, mode->hdisplay, mode->vdisplay);
 
-			igt_fb_set_position(&d->fb2, d->plane2, 100, 100);
-			igt_fb_set_size(&d->fb2, d->plane2, d->fb2.width-500,d->fb2.height-500);
-			igt_plane_set_position(d->plane2, 100, 100);
-			igt_plane_set_size(d->plane2, mode->hdisplay-200, mode->vdisplay-200);
-			igt_display_commit2(display, COMMIT_UNIVERSAL);
-		}
+		igt_fb_set_position(&d->fb2, d->plane2, 100, 100);
+		igt_fb_set_size(&d->fb2, d->plane2, d->fb2.width-500,d->fb2.height-500);
+		igt_plane_set_position(d->plane2, 100, 100);
+		igt_plane_set_size(d->plane2, mode->hdisplay-200, mode->vdisplay-200);
+		igt_display_commit2(display, COMMIT_UNIVERSAL);
 
 		/* back to single plane mode */
 		igt_plane_set_fb(d->plane2, NULL);
-- 
1.9.1



More information about the Intel-gfx mailing list