Move create_stereo_fb from testdisplay to igt_create_stereo_fb in igt_fb so that it can be used in other tests. Signed-off-by: Thomas Wood <thomas.wood@xxxxxxxxx> --- lib/Makefile.am | 4 +- lib/igt_fb.c | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/igt_fb.h | 2 + lib/igt_kms.h | 1 + tests/testdisplay.c | 116 +--------------------------------------------- 5 files changed, 138 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 d07af0d..9a13969 100644 --- a/lib/igt_fb.c +++ b/lib/igt_fb.c @@ -507,6 +507,137 @@ 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); + } +} +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); + } +} + +/** + * igt_create_stereo_fb: + * @drm_fd: open i915 drm file descriptor + * @mode: A stero 3D mode. + * + * 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) +{ + struct stereo_fb_layout layout; + cairo_t *cr; + uint32_t fb_id; + struct igt_fb fb; + + /* config */ + int bpp = 32; + int depth = 32; + bool enable_tiling = false; + + 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), + enable_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 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 f5110d4..16f6040 100644 --- a/lib/igt_fb.h +++ b/lib/igt_fb.h @@ -72,6 +72,8 @@ unsigned int igt_create_color_fb(int fd, int width, int height, uint32_t format, bool tiled, double r, double g, double b, struct igt_fb *fb /* out */); +unsigned int igt_create_stereo_fb(int drm_fd, drmModeModeInfo *mode); + void igt_remove_fb(int fd, struct igt_fb *fb); /* cairo-based painting */ diff --git a/lib/igt_kms.h b/lib/igt_kms.h index 921afef..abf4bcf 100644 --- a/lib/igt_kms.h +++ b/lib/igt_kms.h @@ -166,6 +166,7 @@ bool kmstest_get_property(int drm_fd, uint32_t object_id, uint32_t object_type, drmModePropertyPtr *prop); void kmstest_unset_all_crtcs(int drm_fd, drmModeResPtr resources); + /* * A small modeset API */ diff --git a/tests/testdisplay.c b/tests/testdisplay.c index 89ee110..f3471af 100644 --- a/tests/testdisplay.c +++ b/tests/testdisplay.c @@ -409,125 +409,11 @@ 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), - enable_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_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)); -- 1.9.3 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx