From: Sonika Jindal <sonika.jindal@xxxxxxxxx> Signed-off-by: Sonika Jindal <sonika.jindal@xxxxxxxxx> --- tests/kms_rotation_crc.c | 80 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 21 deletions(-) diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c index 9f272fa..6c9674e 100644 --- a/tests/kms_rotation_crc.c +++ b/tests/kms_rotation_crc.c @@ -33,33 +33,49 @@ typedef struct { int gfx_fd; igt_display_t display; struct igt_fb fb; + struct igt_fb fb_cursor; igt_crc_t ref_crc; igt_pipe_crc_t *pipe_crc; } data_t; static void paint_squares(data_t *data, struct igt_fb *fb, drmModeModeInfo *mode, - igt_rotation_t rotation) + igt_rotation_t rotation, igt_plane_t *plane) { cairo_t *cr; int w, h; + if (plane->is_cursor) { + w = 128; + h = 128; + cr = igt_get_cairo_ctx(data->gfx_fd, &data->fb_cursor); + + if (rotation == IGT_ROTATION_180) { + cairo_translate(cr, w, h); + cairo_rotate(cr, M_PI); + } - w = mode->hdisplay; - h = mode->vdisplay; + igt_paint_color(cr, 0, 0, w / 2, h / 2, .75, 0.5, 0.5); + igt_paint_color(cr, w / 2, 0, w / 2, h / 2, 0.5, .75, 0.5); + igt_paint_color(cr, 0, h / 2, w / 2, h / 2, 0.5, 0.5, .75); + igt_paint_color(cr, w / 2, h / 2, w / 2, h / 2, .75, .75, .75); - cr = igt_get_cairo_ctx(data->gfx_fd, &data->fb); + } else { + w = mode->hdisplay; + h = mode->vdisplay; - if (rotation == IGT_ROTATION_180) { - cairo_translate(cr, w, h); - cairo_rotate(cr, M_PI); - } + cr = igt_get_cairo_ctx(data->gfx_fd, &data->fb); - /* Paint with 4 squares of Red, Green, White, Blue Clockwise */ - igt_paint_color(cr, 0, 0, w / 2, h / 2, 1.0, 0.0, 0.0); - igt_paint_color(cr, w / 2, 0, w / 2, h / 2, 0.0, 1.0, 0.0); - igt_paint_color(cr, 0, h / 2, w / 2, h / 2, 0.0, 0.0, 1.0); - igt_paint_color(cr, w / 2, h / 2, w / 2, h / 2, 1.0, 1.0, 1.0); + if (rotation == IGT_ROTATION_180) { + cairo_translate(cr, w, h); + cairo_rotate(cr, M_PI); + } + /* Paint with 4 squares of Red, Green, White, Blue Clockwise */ + igt_paint_color(cr, 0, 0, w / 2, h / 2, 1.0, 0.0, 0.0); + igt_paint_color(cr, w / 2, 0, w / 2, h / 2, 0.0, 1.0, 0.0); + igt_paint_color(cr, 0, h / 2, w / 2, h / 2, 0.0, 0.0, 1.0); + igt_paint_color(cr, w / 2, h / 2, w / 2, h / 2, 1.0, 1.0, 1.0); + } cairo_destroy(cr); } @@ -68,7 +84,7 @@ static bool prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe, { drmModeModeInfo *mode; igt_display_t *display = &data->display; - int fb_id; + int fb_id, fb_cursor_id; igt_output_set_pipe(output, pipe); @@ -91,9 +107,16 @@ static bool prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe, &data->fb); igt_assert(fb_id); + fb_cursor_id = igt_create_fb(data->gfx_fd, + 128, 128, + DRM_FORMAT_ARGB8888, + false, /* tiled */ + &data->fb_cursor); + igt_assert(fb_cursor_id); + + /* Step 1: create a reference CRC for a software-rotated fb */ - paint_squares(data, &data->fb, mode, IGT_ROTATION_180); /* * XXX: We always set the primary plane to actually enable the pipe as @@ -104,21 +127,32 @@ static bool prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe, igt_plane_t *primary; primary = igt_output_get_plane(output, IGT_PLANE_PRIMARY); + paint_squares(data, &data->fb, mode, IGT_ROTATION_180, primary); igt_plane_set_fb(primary, &data->fb); } - igt_plane_set_fb(plane, &data->fb); + if (plane->is_cursor) { + paint_squares(data, &data->fb_cursor, mode, IGT_ROTATION_180, plane); + igt_plane_set_fb(plane, &data->fb_cursor); + } else { + paint_squares(data, &data->fb, mode, IGT_ROTATION_180, plane); + igt_plane_set_fb(plane, &data->fb); + } igt_display_commit(display); - igt_pipe_crc_collect_crc(data->pipe_crc, &data->ref_crc); /* * Step 2: prepare the plane with an non-rotated fb let the hw * rotate it. */ - paint_squares(data, &data->fb, mode, IGT_ROTATION_0); + if (plane->is_cursor) { + paint_squares(data, &data->fb_cursor, mode, IGT_ROTATION_0, plane); + igt_plane_set_fb(plane, &data->fb_cursor); + } else { + paint_squares(data, &data->fb, mode, IGT_ROTATION_0, plane); + igt_plane_set_fb(plane, &data->fb); + } - igt_plane_set_fb(plane, &data->fb); igt_display_commit(display); return true; @@ -132,6 +166,7 @@ static void cleanup_crtc(data_t *data, igt_output_t *output, igt_plane_t *plane) data->pipe_crc = NULL; igt_remove_fb(data->gfx_fd, &data->fb); + igt_remove_fb(data->gfx_fd, &data->fb_cursor); /* XXX: see the note in prepare_crtc() */ if (!plane->is_primary) { @@ -156,7 +191,7 @@ static void test_plane_rotation(data_t *data, enum igt_plane plane_type) igt_crc_t crc_output, crc_unrotated; enum igt_commit_style commit = COMMIT_LEGACY; - if (plane_type == IGT_PLANE_PRIMARY) { + if (plane_type == IGT_PLANE_PRIMARY || plane_type == IGT_PLANE_CURSOR) { igt_require(data->display.has_universal_planes); commit = COMMIT_UNIVERSAL; } @@ -175,6 +210,7 @@ static void test_plane_rotation(data_t *data, enum igt_plane plane_type) /* collect unrotated CRC */ igt_display_commit2(display, commit); + igt_pipe_crc_collect_crc(data->pipe_crc, &crc_unrotated); igt_plane_set_rotation(plane, IGT_ROTATION_180); @@ -191,7 +227,6 @@ static void test_plane_rotation(data_t *data, enum igt_plane plane_type) igt_pipe_crc_collect_crc(data->pipe_crc, &crc_output); igt_assert(igt_crc_equal(&crc_unrotated, &crc_output)); - valid_tests++; cleanup_crtc(data, output, plane); } @@ -221,6 +256,9 @@ igt_main igt_subtest_f("sprite-rotation") test_plane_rotation(&data, IGT_PLANE_2); + igt_subtest_f("cursor-rotation") + test_plane_rotation(&data, IGT_PLANE_CURSOR); + igt_fixture { igt_display_fini(&data.display); } -- 1.7.10.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx