@@ -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)
@@ -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;
@@ -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 */
@@ -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
*/
@@ -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));
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@intel.com> --- 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(-)