From patchwork Wed Jul 12 14:50:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Kocialkowki X-Patchwork-Id: 9836919 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id AE1F460363 for ; Wed, 12 Jul 2017 14:51:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9F33228610 for ; Wed, 12 Jul 2017 14:51:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 87215285C8; Wed, 12 Jul 2017 14:51:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 0FC15285DD for ; Wed, 12 Jul 2017 14:51:22 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 496626E439; Wed, 12 Jul 2017 14:51:21 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id 670BC6E430 for ; Wed, 12 Jul 2017 14:51:17 +0000 (UTC) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga104.jf.intel.com with ESMTP; 12 Jul 2017 07:51:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.40,350,1496127600"; d="scan'208"; a="1150811551" Received: from linux.intel.com ([10.54.29.200]) by orsmga001.jf.intel.com with ESMTP; 12 Jul 2017 07:51:17 -0700 Received: from workstation.fi.intel.com (workstation.fi.intel.com [10.237.68.144]) by linux.intel.com (Postfix) with ESMTP id 663765804B7; Wed, 12 Jul 2017 07:51:15 -0700 (PDT) From: Paul Kocialkowski To: intel-gfx@lists.freedesktop.org Date: Wed, 12 Jul 2017 17:50:30 +0300 Message-Id: <20170712145031.3531-7-paul.kocialkowski@linux.intel.com> X-Mailer: git-send-email 2.13.2 In-Reply-To: <20170712145031.3531-1-paul.kocialkowski@linux.intel.com> References: <20170705080435.26789-1-paul.kocialkowski@linux.intel.com> <20170712145031.3531-1-paul.kocialkowski@linux.intel.com> Cc: Lyude Subject: [Intel-gfx] [PATCH i-g-t v4 6/7] chamelium: Dump captured and reference frames to png on crc error X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 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-Virus-Scanned: ClamAV using ClamSMTP This adds support for dumping both the frame capture from the chamelium and the reference frame generated by cairo when the captured crc does not match the crc calculated from the reference, using common helpers. Getting a dump of the frames is quite useful in order to compare them. Signed-off-by: Paul Kocialkowski --- lib/igt_chamelium.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/igt_chamelium.h | 4 +++ tests/chamelium.c | 14 ++++++--- 3 files changed, 95 insertions(+), 4 deletions(-) diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c index baa6399c..df49936b 100644 --- a/lib/igt_chamelium.c +++ b/lib/igt_chamelium.c @@ -930,6 +930,32 @@ static pixman_image_t *convert_frame_format(pixman_image_t *src, return converted; } +static cairo_surface_t *convert_frame_dump_argb32(const struct chamelium_frame_dump *dump) +{ + cairo_surface_t *dump_surface; + pixman_image_t *image_bgr; + pixman_image_t *image_argb; + int w = dump->width, h = dump->height; + uint32_t *bits_bgr = (uint32_t *) dump->bgr; + unsigned char *bits_argb; + + image_bgr = pixman_image_create_bits( + PIXMAN_b8g8r8, w, h, bits_bgr, + PIXMAN_FORMAT_BPP(PIXMAN_b8g8r8) / 8 * w); + image_argb = convert_frame_format(image_bgr, PIXMAN_x8r8g8b8); + pixman_image_unref(image_bgr); + + bits_argb = (unsigned char *) pixman_image_get_data(image_argb); + + dump_surface = cairo_image_surface_create_for_data( + bits_argb, CAIRO_FORMAT_ARGB32, w, h, + PIXMAN_FORMAT_BPP(PIXMAN_x8r8g8b8) / 8 * w); + + pixman_image_unref(image_argb); + + return dump_surface; +} + /** * chamelium_assert_frame_eq: * @chamelium: The chamelium instance the frame dump belongs to @@ -974,6 +1000,61 @@ void chamelium_assert_frame_eq(const struct chamelium *chamelium, } /** + * chamelium_assert_crc_eq_or_dump: + * @chamelium: The chamelium instance the frame dump belongs to + * @reference_crc: The CRC for the reference frame + * @capture_crc: The CRC for the captured frame + * @fb: pointer to an #igt_fb structure + * + * Asserts that the CRC provided for both the reference and the captured frame + * are identical. If they are not, this grabs the captured frame and saves it + * along with the reference to a png file. + */ +void chamelium_assert_crc_eq_or_dump(struct chamelium *chamelium, + igt_crc_t *reference_crc, + igt_crc_t *capture_crc, struct igt_fb *fb, + int index) +{ + struct chamelium_frame_dump *frame; + cairo_surface_t *reference; + cairo_surface_t *capture; + char *reference_suffix; + char *capture_suffix; + bool eq; + + eq = igt_check_crc_equal(reference_crc, capture_crc); + if (!eq && igt_frame_dump_is_enabled()) { + /* Grab the reference frame from framebuffer */ + reference = igt_get_cairo_surface(chamelium->drm_fd, fb); + + /* Grab the captured frame from chamelium */ + frame = chamelium_read_captured_frame(chamelium, index); + igt_assert(frame); + + capture = convert_frame_dump_argb32(frame); + + reference_suffix = igt_crc_to_string_extended(reference_crc, + '-', 2); + capture_suffix = igt_crc_to_string_extended(capture_crc, '-', + 2); + + /* Write reference and capture frames to png */ + igt_write_compared_frames_to_png(reference, capture, + reference_suffix, + capture_suffix); + + free(reference_suffix); + free(capture_suffix); + + chamelium_destroy_frame_dump(frame); + + cairo_surface_destroy(capture); + } + + igt_assert(eq); +} + +/** * chamelium_get_frame_limit: * @chamelium: The Chamelium instance to use * @port: The port to check the frame limit on diff --git a/lib/igt_chamelium.h b/lib/igt_chamelium.h index 2bfbfdc7..80afcafa 100644 --- a/lib/igt_chamelium.h +++ b/lib/igt_chamelium.h @@ -105,6 +105,10 @@ int chamelium_get_frame_limit(struct chamelium *chamelium, void chamelium_assert_frame_eq(const struct chamelium *chamelium, const struct chamelium_frame_dump *dump, struct igt_fb *fb); +void chamelium_assert_crc_eq_or_dump(struct chamelium *chamelium, + igt_crc_t *reference_crc, + igt_crc_t *capture_crc, struct igt_fb *fb, + int index); void chamelium_destroy_frame_dump(struct chamelium_frame_dump *dump); #endif /* IGT_CHAMELIUM_H */ diff --git a/tests/chamelium.c b/tests/chamelium.c index da98de47..f93ff7ee 100644 --- a/tests/chamelium.c +++ b/tests/chamelium.c @@ -390,7 +390,7 @@ test_display_crc_single(data_t *data, struct chamelium_port *port) struct igt_fb fb; drmModeModeInfo *mode; drmModeConnector *connector; - int fb_id, i; + int fb_id, i, captured_frame_count; reset_state(data, port); @@ -415,11 +415,15 @@ test_display_crc_single(data_t *data, struct chamelium_port *port) igt_debug("Testing single CRC fetch\n"); - crc = chamelium_get_crc_for_area(data->chamelium, port, - 0, 0, 0, 0); + chamelium_capture(data->chamelium, port, 0, 0, 0, 0, 1); + crc = chamelium_read_captured_crcs(data->chamelium, + &captured_frame_count); expected_crc = chamelium_calculate_fb_crc_async_finish(fb_crc); + chamelium_assert_crc_eq_or_dump(data->chamelium, expected_crc, + crc, &fb, 0); + igt_assert_crc_equal(crc, expected_crc); free(expected_crc); free(crc); @@ -481,7 +485,9 @@ test_display_crc_multiple(data_t *data, struct chamelium_port *port) expected_crc = chamelium_calculate_fb_crc_async_finish(fb_crc); for (j = 0; j < captured_frame_count; j++) - igt_assert_crc_equal(&crc[j], expected_crc); + chamelium_assert_crc_eq_or_dump(data->chamelium, + expected_crc, &crc[j], + &fb, j); free(expected_crc); free(crc);