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));
