From patchwork Fri Sep 5 09:52:05 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Wood X-Patchwork-Id: 4851041 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 7B601C0338 for ; Fri, 5 Sep 2014 09:52:20 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6D71E202C8 for ; Fri, 5 Sep 2014 09:52:19 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 4E7EC20120 for ; Fri, 5 Sep 2014 09:52:18 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 15B516E82A; Fri, 5 Sep 2014 02:52:17 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-wi0-f177.google.com (mail-wi0-f177.google.com [209.85.212.177]) by gabe.freedesktop.org (Postfix) with ESMTP id 299086E82E for ; Fri, 5 Sep 2014 02:52:15 -0700 (PDT) Received: by mail-wi0-f177.google.com with SMTP id cc10so2660678wib.4 for ; Fri, 05 Sep 2014 02:52:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=WYSt7uEiwbGma7PQlfj8yfmkYx2LKtkrBxWwV6Z4yz8=; b=FhlhMKEil/PImu4UnuJIREU1siAEyRaMpWyBC3uSAuBgnUABsU0telMz6UTTBVRO1j Sm+/UVUEI+NUnDdjF8SLHM3vTifSejVQD15zo1cU3rjYk4Cn6PId/8IMRZ78anH4dUih jKnEaJ9vCdH49t1kBS3GOjN66wCz8fM7KwVNrX/vbwiTNdP/N5EmP8LfJPVU/KgWpU68 sDnxGDQ9CpGdSKuq+54sgvPZQ833L8rA+ZnNzFs9v740wG0N/2YEgkaaNk+Qns4vo/io 5MpblymB3evYU+qdgrtyEWV5By04GkdpC6JDQyUOsoJ7GTtYQu6SQ9Pbpz+NnNC1fD/E BkEQ== X-Gm-Message-State: ALoCoQkan+bmHTRDSZlKLFuTRB9w4eFDGYNHACPNlM2As5vgzllVuxSzEP+kXfDDZnCHrErQsiIs X-Received: by 10.194.86.34 with SMTP id m2mr13238181wjz.23.1409910734260; Fri, 05 Sep 2014 02:52:14 -0700 (PDT) Received: from pistachio.icx.intel.com ([83.217.123.106]) by mx.google.com with ESMTPSA id h6sm875050wjb.33.2014.09.05.02.52.13 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Sep 2014 02:52:13 -0700 (PDT) From: Thomas Wood To: intel-gfx@lists.freedesktop.org Date: Fri, 5 Sep 2014 10:52:05 +0100 Message-Id: <1409910729-13485-3-git-send-email-thomas.wood@intel.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1409910729-13485-1-git-send-email-thomas.wood@intel.com> References: <5408C410.8080500@intel.com> <1409910729-13485-1-git-send-email-thomas.wood@intel.com> Subject: [Intel-gfx] [PATCH i-g-t v2 2/6] lib: move create_stereo_fb from testdisplay to igt_fb 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.9 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 Move create_stereo_fb from testdisplay to igt_create_stereo_fb in igt_fb so that it can be used in other tests. v2: update for new igt_create_fb API add parameters for format and tiling remove some old debug code Signed-off-by: Thomas Wood --- lib/Makefile.am | 4 +- lib/igt_fb.c | 100 ++++++++++++++++++++++++++++++++++++++++++++ lib/igt_fb.h | 2 + tests/testdisplay.c | 118 ++-------------------------------------------------- 4 files changed, 108 insertions(+), 116 deletions(-) diff --git a/lib/Makefile.am b/lib/Makefile.am index 001ecab..36cf2d3 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -7,7 +7,9 @@ noinst_LTLIBRARIES = libintel_tools.la noinst_HEADERS = check-ndebug.h AM_CPPFLAGS = -I$(top_srcdir) -AM_CFLAGS = $(DRM_CFLAGS) $(CWARNFLAGS) +AM_CFLAGS = $(DRM_CFLAGS) $(CWARNFLAGS) \ + -DIGT_DATADIR=\""$(abs_top_srcdir)/tests"\" + LDADD = $(CAIRO_LIBS) AM_CFLAGS += $(CAIRO_CFLAGS) diff --git a/lib/igt_fb.c b/lib/igt_fb.c index 71d9a26..f9f5de2 100644 --- a/lib/igt_fb.c +++ b/lib/igt_fb.c @@ -502,6 +502,106 @@ unsigned int igt_create_color_fb(int fd, int width, int height, return fb_id; } +struct box { + int x, y, width, height; +}; + +struct stereo_fb_layout { + int fb_width, fb_height; + struct box left, right; +}; + +static void box_init(struct box *box, int x, int y, int bwidth, int bheight) +{ + box->x = x; + box->y = y; + box->width = bwidth; + box->height = bheight; +} + + +static void stereo_fb_layout_from_mode(struct stereo_fb_layout *layout, + drmModeModeInfo *mode) +{ + unsigned int format = mode->flags & DRM_MODE_FLAG_3D_MASK; + const int hdisplay = mode->hdisplay, vdisplay = mode->vdisplay; + int middle; + + switch (format) { + case DRM_MODE_FLAG_3D_TOP_AND_BOTTOM: + layout->fb_width = hdisplay; + layout->fb_height = vdisplay; + + middle = vdisplay / 2; + box_init(&layout->left, 0, 0, hdisplay, middle); + box_init(&layout->right, + 0, middle, hdisplay, vdisplay - middle); + break; + case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF: + layout->fb_width = hdisplay; + layout->fb_height = vdisplay; + + middle = hdisplay / 2; + box_init(&layout->left, 0, 0, middle, vdisplay); + box_init(&layout->right, + middle, 0, hdisplay - middle, vdisplay); + break; + case DRM_MODE_FLAG_3D_FRAME_PACKING: + { + int vactive_space = mode->vtotal - vdisplay; + + layout->fb_width = hdisplay; + layout->fb_height = 2 * vdisplay + vactive_space; + + box_init(&layout->left, + 0, 0, hdisplay, vdisplay); + box_init(&layout->right, + 0, vdisplay + vactive_space, hdisplay, vdisplay); + break; + } + default: + igt_assert(0); + } +} + +/** + * igt_create_stereo_fb: + * @drm_fd: open i915 drm file descriptor + * @mode: A stereo 3D mode. + * @format: drm fourcc pixel format code + * @tiling: tiling layout of the framebuffer + * + * Create a framebuffer for use with the stereo 3D mode specified by @mode. + * + * Returns: + * The kms id of the created framebuffer on success or a negative error code on + * failure. + */ +unsigned int igt_create_stereo_fb(int drm_fd, drmModeModeInfo *mode, + uint32_t format, unsigned int tiling) +{ + struct stereo_fb_layout layout; + cairo_t *cr; + uint32_t fb_id; + struct igt_fb fb; + + stereo_fb_layout_from_mode(&layout, mode); + fb_id = igt_create_fb(drm_fd, layout.fb_width, layout.fb_height, format, + tiling, &fb); + cr = igt_get_cairo_ctx(drm_fd, &fb); + + igt_paint_image(cr, IGT_DATADIR"/1080p-left.png", + layout.left.x, layout.left.y, + layout.left.width, layout.left.height); + igt_paint_image(cr, IGT_DATADIR"/1080p-right.png", + layout.right.x, layout.right.y, + layout.right.width, layout.right.height); + + cairo_destroy(cr); + + return fb_id; +} + static cairo_format_t drm_format_to_cairo(uint32_t drm_format) { struct format_desc_struct *f; diff --git a/lib/igt_fb.h b/lib/igt_fb.h index 4295df9..e6f72e9 100644 --- a/lib/igt_fb.h +++ b/lib/igt_fb.h @@ -75,6 +75,8 @@ unsigned int igt_create_color_fb(int fd, int width, int height, uint32_t format, unsigned int tiling, double r, double g, double b, struct igt_fb *fb /* out */); +unsigned int igt_create_stereo_fb(int drm_fd, drmModeModeInfo *mode, + uint32_t format, unsigned int tiling); void igt_remove_fb(int fd, struct igt_fb *fb); /* cairo-based painting */ diff --git a/tests/testdisplay.c b/tests/testdisplay.c index dbca203..a3cba44 100644 --- a/tests/testdisplay.c +++ b/tests/testdisplay.c @@ -410,125 +410,13 @@ set_mode(struct connector *c) drmModeFreeConnector(c->connector); } -struct box { - int x, y, width, height; -}; - -struct stereo_fb_layout { - int fb_width, fb_height; - struct box left, right; -}; - -static void box_init(struct box *box, int x, int y, int bwidth, int bheight) -{ - box->x = x; - box->y = y; - box->width = bwidth; - box->height = bheight; -} - -static void stereo_fb_layout_from_mode(struct stereo_fb_layout *layout, - drmModeModeInfo *mode) -{ - unsigned int format = mode->flags & DRM_MODE_FLAG_3D_MASK; - const int hdisplay = mode->hdisplay, vdisplay = mode->vdisplay; - int middle; - - switch (format) { - case DRM_MODE_FLAG_3D_TOP_AND_BOTTOM: - layout->fb_width = hdisplay; - layout->fb_height = vdisplay; - - middle = vdisplay / 2; - box_init(&layout->left, 0, 0, hdisplay, middle); - box_init(&layout->right, - 0, middle, hdisplay, vdisplay - middle); - break; - case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF: - layout->fb_width = hdisplay; - layout->fb_height = vdisplay; - - middle = hdisplay / 2; - box_init(&layout->left, 0, 0, middle, vdisplay); - box_init(&layout->right, - middle, 0, hdisplay - middle, vdisplay); - break; - case DRM_MODE_FLAG_3D_FRAME_PACKING: - { - int vactive_space = mode->vtotal - vdisplay; - - layout->fb_width = hdisplay; - layout->fb_height = 2 * vdisplay + vactive_space; - - box_init(&layout->left, - 0, 0, hdisplay, vdisplay); - box_init(&layout->right, - 0, vdisplay + vactive_space, hdisplay, vdisplay); - break; - } - default: - igt_assert(0); - } -} - -static const char *stereo_mode_str(drmModeModeInfo *mode) -{ - unsigned int layout = mode->flags & DRM_MODE_FLAG_3D_MASK; - - switch (layout) { - case DRM_MODE_FLAG_3D_TOP_AND_BOTTOM: - return "TB"; - case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF: - return "SbSH"; - case DRM_MODE_FLAG_3D_FRAME_PACKING: - return "FP"; - default: - igt_assert(0); - } -} - -static uint32_t create_stereo_fb(drmModeModeInfo *mode, struct igt_fb *fb) -{ - struct stereo_fb_layout layout; - cairo_t *cr; - uint32_t fb_id; - - stereo_fb_layout_from_mode(&layout, mode); - fb_id = igt_create_fb(drm_fd, layout.fb_width, layout.fb_height, - igt_bpp_depth_to_drm_format(bpp, depth), - tiling, fb); - cr = igt_get_cairo_ctx(drm_fd, fb); - - igt_paint_image(cr, IGT_DATADIR"/1080p-left.png", - layout.left.x, layout.left.y, - layout.left.width, layout.left.height); - igt_paint_image(cr, IGT_DATADIR"/1080p-right.png", - layout.right.x, layout.right.y, - layout.right.width, layout.right.height); - - cairo_destroy(cr); - - { - char buffer[64]; - - snprintf(buffer, sizeof(buffer), "%dx%d@%dHz-%s.png", - mode->hdisplay, - mode->vdisplay, - mode->vrefresh, - stereo_mode_str(mode)); - - igt_write_fb_to_png(drm_fd, fb, buffer); - } - - return fb_id; -} - static void do_set_stereo_mode(struct connector *c) { uint32_t fb_id; - struct igt_fb fb_info; - fb_id = create_stereo_fb(&c->mode, &fb_info); + fb_id = igt_create_stereo_fb(drm_fd, &c->mode, + igt_bpp_depth_to_drm_format(bpp, depth), + tiling); igt_warn_on_f(drmModeSetCrtc(drm_fd, c->crtc, fb_id, 0, 0, &c->id, 1, &c->mode), "failed to set mode (%dx%d@%dHz): %s\n", width, height, c->mode.vrefresh, strerror(errno));