From patchwork Thu Oct 23 15:48:50 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matt Roper X-Patchwork-Id: 5141511 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 0A310C11AC for ; Thu, 23 Oct 2014 15:48:23 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 10902201FB for ; Thu, 23 Oct 2014 15:48:22 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 13C51201EF for ; Thu, 23 Oct 2014 15:48:21 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7E06D6E49C; Thu, 23 Oct 2014 08:48:20 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTP id 4E2656E49C for ; Thu, 23 Oct 2014 08:48:19 -0700 (PDT) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP; 23 Oct 2014 08:47:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.04,775,1406617200"; d="scan'208";a="619252545" Received: from mdroper-hswdev.fm.intel.com (HELO mdroper-hswdev) ([10.1.134.215]) by fmsmga002.fm.intel.com with ESMTP; 23 Oct 2014 08:47:41 -0700 Received: from mattrope by mdroper-hswdev with local (Exim 4.82) (envelope-from ) id 1XhKdC-0003EH-6G; Thu, 23 Oct 2014 08:48:54 -0700 From: Matt Roper To: intel-gfx@lists.freedesktop.org Date: Thu, 23 Oct 2014 08:48:50 -0700 Message-Id: <1414079330-12381-1-git-send-email-matthew.d.roper@intel.com> X-Mailer: git-send-email 1.8.5.1 In-Reply-To: <20141023084916.GC26941@phenom.ffwll.local> References: <20141023084916.GC26941@phenom.ffwll.local> Subject: [Intel-gfx] [PATCH i-g-t] kms_rotation_crc: Add test for cursor rotation (v2) X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-5.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Sonika Jindal v2: Slight rebasing onto latest i-g-t codebase (Matt). Signed-off-by: Sonika Jindal Reviewed-by: Matt Roper Signed-off-by: Matt Roper --- tests/kms_rotation_crc.c | 79 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 22 deletions(-) diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c index f45bc9d..41e9912 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; - w = mode->hdisplay; - h = mode->vdisplay; + if (plane->is_cursor) { + w = 128; + h = 128; + cr = igt_get_cairo_ctx(data->gfx_fd, &data->fb_cursor); - cr = igt_get_cairo_ctx(data->gfx_fd, &data->fb); + if (rotation == IGT_ROTATION_180) { + cairo_translate(cr, w, h); + cairo_rotate(cr, M_PI); + } - if (rotation == IGT_ROTATION_180) { - cairo_translate(cr, w, h); - cairo_rotate(cr, M_PI); - } + 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); + } else { + w = mode->hdisplay; + h = mode->vdisplay; + + 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); @@ -90,9 +106,14 @@ static bool prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe, &data->fb); igt_assert(fb_id); - /* Step 1: create a reference CRC for a software-rotated fb */ + fb_cursor_id = igt_create_fb(data->gfx_fd, + 128, 128, + DRM_FORMAT_ARGB8888, + false, /* tiled */ + &data->fb_cursor); + igt_assert(fb_cursor_id); - paint_squares(data, &data->fb, mode, IGT_ROTATION_180); + /* Step 1: create a reference CRC for a software-rotated fb */ /* * XXX: We always set the primary plane to actually enable the pipe as @@ -103,21 +124,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); return true; } @@ -129,6 +161,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) { @@ -153,7 +186,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; } @@ -172,7 +205,6 @@ static void test_plane_rotation(data_t *data, enum igt_plane plane_type) igt_display_commit2(display, commit); /* 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); @@ -219,6 +251,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); }