All of lore.kernel.org
 help / color / mirror / Atom feed
* [igt PATCH 1/5] lib: move connector_type_str and co to drmtest
@ 2013-05-31  9:23 Imre Deak
  2013-05-31  9:23 ` [igt PATCH 2/5] lib: add kmstest_cairo_printf_line Imre Deak
                   ` (4 more replies)
  0 siblings, 5 replies; 22+ messages in thread
From: Imre Deak @ 2013-05-31  9:23 UTC (permalink / raw)
  To: intel-gfx

These are used by multiple test cases, so make them shared.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 demos/intel_sprite_on.c | 58 ++++------------------------------------------
 lib/drmtest.c           | 54 +++++++++++++++++++++++++++++++++++++++++++
 lib/drmtest.h           |  3 +++
 tests/testdisplay.c     | 61 ++++---------------------------------------------
 4 files changed, 65 insertions(+), 111 deletions(-)

diff --git a/demos/intel_sprite_on.c b/demos/intel_sprite_on.c
index 62bd98e..783f9af 100644
--- a/demos/intel_sprite_on.c
+++ b/demos/intel_sprite_on.c
@@ -53,56 +53,6 @@
 
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
 
-struct type_name {
-	int                 type;
-	const char          *name;
-};
-
-#define type_name_fn(res) \
-	static const char * res##_str(int type) {		\
-		unsigned int i;					\
-		for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \
-			if (res##_names[i].type == type)	\
-			return res##_names[i].name;		\
-		}						\
-		return "(invalid)";				\
-	}
-
-struct type_name encoder_type_names[] = {
-	{ DRM_MODE_ENCODER_NONE, "none" },
-	{ DRM_MODE_ENCODER_DAC, "DAC" },
-	{ DRM_MODE_ENCODER_TMDS, "TMDS" },
-	{ DRM_MODE_ENCODER_LVDS, "LVDS" },
-	{ DRM_MODE_ENCODER_TVDAC, "TVDAC" },
-};
-type_name_fn(encoder_type)
-
-struct type_name connector_status_names[] = {
-	{ DRM_MODE_CONNECTED, "connected" },
-	{ DRM_MODE_DISCONNECTED, "disconnected" },
-	{ DRM_MODE_UNKNOWNCONNECTION, "unknown" },
-};
-type_name_fn(connector_status)
-
-struct type_name connector_type_names[] = {
-	{ DRM_MODE_CONNECTOR_Unknown, "unknown" },
-	{ DRM_MODE_CONNECTOR_VGA, "VGA" },
-	{ DRM_MODE_CONNECTOR_DVII, "DVI-I" },
-	{ DRM_MODE_CONNECTOR_DVID, "DVI-D" },
-	{ DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
-	{ DRM_MODE_CONNECTOR_Composite, "composite" },
-	{ DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
-	{ DRM_MODE_CONNECTOR_LVDS, "LVDS" },
-	{ DRM_MODE_CONNECTOR_Component, "component" },
-	{ DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" },
-	{ DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort" },
-	{ DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
-	{ DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
-	{ DRM_MODE_CONNECTOR_TV, "TV" },
-	{ DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort" },
-};
-type_name_fn(connector_type)
-
 /*
  * Mode setting with the kernel interfaces is a bit of a chore.
  * First you have to find the connector in question and make sure the
@@ -157,8 +107,8 @@ static void dump_connectors(int gfx_fd, drmModeRes *resources)
 		printf("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n",
 			connector->connector_id,
 			connector->encoder_id,
-			connector_status_str(connector->connection),
-			connector_type_str(connector->connector_type),
+			kmstest_connector_status_str(connector->connection),
+			kmstest_connector_type_str(connector->connector_type),
 			connector->mmWidth, connector->mmHeight,
 			connector->count_modes);
 
@@ -744,14 +694,14 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
 				curr_connector.mode.flags,
 				curr_connector.encoder->encoder_id,
 				curr_connector.encoder->encoder_type,
-				encoder_type_str(curr_connector.encoder->encoder_type),
+				kmstest_encoder_type_str(curr_connector.encoder->encoder_type),
 				curr_connector.encoder->crtc_id,
 				curr_connector.encoder->possible_crtcs,
 				curr_connector.encoder->possible_clones,
 				curr_connector.connector->connector_id,
 				curr_connector.connector->encoder_id,
 				curr_connector.connector->connector_type,
-				connector_type_str(curr_connector.connector->connector_type),
+				kmstest_connector_type_str(curr_connector.connector->connector_type),
 				curr_connector.connector->connector_type_id);
 
 			printf("Sprite surface dimensions = %dx%d\n"
diff --git a/lib/drmtest.c b/lib/drmtest.c
index d17dbb0..3c4812f 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -1023,6 +1023,60 @@ void kmstest_remove_fb(int fd, int fb_id)
 	do_or_die(drmModeRmFB(fd, fb_id));
 }
 
+struct type_name {
+	int type;
+	const char *name;
+};
+
+#define type_name_fn(res) \
+const char * kmstest_##res##_str(int type) {		\
+	unsigned int i;					\
+	for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \
+		if (res##_names[i].type == type)	\
+			return res##_names[i].name;	\
+	}						\
+	return "(invalid)";				\
+}
+
+struct type_name encoder_type_names[] = {
+	{ DRM_MODE_ENCODER_NONE, "none" },
+	{ DRM_MODE_ENCODER_DAC, "DAC" },
+	{ DRM_MODE_ENCODER_TMDS, "TMDS" },
+	{ DRM_MODE_ENCODER_LVDS, "LVDS" },
+	{ DRM_MODE_ENCODER_TVDAC, "TVDAC" },
+};
+
+type_name_fn(encoder_type)
+
+struct type_name connector_status_names[] = {
+	{ DRM_MODE_CONNECTED, "connected" },
+	{ DRM_MODE_DISCONNECTED, "disconnected" },
+	{ DRM_MODE_UNKNOWNCONNECTION, "unknown" },
+};
+
+type_name_fn(connector_status)
+
+struct type_name connector_type_names[] = {
+	{ DRM_MODE_CONNECTOR_Unknown, "unknown" },
+	{ DRM_MODE_CONNECTOR_VGA, "VGA" },
+	{ DRM_MODE_CONNECTOR_DVII, "DVI-I" },
+	{ DRM_MODE_CONNECTOR_DVID, "DVI-D" },
+	{ DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
+	{ DRM_MODE_CONNECTOR_Composite, "composite" },
+	{ DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
+	{ DRM_MODE_CONNECTOR_LVDS, "LVDS" },
+	{ DRM_MODE_CONNECTOR_Component, "component" },
+	{ DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" },
+	{ DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort" },
+	{ DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
+	{ DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
+	{ DRM_MODE_CONNECTOR_TV, "TV" },
+	{ DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort" },
+};
+
+type_name_fn(connector_type)
+
+
 void kmstest_dump_mode(drmModeModeInfo *mode)
 {
 	printf("  %s %d %d %d %d %d %d %d %d %d 0x%x 0x%x %d\n",
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 7202ad5..38aeb9d 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -119,6 +119,9 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 void kmstest_remove_fb(int fd, int fb_id);
 void kmstest_dump_mode(drmModeModeInfo *mode);
 int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id);
+const char *kmstest_encoder_type_str(int type);
+const char *kmstest_connector_status_str(int type);
+const char *kmstest_connector_type_str(int type);
 
 inline static void _do_or_die(const char *function, int line, int ret)
 {
diff --git a/tests/testdisplay.c b/tests/testdisplay.c
index 80cd112..e7a2555 100644
--- a/tests/testdisplay.c
+++ b/tests/testdisplay.c
@@ -88,59 +88,6 @@ uint32_t *fb_ptr;
 
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
 
-struct type_name {
-	int type;
-	const char *name;
-};
-
-#define type_name_fn(res) \
-static const char * res##_str(int type) {			\
-	unsigned int i;					\
-	for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \
-		if (res##_names[i].type == type)	\
-			return res##_names[i].name;	\
-	}						\
-	return "(invalid)";				\
-}
-
-struct type_name encoder_type_names[] = {
-	{ DRM_MODE_ENCODER_NONE, "none" },
-	{ DRM_MODE_ENCODER_DAC, "DAC" },
-	{ DRM_MODE_ENCODER_TMDS, "TMDS" },
-	{ DRM_MODE_ENCODER_LVDS, "LVDS" },
-	{ DRM_MODE_ENCODER_TVDAC, "TVDAC" },
-};
-
-type_name_fn(encoder_type)
-
-struct type_name connector_status_names[] = {
-	{ DRM_MODE_CONNECTED, "connected" },
-	{ DRM_MODE_DISCONNECTED, "disconnected" },
-	{ DRM_MODE_UNKNOWNCONNECTION, "unknown" },
-};
-
-type_name_fn(connector_status)
-
-struct type_name connector_type_names[] = {
-	{ DRM_MODE_CONNECTOR_Unknown, "unknown" },
-	{ DRM_MODE_CONNECTOR_VGA, "VGA" },
-	{ DRM_MODE_CONNECTOR_DVII, "DVI-I" },
-	{ DRM_MODE_CONNECTOR_DVID, "DVI-D" },
-	{ DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
-	{ DRM_MODE_CONNECTOR_Composite, "composite" },
-	{ DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
-	{ DRM_MODE_CONNECTOR_LVDS, "LVDS" },
-	{ DRM_MODE_CONNECTOR_Component, "component" },
-	{ DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" },
-	{ DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort" },
-	{ DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
-	{ DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
-	{ DRM_MODE_CONNECTOR_TV, "TV" },
-	{ DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort" },
-};
-
-type_name_fn(connector_type)
-
 /*
  * Mode setting with the kernel interfaces is a bit of a chore.
  * First you have to find the connector in question and make sure the
@@ -185,8 +132,8 @@ static void dump_connectors_fd(int drmfd)
 		printf("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n",
 		       connector->connector_id,
 		       connector->encoder_id,
-		       connector_status_str(connector->connection),
-		       connector_type_str(connector->connector_type),
+		       kmstest_connector_status_str(connector->connection),
+		       kmstest_connector_type_str(connector->connector_type),
 		       connector->mmWidth, connector->mmHeight,
 		       connector->count_modes);
 
@@ -390,7 +337,7 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
 
 	/* Get text extents for each string */
 	snprintf(name_buf, sizeof name_buf, "%s",
-		 connector_type_str(c->connector->connector_type));
+		 kmstest_connector_type_str(c->connector->connector_type));
 	cairo_set_font_size(cr, 48);
 	cairo_select_font_face(cr, "Helvetica",
 			       CAIRO_FONT_SLANT_NORMAL,
@@ -399,7 +346,7 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
 
 	snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz on %s encoder",
 		 c->mode.name, c->mode.vrefresh,
-		 encoder_type_str(c->encoder->encoder_type));
+		 kmstest_encoder_type_str(c->encoder->encoder_type));
 	cairo_set_font_size(cr, 36);
 	cairo_text_extents(cr, mode_buf, &mode_extents);
 
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [igt PATCH 2/5] lib: add kmstest_cairo_printf_line
  2013-05-31  9:23 [igt PATCH 1/5] lib: move connector_type_str and co to drmtest Imre Deak
@ 2013-05-31  9:23 ` Imre Deak
  2013-06-05 17:44   ` Rodrigo Vivi
  2013-05-31  9:23 ` [igt PATCH 3/5] lib: add kmstest_get_connector_config Imre Deak
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 22+ messages in thread
From: Imre Deak @ 2013-05-31  9:23 UTC (permalink / raw)
  To: intel-gfx

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 lib/drmtest.c       | 106 ++++++++++++++++++++++++++++------------------------
 lib/drmtest.h       |  13 +++++++
 tests/testdisplay.c |  96 ++++++++++++++---------------------------------
 3 files changed, 99 insertions(+), 116 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 3c4812f..3ad77a8 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -907,45 +907,55 @@ paint_test_patterns(cairo_t *cr, int width, int height)
 	paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
 }
 
-enum corner {
-	topleft,
-	topright,
-	bottomleft,
-	bottomright,
-};
-
-static void
-paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)
+int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
+				double yspacing, const char *fmt, ...)
 {
+	double x, y, xofs, yofs;
 	cairo_text_extents_t extents;
-	int xoff, yoff;
+	char *text;
+	va_list ap;
+	int ret;
 
-	cairo_set_font_size(cr, 18);
-	cairo_text_extents(cr, str, &extents);
+	va_start(ap, fmt);
+	ret = vasprintf(&text, fmt, ap);
+	assert(ret >= 0);
+	va_end(ap);
 
-	switch (text_location) {
-	case topleft:
-		xoff = -20;
-		xoff -= extents.width;
-		yoff = -20;
-		break;
-	case topright:
-		xoff = 20;
-		yoff = -20;
-		break;
-	case bottomleft:
-		xoff = -20;
-		xoff -= extents.width;
-		yoff = 20;
-		break;
-	case bottomright:
-		xoff = 20;
-		yoff = 20;
-		break;
-	default:
-		xoff = 0;
-		yoff = 0;
-	}
+	cairo_text_extents(cr, text, &extents);
+
+	xofs = yofs = 0;
+	if (align & align_right)
+		xofs = -extents.width;
+	else if (align & align_hcenter)
+		xofs = -extents.width / 2;
+
+	if (align & align_top)
+		yofs = extents.height;
+	else if (align & align_vcenter)
+		yofs = extents.height / 2;
+
+	cairo_get_current_point(cr, &x, &y);
+	if (xofs || yofs)
+		cairo_rel_move_to(cr, xofs, yofs);
+
+	cairo_text_path(cr, text);
+	cairo_set_source_rgb(cr, 0, 0, 0);
+	cairo_stroke_preserve(cr);
+	cairo_set_source_rgb(cr, 1, 1, 1);
+	cairo_fill(cr);
+
+	cairo_move_to(cr, x, y + extents.height + yspacing);
+
+	free(text);
+
+	return extents.width;
+}
+
+static void
+paint_marker(cairo_t *cr, int x, int y)
+{
+	enum kmstest_text_align align;
+	int xoff, yoff;
 
 	cairo_move_to(cr, x, y - 20);
 	cairo_line_to(cr, x, y + 20);
@@ -960,12 +970,15 @@ paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)
 	cairo_set_line_width(cr, 2);
 	cairo_stroke(cr);
 
+	xoff = x ? -20 : 20;
+	align = x ? align_right : align_left;
+
+	yoff = y ? -20 : 20;
+	align |= y ? align_bottom : align_top;
+
 	cairo_move_to(cr, x + xoff, y + yoff);
-	cairo_text_path(cr, str);
-	cairo_set_source_rgb(cr, 0, 0, 0);
-	cairo_stroke_preserve(cr);
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	cairo_fill(cr);
+	cairo_set_font_size(cr, 18);
+	kmstest_cairo_printf_line(cr, align, 0, "(%d, %d)", x, y);
 }
 
 unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
@@ -977,7 +990,6 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 	cairo_surface_t *surface;
 	cairo_status_t status;
 	cairo_t *cr;
-	char buf[128];
 	unsigned int fb_id;
 
 	surface = paint_allocate_surface(fd, width, height, depth, bpp,
@@ -991,14 +1003,10 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 	cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
 
 	/* Paint corner markers */
-	snprintf(buf, sizeof buf, "(%d, %d)", 0, 0);
-	paint_marker(cr, 0, 0, buf, bottomright);
-	snprintf(buf, sizeof buf, "(%d, %d)", width, 0);
-	paint_marker(cr, width, 0, buf, bottomleft);
-	snprintf(buf, sizeof buf, "(%d, %d)", 0, height);
-	paint_marker(cr, 0, height, buf, topright);
-	snprintf(buf, sizeof buf, "(%d, %d)", width, height);
-	paint_marker(cr, width, height, buf, topleft);
+	paint_marker(cr, 0, 0);
+	paint_marker(cr, width, 0);
+	paint_marker(cr, 0, height);
+	paint_marker(cr, width, height);
 
 	if (paint_func)
 		paint_func(cr, width, height, func_arg);
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 38aeb9d..3c1368d 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -109,6 +109,19 @@ struct kmstest_fb {
 	unsigned size;
 };
 
+enum kmstest_text_align {
+	align_left,
+	align_bottom	= align_left,
+	align_right	= 0x01,
+	align_top	= 0x02,
+	align_vcenter	= 0x04,
+	align_hcenter	= 0x08,
+};
+
+int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
+			       double yspacing, const char *fmt, ...)
+			       __attribute__((format (printf, 4, 5)));
+
 typedef void (*kmstest_paint_func)(cairo_t *cr, int width, int height, void *priv);
 
 unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
diff --git a/tests/testdisplay.c b/tests/testdisplay.c
index e7a2555..b10c3b9 100644
--- a/tests/testdisplay.c
+++ b/tests/testdisplay.c
@@ -331,86 +331,48 @@ static void
 paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
 {
 	struct connector *c = priv;
-	cairo_text_extents_t name_extents, mode_extents;
-	char name_buf[128], mode_buf[128];
-	int i, x, y, modes_x, modes_y;
+	double str_width;
+	double x, y, top_y;
+	double max_width;
+	int i;
 
-	/* Get text extents for each string */
-	snprintf(name_buf, sizeof name_buf, "%s",
-		 kmstest_connector_type_str(c->connector->connector_type));
-	cairo_set_font_size(cr, 48);
 	cairo_select_font_face(cr, "Helvetica",
 			       CAIRO_FONT_SLANT_NORMAL,
 			       CAIRO_FONT_WEIGHT_NORMAL);
-	cairo_text_extents(cr, name_buf, &name_extents);
-
-	snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz on %s encoder",
-		 c->mode.name, c->mode.vrefresh,
-		 kmstest_encoder_type_str(c->encoder->encoder_type));
-	cairo_set_font_size(cr, 36);
-	cairo_text_extents(cr, mode_buf, &mode_extents);
+	cairo_move_to(cr, l_width / 2, l_height / 2);
 
-	/* Paint output name */
-	x = l_width / 2;
-	x -= name_extents.width / 2;
-	y = l_height / 2;
-	y -= (name_extents.height / 2) - (mode_extents.height / 2) - 10;
+	/* Print connector and mode name */
 	cairo_set_font_size(cr, 48);
-	cairo_move_to(cr, x, y);
-	cairo_text_path(cr, name_buf);
-	cairo_set_source_rgb(cr, 0, 0, 0);
-	cairo_stroke_preserve(cr);
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	cairo_fill(cr);
-
-	/* Paint mode name */
-	x = l_width / 2;
-	x -= mode_extents.width / 2;
-	modes_x = x;
-	y = l_height / 2;
-	y += (mode_extents.height / 2) + (name_extents.height / 2) + 10;
+	kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s",
+		 kmstest_connector_type_str(c->connector->connector_type));
+
 	cairo_set_font_size(cr, 36);
-	cairo_move_to(cr, x, y);
-	cairo_text_path(cr, mode_buf);
-	cairo_set_source_rgb(cr, 0, 0, 0);
-	cairo_stroke_preserve(cr);
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	cairo_fill(cr);
+	str_width = kmstest_cairo_printf_line(cr, align_hcenter, 10,
+		"%s @ %dHz on %s encoder", c->mode.name, c->mode.vrefresh,
+		kmstest_encoder_type_str(c->encoder->encoder_type));
+
+	cairo_rel_move_to(cr, -str_width / 2, 0);
 
 	/* List available modes */
-	snprintf(mode_buf, sizeof mode_buf, "Available modes:");
 	cairo_set_font_size(cr, 18);
-	cairo_text_extents(cr, mode_buf, &mode_extents);
-	x = modes_x;
-	modes_x = x + mode_extents.width;
-	y += mode_extents.height + 10;
-	modes_y = y;
-	cairo_move_to(cr, x, y);
-	cairo_text_path(cr, mode_buf);
-	cairo_set_source_rgb(cr, 0, 0, 0);
-	cairo_stroke_preserve(cr);
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	cairo_fill(cr);
+	str_width = kmstest_cairo_printf_line(cr, align_left, 10,
+					      "Available modes:");
+	cairo_rel_move_to(cr, str_width, 0);
+	cairo_get_current_point(cr, &x, &top_y);
 
+	max_width = 0;
 	for (i = 0; i < c->connector->count_modes; i++) {
-		snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz",
-			 c->connector->modes[i].name,
-			 c->connector->modes[i].vrefresh);
-		cairo_set_font_size(cr, 18);
-		cairo_text_extents(cr, mode_buf, &mode_extents);
-		x = modes_x - mode_extents.width; /* right justify modes */
-		y += mode_extents.height + 10;
-		if (y + mode_extents.height >= height) {
-			y = modes_y + mode_extents.height + 10;
-			modes_x += mode_extents.width + 10;
-			x = modes_x - mode_extents.width;
+		cairo_get_current_point(cr, &x, &y);
+		if (y >= l_height) {
+			x += max_width + 10;
+			max_width = 0;
+			cairo_move_to(cr, x, top_y);
 		}
-		cairo_move_to(cr, x, y);
-		cairo_text_path(cr, mode_buf);
-		cairo_set_source_rgb(cr, 0, 0, 0);
-		cairo_stroke_preserve(cr);
-		cairo_set_source_rgb(cr, 1, 1, 1);
-		cairo_fill(cr);
+		str_width = kmstest_cairo_printf_line(cr, align_right, 10,
+			"%s @ %dHz", c->connector->modes[i % 2].name,
+			 c->connector->modes[i % 2].vrefresh);
+		if (str_width > max_width)
+			max_width = str_width;
 	}
 
 	if (qr_code)
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [igt PATCH 3/5] lib: add kmstest_get_connector_config
  2013-05-31  9:23 [igt PATCH 1/5] lib: move connector_type_str and co to drmtest Imre Deak
  2013-05-31  9:23 ` [igt PATCH 2/5] lib: add kmstest_cairo_printf_line Imre Deak
@ 2013-05-31  9:23 ` Imre Deak
  2013-06-05 18:00   ` Rodrigo Vivi
  2013-05-31  9:23 ` [igt PATCH 4/5] lib: refactor kmstest_create_fb Imre Deak
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 22+ messages in thread
From: Imre Deak @ 2013-05-31  9:23 UTC (permalink / raw)
  To: intel-gfx

This is used by multiple test cases, so make it shared.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 lib/drmtest.c       | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/drmtest.h       |  14 ++++++
 tests/kms_flip.c    | 115 ++++++++------------------------------------
 tests/testdisplay.c | 134 +++++++++++++++-------------------------------------
 4 files changed, 206 insertions(+), 191 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 3ad77a8..7368077 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -1317,3 +1317,137 @@ int drmtest_set_vt_graphics_mode(void)
 	return orig_vt_mode < 0 ? -1 : 0;
 }
 
+static int get_connector_default_mode(int drm_fd, drmModeConnector *connector,
+				      drmModeModeInfo *mode)
+{
+	drmModeRes *resources;
+	int i;
+
+	resources = drmModeGetResources(drm_fd);
+	if (!resources) {
+		perror("drmModeGetResources failed");
+
+		return -1;
+	}
+
+	if (!connector->count_modes) {
+		fprintf(stderr, "no modes for connector %d\n",
+			connector->connector_id);
+		drmModeFreeResources(resources);
+
+		return -1;
+	}
+
+	for (i = 0; i < connector->count_modes; i++) {
+		if (i == 0 ||
+		    connector->modes[i].type & DRM_MODE_TYPE_PREFERRED) {
+			*mode = connector->modes[i];
+			if (mode->type & DRM_MODE_TYPE_PREFERRED)
+				break;
+		}
+	}
+
+	drmModeFreeResources(resources);
+
+	return 0;
+}
+
+int kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
+				 unsigned long crtc_idx_mask,
+				 struct kmstest_connector_config *config)
+{
+	drmModeRes *resources;
+	drmModeConnector *connector;
+	drmModeEncoder *encoder;
+	int i, j;
+
+	resources = drmModeGetResources(drm_fd);
+	if (!resources) {
+		perror("drmModeGetResources failed");
+		goto err1;
+	}
+
+	/* First, find the connector & mode */
+	connector = drmModeGetConnector(drm_fd, connector_id);
+	if (!connector)
+		goto err2;
+
+	if (connector->connection != DRM_MODE_CONNECTED)
+		goto err3;
+
+	if (!connector->count_modes) {
+		fprintf(stderr, "connector %d has no modes\n", connector_id);
+		goto err3;
+	}
+
+	if (connector->connector_id != connector_id) {
+		fprintf(stderr, "connector id doesn't match (%d != %d)\n",
+			connector->connector_id, connector_id);
+		goto err3;
+	}
+
+	/*
+	 * Find given CRTC if crtc_id != 0 or else the first CRTC not in use.
+	 * In both cases find the first compatible encoder and skip the CRTC
+	 * if there is non such.
+	 */
+	encoder = NULL;		/* suppress GCC warning */
+	for (i = 0; i < resources->count_crtcs; i++) {
+		if (!resources->crtcs[i] || !(crtc_idx_mask & (1 << i)))
+			continue;
+
+		/* Now get a compatible encoder */
+		for (j = 0; j < connector->count_encoders; j++) {
+			encoder = drmModeGetEncoder(drm_fd,
+						    connector->encoders[j]);
+
+			if (!encoder) {
+				fprintf(stderr, "could not get encoder %d: %s\n",
+					resources->encoders[j], strerror(errno));
+
+				continue;
+			}
+
+			if (encoder->possible_crtcs & (1 << i))
+				goto found;
+
+			drmModeFreeEncoder(encoder);
+		}
+	}
+
+	fprintf(stderr,
+		"no crtc with a compatible encoder (crtc_idx_mask %08lx)\n",
+		crtc_idx_mask);
+	goto err3;
+
+found:
+	if (get_connector_default_mode(drm_fd, connector,
+				       &config->default_mode) < 0)
+		goto err4;
+
+	config->connector = connector;
+	config->encoder = encoder;
+	config->crtc = drmModeGetCrtc(drm_fd, resources->crtcs[i]);
+	config->crtc_idx = i;
+	config->pipe = kmstest_get_pipe_from_crtc_id(drm_fd,
+						     config->crtc->crtc_id);
+
+	drmModeFreeResources(resources);
+
+	return 0;
+err4:
+	drmModeFreeEncoder(encoder);
+err3:
+	drmModeFreeConnector(connector);
+err2:
+	drmModeFreeResources(resources);
+err1:
+	return -1;
+}
+
+void kmstest_free_connector_config(struct kmstest_connector_config *config)
+{
+	drmModeFreeCrtc(config->crtc);
+	drmModeFreeEncoder(config->encoder);
+	drmModeFreeConnector(config->connector);
+}
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 3c1368d..89ded11 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -101,6 +101,20 @@ void drmtest_init_aperture_trashers(drm_intel_bufmgr *bufmgr);
 void drmtest_trash_aperture(void);
 void drmtest_cleanup_aperture_trashers(void);
 
+struct kmstest_connector_config {
+	drmModeCrtc *crtc;
+	drmModeConnector *connector;
+	drmModeEncoder *encoder;
+	drmModeModeInfo default_mode;
+	int crtc_idx;
+	int pipe;
+};
+
+int kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
+				 unsigned long crtc_idx_mask,
+				 struct kmstest_connector_config *config);
+void kmstest_free_connector_config(struct kmstest_connector_config *config);
+
 /* helpers to create nice-looking framebuffers */
 struct kmstest_fb {
 	uint32_t fb_id;
diff --git a/tests/kms_flip.c b/tests/kms_flip.c
index 735b4dd..c9b3d8a 100644
--- a/tests/kms_flip.c
+++ b/tests/kms_flip.c
@@ -825,97 +825,23 @@ static void update_all_state(struct test_output *o,
 		update_state(&o->vblank_state);
 }
 
-static void connector_find_preferred_mode(struct test_output *o, int crtc_id)
+static void connector_find_preferred_mode(uint32_t connector_id, int crtc_idx,
+					  struct test_output *o)
 {
-	drmModeConnector *connector;
-	drmModeEncoder *encoder = NULL;
-	int i, j;
-
-	/* First, find the connector & mode */
-	o->mode_valid = 0;
-	o->crtc = 0;
-	connector = drmModeGetConnector(drm_fd, o->id);
-	assert(connector);
-
-	if (connector->connection != DRM_MODE_CONNECTED) {
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	if (!connector->count_modes) {
-		fprintf(stderr, "connector %d has no modes\n", o->id);
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	if (connector->connector_id != o->id) {
-		fprintf(stderr, "connector id doesn't match (%d != %d)\n",
-			connector->connector_id, o->id);
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	for (j = 0; j < connector->count_modes; j++) {
-		o->mode = connector->modes[j];
-		if (o->mode.type & DRM_MODE_TYPE_PREFERRED) {
-			o->mode_valid = 1;
-			break;
-		}
-	}
-
-	if (!o->mode_valid) {
-		if (connector->count_modes > 0) {
-			/* use the first mode as test mode */
-			o->mode = connector->modes[0];
-			o->mode_valid = 1;
-		}
-		else {
-			fprintf(stderr, "failed to find any modes on connector %d\n",
-				o->id);
-			return;
-		}
-	}
+	struct kmstest_connector_config config;
 
-	/* Now get the encoder */
-	for (i = 0; i < connector->count_encoders; i++) {
-		encoder = drmModeGetEncoder(drm_fd, connector->encoders[i]);
-
-		if (!encoder) {
-			fprintf(stderr, "could not get encoder %i: %s\n",
-				resources->encoders[i], strerror(errno));
-			drmModeFreeEncoder(encoder);
-			continue;
-		}
-
-		break;
-	}
-
-	o->encoder = encoder;
-
-	if (i == resources->count_encoders) {
-		fprintf(stderr, "failed to find encoder\n");
-		o->mode_valid = 0;
-		return;
-	}
-
-	/* Find first CRTC not in use */
-	for (i = 0; i < resources->count_crtcs; i++) {
-		if (resources->crtcs[i] != crtc_id)
-			continue;
-		if (resources->crtcs[i] &&
-		    (o->encoder->possible_crtcs & (1<<i))) {
-			o->crtc = resources->crtcs[i];
-			break;
-		}
-	}
-
-	if (!o->crtc) {
-		fprintf(stderr, "could not find requested crtc %d\n", crtc_id);
+	if (kmstest_get_connector_config(drm_fd, connector_id, 1 << crtc_idx,
+					 &config) < 0) {
 		o->mode_valid = 0;
 		return;
 	}
 
-	o->connector = connector;
+	o->connector = config.connector;
+	o->encoder = config.encoder;
+	o->crtc = config.crtc->crtc_id;
+	o->pipe = config.pipe;
+	o->mode = config.default_mode;
+	o->mode_valid = 1;
 }
 
 static void
@@ -1042,21 +968,21 @@ static unsigned event_loop(struct test_output *o, unsigned duration_sec)
 	return end - start;
 }
 
-static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
+static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)
 {
 	unsigned ellapsed;
 
 	o->bpp = 32;
 	o->depth = 24;
 
-	connector_find_preferred_mode(o, crtc);
+	connector_find_preferred_mode(o->id, crtc_idx, o);
 	if (!o->mode_valid)
 		return;
 
 	last_connector = o->connector;
 
 	fprintf(stdout, "Beginning %s on crtc %d, connector %d\n",
-		o->test_name, crtc, o->id);
+		o->test_name, o->crtc, o->id);
 
 	o->fb_width = o->mode.hdisplay;
 	o->fb_height = o->mode.vdisplay;
@@ -1116,7 +1042,7 @@ static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
 		check_final_state(o, &o->vblank_state, ellapsed);
 
 	fprintf(stdout, "\n%s on crtc %d, connector %d: PASSED\n\n",
-		o->test_name, crtc, o->id);
+		o->test_name, o->crtc, o->id);
 
 	kmstest_remove_fb(drm_fd, o->fb_ids[2]);
 	kmstest_remove_fb(drm_fd, o->fb_ids[1]);
@@ -1131,7 +1057,8 @@ static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
 static int run_test(int duration, int flags, const char *test_name)
 {
 	struct test_output o;
-	int c, i;
+	int c;
+	int crtc_idx;
 
 	resources = drmModeGetResources(drm_fd);
 	if (!resources) {
@@ -1142,19 +1069,15 @@ static int run_test(int duration, int flags, const char *test_name)
 
 	/* Find any connected displays */
 	for (c = 0; c < resources->count_connectors; c++) {
-		for (i = 0; i < resources->count_crtcs; i++) {
-			int crtc;
-
+		for (crtc_idx = 0; crtc_idx < resources->count_crtcs; crtc_idx++) {
 			memset(&o, 0, sizeof(o));
 			o.test_name = test_name;
 			o.id = resources->connectors[c];
 			o.flags = flags;
 			o.flip_state.name = "flip";
 			o.vblank_state.name = "vblank";
-			crtc = resources->crtcs[i];
-			o.pipe = kmstest_get_pipe_from_crtc_id(drm_fd, crtc);
 
-			run_test_on_crtc(&o, crtc, duration);
+			run_test_on_crtc(&o, crtc_idx, duration);
 		}
 	}
 
diff --git a/tests/testdisplay.c b/tests/testdisplay.c
index b10c3b9..4470339 100644
--- a/tests/testdisplay.c
+++ b/tests/testdisplay.c
@@ -102,6 +102,7 @@ struct connector {
 	drmModeEncoder *encoder;
 	drmModeConnector *connector;
 	int crtc;
+	int crtc_idx;
 	int pipe;
 };
 
@@ -185,101 +186,31 @@ static void dump_crtcs_fd(int drmfd)
 	drmModeFreeResources(mode_resources);
 }
 
-static void connector_find_preferred_mode(struct connector *c)
+static void connector_find_preferred_mode(uint32_t connector_id,
+					  unsigned long crtc_idx_mask,
+					  int mode_num, struct connector *c)
 {
-	drmModeConnector *connector;
-	drmModeEncoder *encoder = NULL;
-	int i, j;
-
-	/* First, find the connector & mode */
-	c->mode_valid = 0;
-	connector = drmModeGetConnector(drm_fd, c->id);
-	if (!connector) {
-		fprintf(stderr, "could not get connector %d: %s\n",
-			c->id, strerror(errno));
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	if (connector->connection != DRM_MODE_CONNECTED) {
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	if (!connector->count_modes) {
-		fprintf(stderr, "connector %d has no modes\n", c->id);
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	if (connector->connector_id != c->id) {
-		fprintf(stderr, "connector id doesn't match (%d != %d)\n",
-			connector->connector_id, c->id);
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	for (j = 0; j < connector->count_modes; j++) {
-		c->mode = connector->modes[j];
-		if (c->mode.type & DRM_MODE_TYPE_PREFERRED) {
-			c->mode_valid = 1;
-			break;
-		}
-	}
-
-	if ( specified_mode_num != -1 ){
-		c->mode = connector->modes[specified_mode_num];
-		if (c->mode.type & DRM_MODE_TYPE_PREFERRED)
-			c->mode_valid = 1;
-	}
-
-	if (!c->mode_valid) {
-		if (connector->count_modes > 0) {
-			/* use the first mode as test mode */
-			c->mode = connector->modes[0];
-			c->mode_valid = 1;
-		}
-		else {
-			fprintf(stderr, "failed to find any modes on connector %d\n",
-				c->id);
-			return;
-		}
-	}
-
-	/* Now get the encoder */
-	for (i = 0; i < connector->count_encoders; i++) {
-		encoder = drmModeGetEncoder(drm_fd, connector->encoders[i]);
-
-		if (!encoder) {
-			fprintf(stderr, "could not get encoder %i: %s\n",
-				resources->encoders[i], strerror(errno));
-			drmModeFreeEncoder(encoder);
-			continue;
-		}
-
-		break;
-	}
-
-	c->encoder = encoder;
+	struct kmstest_connector_config config;
 
-	if (i == resources->count_encoders) {
-		fprintf(stderr, "failed to find encoder\n");
+	if (kmstest_get_connector_config(drm_fd, connector_id, crtc_idx_mask,
+					 &config) < 0) {
 		c->mode_valid = 0;
 		return;
 	}
 
-	/* Find first CRTC not in use */
-	for (i = 0; i < resources->count_crtcs; i++) {
-		if (resources->crtcs[i] && (c->encoder->possible_crtcs & (1<<i)))
-			break;
+	c->connector = config.connector;
+	c->encoder = config.encoder;
+	c->crtc = config.crtc->crtc_id;
+	c->crtc_idx = config.crtc_idx;
+	c->pipe = config.pipe;
+
+	if (mode_num != -1) {
+		assert(mode_num < config.connector->count_modes);
+		c->mode = config.connector->modes[mode_num];
+	} else {
+		c->mode = config.default_mode;
 	}
-	c->crtc = resources->crtcs[i];
-	c->pipe = i;
-
-	if(test_preferred_mode || force_mode || specified_mode_num != -1)
-		resources->crtcs[i] = 0;
-
-	c->connector = connector;
+	c->mode_valid = 1;
 }
 
 static void
@@ -409,10 +340,6 @@ set_mode(struct connector *c)
 	else if (depth > 16 && depth <= 32)
 		bpp = 32;
 
-	connector_find_preferred_mode(c);
-	if (!c->mode_valid)
-		return;
-
 	test_mode_num = 1;
 	if (force_mode){
 		memcpy( &c->mode, &force_timing, sizeof(force_timing));
@@ -506,13 +433,30 @@ int update_display(void)
 	}
 
 	if (test_preferred_mode || test_all_modes || force_mode || specified_disp_id != -1) {
+		unsigned long crtc_idx_mask = -1UL;
+
 		/* Find any connected displays */
 		for (c = 0; c < resources->count_connectors; c++) {
-			connectors[c].id = resources->connectors[c];
-			if ( specified_disp_id != -1 && connectors[c].id != specified_disp_id )
+			struct connector *connector = &connectors[c];
+
+			connector->id = resources->connectors[c];
+			if (specified_disp_id != -1 &&
+			    connector->id != specified_disp_id)
+				continue;
+
+			connector_find_preferred_mode(connector->id,
+						      crtc_idx_mask,
+						      specified_mode_num,
+						      connector);
+			if (!connector->mode_valid)
 				continue;
 
-			set_mode(&connectors[c]);
+			set_mode(connector);
+
+			if (test_preferred_mode || force_mode ||
+			    specified_mode_num != -1)
+				crtc_idx_mask &= ~(1 << connector->crtc_idx);
+
 		}
 	}
 	drmModeFreeResources(resources);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [igt PATCH 4/5] lib: refactor kmstest_create_fb
  2013-05-31  9:23 [igt PATCH 1/5] lib: move connector_type_str and co to drmtest Imre Deak
  2013-05-31  9:23 ` [igt PATCH 2/5] lib: add kmstest_cairo_printf_line Imre Deak
  2013-05-31  9:23 ` [igt PATCH 3/5] lib: add kmstest_get_connector_config Imre Deak
@ 2013-05-31  9:23 ` Imre Deak
  2013-06-05 18:21   ` Rodrigo Vivi
  2013-05-31  9:23 ` [igt PATCH 5/5] tests: add kms_render Imre Deak
  2013-06-05 17:40 ` [igt PATCH 1/5] lib: move connector_type_str and co to drmtest Rodrigo Vivi
  4 siblings, 1 reply; 22+ messages in thread
From: Imre Deak @ 2013-05-31  9:23 UTC (permalink / raw)
  To: intel-gfx

Factor out parts that will be used by an upcoming patch adding
kmstest_create_fb2.

Also call the fb paint functions directly, there is not much
point in passing a function pointer for that.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 lib/drmtest.c       | 176 ++++++++++++++++++++++++++++++++--------------------
 lib/drmtest.h       |  15 +++--
 tests/kms_flip.c    |  30 +++++----
 tests/testdisplay.c |  15 +++--
 4 files changed, 147 insertions(+), 89 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 7368077..a551e7c 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -39,6 +39,7 @@
 #include <getopt.h>
 #include <stdlib.h>
 #include <linux/kd.h>
+#include <drm/drm_fourcc.h>
 
 #include "drmtest.h"
 #include "i915_drm.h"
@@ -788,16 +789,14 @@ void drmtest_cleanup_aperture_trashers(void)
 }
 
 /* helpers to create nice-looking framebuffers */
-static cairo_surface_t *
-paint_allocate_surface(int fd, int width, int height, int depth, int bpp,
-		       bool tiled,
-		       struct kmstest_fb *fb_info)
+static int create_bo_for_fb(int fd, int width, int height, int bpp,
+			    bool tiled, uint32_t *gem_handle_ret,
+			    unsigned *size_ret, unsigned *stride_ret)
 {
-	cairo_format_t format;
 	struct drm_i915_gem_set_tiling set_tiling;
+	uint32_t gem_handle;
 	int size;
 	unsigned stride;
-	uint32_t *fb_ptr;
 
 	if (tiled) {
 		int v;
@@ -823,49 +822,24 @@ paint_allocate_surface(int fd, int width, int height, int depth, int bpp,
 		size = stride * height;
 	}
 
-	switch (depth) {
-	case 16:
-		format = CAIRO_FORMAT_RGB16_565;
-		break;
-	case 24:
-		format = CAIRO_FORMAT_RGB24;
-		break;
-#if 0
-	case 30:
-		format = CAIRO_FORMAT_RGB30;
-		break;
-#endif
-	case 32:
-		format = CAIRO_FORMAT_ARGB32;
-		break;
-	default:
-		fprintf(stderr, "bad depth %d\n", depth);
-		return NULL;
-	}
-
-	assert (bpp >= depth);
-
-	fb_info->gem_handle = gem_create(fd, size);
+	gem_handle = gem_create(fd, size);
 
 	if (tiled) {
-		set_tiling.handle = fb_info->gem_handle;
+		set_tiling.handle = gem_handle;
 		set_tiling.tiling_mode = I915_TILING_X;
 		set_tiling.stride = stride;
 		if (ioctl(fd, DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling)) {
 			fprintf(stderr, "set tiling failed: %s (stride=%d, size=%d)\n",
 				strerror(errno), stride, size);
-			return NULL;
+			return -1;
 		}
 	}
 
-	fb_ptr = gem_mmap(fd, fb_info->gem_handle, size, PROT_READ | PROT_WRITE);
-
-	fb_info->stride = stride;
-	fb_info->size = size;
+	*stride_ret = stride;
+	*size_ret = size;
+	*gem_handle_ret = gem_handle;
 
-	return cairo_image_surface_create_for_data((unsigned char *)fb_ptr,
-						   format, width, height,
-						   stride);
+	return 0;
 }
 
 static void
@@ -981,23 +955,8 @@ paint_marker(cairo_t *cr, int x, int y)
 	kmstest_cairo_printf_line(cr, align, 0, "(%d, %d)", x, y);
 }
 
-unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
-			       int depth, bool tiled,
-			       struct kmstest_fb *fb_info,
-			       kmstest_paint_func paint_func,
-			       void *func_arg)
+void kmstest_paint_test_pattern(cairo_t *cr, int width, int height)
 {
-	cairo_surface_t *surface;
-	cairo_status_t status;
-	cairo_t *cr;
-	unsigned int fb_id;
-
-	surface = paint_allocate_surface(fd, width, height, depth, bpp,
-					 tiled, fb_info);
-	assert(surface);
-
-	cr = cairo_create(surface);
-
 	paint_test_patterns(cr, width, height);
 
 	cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
@@ -1008,27 +967,112 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 	paint_marker(cr, 0, height);
 	paint_marker(cr, width, height);
 
-	if (paint_func)
-		paint_func(cr, width, height, func_arg);
+	assert(!cairo_status(cr));
+}
+
+#define DF(did, cid, _bpp, _depth)	\
+	{ DRM_FORMAT_##did, CAIRO_FORMAT_##cid, # did, _bpp, _depth }
+static struct format_desc_struct {
+	uint32_t drm_id;
+	cairo_format_t cairo_id;
+	const char *name;
+	int bpp;
+	int depth;
+} format_desc[] = {
+	DF(RGB565,	RGB16_565,	16, 16),
+	DF(RGB888,	INVALID,	24, 24),
+	DF(XRGB8888,	RGB24,		32, 24),
+	DF(XRGB2101010,	RGB30,		32, 30),
+	DF(ARGB8888,	ARGB32,		32, 32),
+};
+#undef DF
+
+#define for_each_format(f)	\
+	for (f = format_desc; f - format_desc < ARRAY_SIZE(format_desc); f++)
+
+static uint32_t bpp_depth_to_drm_format(int bpp, int depth)
+{
+	struct format_desc_struct *f;
+
+	for_each_format(f)
+		if (f->bpp == bpp && f->depth == depth)
+			return f->drm_id;
+
+	abort();
+}
+
+/* Return fb_id on success, 0 on error */
+unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
+			       int depth, bool tiled, struct kmstest_fb *fb)
+{
+	memset(fb, 0, sizeof(*fb));
 
-	status = cairo_status(cr);
-	assert(!status);
-	cairo_destroy(cr);
+	if (create_bo_for_fb(fd, width, height, bpp, tiled, &fb->gem_handle,
+			       &fb->size, &fb->stride) < 0)
+		return 0;
+
+	if (drmModeAddFB(fd, width, height, depth, bpp, fb->stride,
+			       fb->gem_handle, &fb->fb_id) < 0) {
+		gem_close(fd, fb->gem_handle);
+
+		return 0;
+	}
+
+	fb->width = width;
+	fb->height = height;
+	fb->drm_format = bpp_depth_to_drm_format(bpp, depth);
+
+	return fb->fb_id;
+}
+
+static cairo_format_t drm_format_to_cairo(uint32_t drm_format)
+{
+	struct format_desc_struct *f;
 
-	do_or_die(drmModeAddFB(fd, width, height, depth, bpp,
-			       fb_info->stride,
-			       fb_info->gem_handle, &fb_id));
+	for_each_format(f)
+		if (f->drm_id == drm_format)
+			return f->cairo_id;
 
+	abort();
+}
+
+static cairo_t *create_cairo_ctx(int fd, struct kmstest_fb *fb)
+{
+	cairo_t *cr;
+	cairo_surface_t *surface;
+	cairo_format_t cformat;
+	void *fb_ptr;
+
+	cformat = drm_format_to_cairo(fb->drm_format);
+	fb_ptr = gem_mmap(fd, fb->gem_handle, fb->size, PROT_READ | PROT_WRITE);
+	surface = cairo_image_surface_create_for_data((unsigned char *)fb_ptr,
+						   cformat, fb->width,
+						   fb->height, fb->stride);
+	assert(surface);
+	cr = cairo_create(surface);
 	cairo_surface_destroy(surface);
 
-	fb_info->fb_id = fb_id;
+	return cr;
+}
+
+cairo_t *kmstest_get_cairo_ctx(int fd, struct kmstest_fb *fb)
+{
+
+	if (!fb->cairo_ctx)
+		fb->cairo_ctx = create_cairo_ctx(fd, fb);
+
+	gem_set_domain(fd, fb->gem_handle, I915_GEM_DOMAIN_CPU,
+		       I915_GEM_DOMAIN_CPU);
 
-	return fb_id;
+	return fb->cairo_ctx;
 }
 
-void kmstest_remove_fb(int fd, int fb_id)
+void kmstest_remove_fb(int fd, struct kmstest_fb *fb)
 {
-	do_or_die(drmModeRmFB(fd, fb_id));
+	if (fb->cairo_ctx)
+		cairo_destroy(fb->cairo_ctx);
+	do_or_die(drmModeRmFB(fd, fb->fb_id));
+	gem_close(fd, fb->gem_handle);
 }
 
 struct type_name {
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 89ded11..218914f 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -119,8 +119,13 @@ void kmstest_free_connector_config(struct kmstest_connector_config *config);
 struct kmstest_fb {
 	uint32_t fb_id;
 	uint32_t gem_handle;
+	uint32_t drm_format;
+	int width;
+	int height;
+	int depth;
 	unsigned stride;
 	unsigned size;
+	cairo_t *cairo_ctx;
 };
 
 enum kmstest_text_align {
@@ -136,14 +141,12 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
 			       double yspacing, const char *fmt, ...)
 			       __attribute__((format (printf, 4, 5)));
 
-typedef void (*kmstest_paint_func)(cairo_t *cr, int width, int height, void *priv);
-
 unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 			       int depth, bool tiled,
-			       struct kmstest_fb *fb_info,
-			       kmstest_paint_func paint_func,
-			       void *func_arg);
-void kmstest_remove_fb(int fd, int fb_id);
+			       struct kmstest_fb *fb_info);
+void kmstest_remove_fb(int fd, struct kmstest_fb *fb_info);
+cairo_t *kmstest_get_cairo_ctx(int fd, struct kmstest_fb *fb);
+void kmstest_paint_test_pattern(cairo_t *cr, int width, int height);
 void kmstest_dump_mode(drmModeModeInfo *mode);
 int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id);
 const char *kmstest_encoder_type_str(int type);
diff --git a/tests/kms_flip.c b/tests/kms_flip.c
index c9b3d8a..aeeaace 100644
--- a/tests/kms_flip.c
+++ b/tests/kms_flip.c
@@ -844,10 +844,13 @@ static void connector_find_preferred_mode(uint32_t connector_id, int crtc_idx,
 	o->mode_valid = 1;
 }
 
-static void
-paint_flip_mode(cairo_t *cr, int width, int height, void *priv)
+static void paint_flip_mode(struct kmstest_fb *fb, bool odd_frame)
 {
-	bool odd_frame = (bool) priv;
+	cairo_t *cr = kmstest_get_cairo_ctx(drm_fd, fb);
+	int width = fb->width;
+	int height = fb->height;
+
+	kmstest_paint_test_pattern(cr, width, height);
 
 	if (odd_frame)
 		cairo_rectangle(cr, width/4, height/2, width/4, height/8);
@@ -856,6 +859,8 @@ paint_flip_mode(cairo_t *cr, int width, int height, void *priv)
 
 	cairo_set_source_rgb(cr, 1, 1, 1);
 	cairo_fill(cr);
+
+	assert(!cairo_status(cr));
 }
 
 static int
@@ -991,20 +996,21 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)
 		o->fb_width *= 2;
 
 	o->fb_ids[0] = kmstest_create_fb(drm_fd, o->fb_width, o->fb_height,
-					 o->bpp, o->depth, false, &o->fb_info[0],
-					 paint_flip_mode, (void *)false);
+					 o->bpp, o->depth, false, &o->fb_info[0]);
 	o->fb_ids[1] = kmstest_create_fb(drm_fd, o->fb_width, o->fb_height,
-					 o->bpp, o->depth, false, &o->fb_info[1],
-					 paint_flip_mode, (void *)true);
+					 o->bpp, o->depth, false, &o->fb_info[1]);
 	o->fb_ids[2] = kmstest_create_fb(drm_fd, o->fb_width, o->fb_height,
-					 o->bpp, o->depth, true, &o->fb_info[2],
-					 paint_flip_mode, (void *)true);
+					 o->bpp, o->depth, true, &o->fb_info[2]);
 
 	if (!o->fb_ids[0] || !o->fb_ids[1] || !o->fb_ids[2]) {
 		fprintf(stderr, "failed to create fbs\n");
 		exit(3);
 	}
 
+	paint_flip_mode(&o->fb_info[0], false);
+	paint_flip_mode(&o->fb_info[1], true);
+	paint_flip_mode(&o->fb_info[2], true);
+
 	set_y_tiling(o, 2);
 
 	kmstest_dump_mode(&o->mode);
@@ -1044,9 +1050,9 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)
 	fprintf(stdout, "\n%s on crtc %d, connector %d: PASSED\n\n",
 		o->test_name, o->crtc, o->id);
 
-	kmstest_remove_fb(drm_fd, o->fb_ids[2]);
-	kmstest_remove_fb(drm_fd, o->fb_ids[1]);
-	kmstest_remove_fb(drm_fd, o->fb_ids[0]);
+	kmstest_remove_fb(drm_fd, &o->fb_info[2]);
+	kmstest_remove_fb(drm_fd, &o->fb_info[1]);
+	kmstest_remove_fb(drm_fd, &o->fb_info[0]);
 
 	last_connector = NULL;
 
diff --git a/tests/testdisplay.c b/tests/testdisplay.c
index 4470339..5ece921 100644
--- a/tests/testdisplay.c
+++ b/tests/testdisplay.c
@@ -258,15 +258,18 @@ static void paint_image(cairo_t *cr, const char *file)
 	cairo_surface_destroy(image);
 }
 
-static void
-paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
+static void paint_output_info(struct connector *c, struct kmstest_fb *fb)
 {
-	struct connector *c = priv;
+	cairo_t *cr = kmstest_get_cairo_ctx(drm_fd, fb);
+	int l_width = fb->width;
+	int l_height = fb->height;
 	double str_width;
 	double x, y, top_y;
 	double max_width;
 	int i;
 
+	kmstest_paint_test_pattern(cr, l_width, l_height);
+
 	cairo_select_font_face(cr, "Helvetica",
 			       CAIRO_FONT_SLANT_NORMAL,
 			       CAIRO_FONT_WEIGHT_NORMAL);
@@ -308,6 +311,8 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
 
 	if (qr_code)
 		paint_image(cr, "./pass.png");
+
+	assert(!cairo_status(cr));
 }
 
 static void sighandler(int signo)
@@ -362,8 +367,8 @@ set_mode(struct connector *c)
 		height = c->mode.vdisplay;
 
 		fb_id = kmstest_create_fb(drm_fd, width, height, bpp, depth,
-					  enable_tiling, &fb_info,
-					  paint_output_info, c);
+					  enable_tiling, &fb_info);
+		paint_output_info(c, &fb_info);
 
 		fb_ptr = gem_mmap(drm_fd, fb_info.gem_handle,
 				  fb_info.size, PROT_READ | PROT_WRITE);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [igt PATCH 5/5] tests: add kms_render
  2013-05-31  9:23 [igt PATCH 1/5] lib: move connector_type_str and co to drmtest Imre Deak
                   ` (2 preceding siblings ...)
  2013-05-31  9:23 ` [igt PATCH 4/5] lib: refactor kmstest_create_fb Imre Deak
@ 2013-05-31  9:23 ` Imre Deak
  2013-06-05 18:28   ` Rodrigo Vivi
  2013-06-05 19:25   ` [PATCH v2 0/6] tests: add tests for front buffer rendering Imre Deak
  2013-06-05 17:40 ` [igt PATCH 1/5] lib: move connector_type_str and co to drmtest Rodrigo Vivi
  4 siblings, 2 replies; 22+ messages in thread
From: Imre Deak @ 2013-05-31  9:23 UTC (permalink / raw)
  To: intel-gfx

Add a test going through all connectors/crtcs/modes/formats painting to
a front FB with CPU or painting to a back FB with CPU and blitting it
to the front FB.

Only formats understood by cairo are supported for now.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 lib/drmtest.c      | 101 ++++++++++++++++++++--
 lib/drmtest.h      |   7 ++
 tests/.gitignore   |   1 +
 tests/Makefile.am  |   1 +
 tests/kms_render.c | 245 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 349 insertions(+), 6 deletions(-)
 create mode 100644 tests/kms_render.c

diff --git a/lib/drmtest.c b/lib/drmtest.c
index a551e7c..d9d58e5 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -842,8 +842,8 @@ static int create_bo_for_fb(int fd, int width, int height, int bpp,
 	return 0;
 }
 
-static void
-paint_color_gradient(cairo_t *cr, int x, int y, int w, int h,
+void
+kmstest_paint_color_gradient(cairo_t *cr, int x, int y, int w, int h,
 		     int r, int g, int b)
 {
 	cairo_pattern_t *pat;
@@ -869,16 +869,16 @@ paint_test_patterns(cairo_t *cr, int width, int height)
 	gr_height = height * 0.08;
 	x = (width / 2) - (gr_width / 2);
 
-	paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 0, 0);
+	kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 0, 0);
 
 	y += gr_height;
-	paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 1, 0);
+	kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 1, 0);
 
 	y += gr_height;
-	paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 0, 1);
+	kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 0, 1);
 
 	y += gr_height;
-	paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
+	kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
 }
 
 int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
@@ -1025,6 +1025,55 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 	return fb->fb_id;
 }
 
+static uint32_t drm_format_to_bpp(uint32_t drm_format)
+{
+	struct format_desc_struct *f;
+
+	for_each_format(f)
+		if (f->drm_id == drm_format)
+			return f->bpp;
+
+	abort();
+}
+
+unsigned int kmstest_create_fb2(int fd, int width, int height, uint32_t format,
+			        bool tiled, struct kmstest_fb *fb)
+{
+	uint32_t handles[4];
+	uint32_t pitches[4];
+	uint32_t offsets[4];
+	uint32_t fb_id;
+	int bpp;
+	int ret;
+
+	memset(fb, 0, sizeof(*fb));
+
+	bpp = drm_format_to_bpp(format);
+	ret = create_bo_for_fb(fd, width, height, bpp, tiled, &fb->gem_handle,
+			      &fb->size, &fb->stride);
+	if (ret < 0)
+		return ret;
+
+	memset(handles, 0, sizeof(handles));
+	handles[0] = fb->gem_handle;
+	memset(pitches, 0, sizeof(pitches));
+	pitches[0] = fb->stride;
+	memset(offsets, 0, sizeof(offsets));
+	if (drmModeAddFB2(fd, width, height, format, handles, pitches,
+			  offsets, &fb_id, 0) < 0) {
+		gem_close(fd, fb->gem_handle);
+
+		return 0;
+	}
+
+	fb->width = width;
+	fb->height = height;
+	fb->drm_format = format;
+	fb->fb_id = fb_id;
+
+	return fb_id;
+}
+
 static cairo_format_t drm_format_to_cairo(uint32_t drm_format)
 {
 	struct format_desc_struct *f;
@@ -1075,6 +1124,46 @@ void kmstest_remove_fb(int fd, struct kmstest_fb *fb)
 	gem_close(fd, fb->gem_handle);
 }
 
+const char *kmstest_format_str(uint32_t drm_format)
+{
+	struct format_desc_struct *f;
+
+	for_each_format(f)
+		if (f->drm_id == drm_format)
+			return f->name;
+
+	return "invalid";
+}
+
+const char *kmstest_pipe_str(int pipe)
+{
+	const char *str[] = { "A", "B", "C" };
+
+	if (pipe > 2)
+		return "invalid";
+
+	return str[pipe];
+}
+
+void kmstest_get_all_formats(const uint32_t **formats, int *format_count)
+{
+	static uint32_t *drm_formats;
+
+	if (!drm_formats) {
+		struct format_desc_struct *f;
+		uint32_t *format;
+
+		drm_formats = calloc(ARRAY_SIZE(format_desc),
+				     sizeof(*drm_formats));
+		format = &drm_formats[0];
+		for_each_format(f)
+			*format++ = f->drm_id;
+	}
+
+	*formats = drm_formats;
+	*format_count = ARRAY_SIZE(format_desc);
+}
+
 struct type_name {
 	int type;
 	const char *name;
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 218914f..e3a9275 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -144,11 +144,18 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
 unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 			       int depth, bool tiled,
 			       struct kmstest_fb *fb_info);
+unsigned int kmstest_create_fb2(int fd, int width, int height, uint32_t format,
+			        bool tiled, struct kmstest_fb *fb);
 void kmstest_remove_fb(int fd, struct kmstest_fb *fb_info);
 cairo_t *kmstest_get_cairo_ctx(int fd, struct kmstest_fb *fb);
+void kmstest_paint_color_gradient(cairo_t *cr, int x, int y, int w, int h,
+				  int r, int g, int b);
 void kmstest_paint_test_pattern(cairo_t *cr, int width, int height);
 void kmstest_dump_mode(drmModeModeInfo *mode);
 int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id);
+const char *kmstest_format_str(uint32_t drm_format);
+const char *kmstest_pipe_str(int pipe);
+void kmstest_get_all_formats(const uint32_t **formats, int *format_count);
 const char *kmstest_encoder_type_str(int type);
 const char *kmstest_connector_status_str(int type);
 const char *kmstest_connector_type_str(int type);
diff --git a/tests/.gitignore b/tests/.gitignore
index 3cac813..1f7c691 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -85,6 +85,7 @@ getclient
 getstats
 getversion
 kms_flip
+kms_render
 prime_nv_api
 prime_nv_pcopy
 prime_nv_test
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 7250968..3f301c9 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -33,6 +33,7 @@ TESTS_progs_M = \
 	gem_tiled_partial_pwrite_pread \
 	$(NOUVEAU_TESTS_M) \
 	kms_flip \
+	kms_render \
 	prime_self_import \
 	$(NULL)
 
diff --git a/tests/kms_render.c b/tests/kms_render.c
new file mode 100644
index 0000000..707ce27
--- /dev/null
+++ b/tests/kms_render.c
@@ -0,0 +1,245 @@
+/*
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Imre Deak <imre.deak@intel.com>
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <assert.h>
+#include <cairo.h>
+#include <errno.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+#include "drmtest.h"
+#include "testdisplay.h"
+#include "intel_bufmgr.h"
+#include "intel_batchbuffer.h"
+#include "intel_gpu_tools.h"
+
+drmModeRes *resources;
+int drm_fd;
+static drm_intel_bufmgr *bufmgr;
+struct intel_batchbuffer *batch;
+uint32_t devid;
+
+enum test_flags {
+	TEST_DIRECT_RENDER	= 0x01,
+	TEST_GPU_BLIT		= 0x02,
+};
+
+static int paint_fb(struct kmstest_fb *fb, const char *test_name,
+		    const char *mode_format_str, const char *cconf_str)
+{
+	cairo_t *cr;
+
+	cr = kmstest_get_cairo_ctx(drm_fd, fb);
+	if (!cr)
+		return -1;
+
+	kmstest_paint_color_gradient(cr, 0, 0, fb->width, fb->height, 1, 1, 1);
+	kmstest_paint_test_pattern(cr, fb->width, fb->height);
+
+	cairo_select_font_face(cr, "Helvetica", CAIRO_FONT_SLANT_NORMAL,
+			       CAIRO_FONT_WEIGHT_NORMAL);
+	cairo_move_to(cr, fb->width / 2, fb->height / 2);
+	cairo_set_font_size(cr, 36);
+	kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s", test_name);
+	kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s", mode_format_str);
+	kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s", cconf_str);
+
+	return 0;
+}
+
+static void gpu_blit(struct kmstest_fb *dst_fb, struct kmstest_fb *src_fb)
+{
+	drm_intel_bo *dst_bo;
+	drm_intel_bo *src_bo;
+
+	dst_bo = gem_handle_to_libdrm_bo(bufmgr, drm_fd, "destination",
+					 dst_fb->gem_handle);
+	assert(dst_bo);
+	src_bo = gem_handle_to_libdrm_bo(bufmgr, drm_fd, "source",
+					 src_fb->gem_handle);
+	assert(src_bo);
+
+	intel_copy_bo(batch, dst_bo, src_bo, src_fb->width, src_fb->height);
+	intel_batchbuffer_flush(batch);
+	gem_quiescent_gpu(drm_fd);
+
+	drm_intel_bo_unreference(src_bo);
+	drm_intel_bo_unreference(dst_bo);
+}
+
+static int test_format(const char *test_name,
+		       struct kmstest_connector_config *cconf,
+		       drmModeModeInfo *mode, uint32_t format,
+		       enum test_flags flags)
+{
+	int width;
+	int height;
+	struct kmstest_fb fb[2];
+	char *mode_format_str;
+	char *cconf_str;
+	int ret;
+
+	ret = asprintf(&mode_format_str, "%s @ %dHz / %s",
+		 mode->name, mode->vrefresh, kmstest_format_str(format));
+	assert(ret > 0);
+	ret = asprintf(&cconf_str, "pipe %s, encoder %s, connector %s",
+		       kmstest_pipe_str(cconf->pipe),
+		       kmstest_encoder_type_str(cconf->encoder->encoder_type),
+		       kmstest_connector_type_str(cconf->connector->connector_type));
+	assert(ret > 0);
+
+	printf("Beginning test %s with %s on %s\n",
+		test_name, mode_format_str, cconf_str);
+
+	width = mode->hdisplay;
+	height = mode->vdisplay;
+
+	if (!kmstest_create_fb2(drm_fd, width, height, format, false, &fb[0]))
+		goto err1;
+
+	if (!kmstest_create_fb2(drm_fd, width, height, format, false, &fb[1]))
+		goto err2;
+
+	do_or_die(drmModeSetCrtc(drm_fd, cconf->crtc->crtc_id, fb[0].fb_id,
+				 0, 0, &cconf->connector->connector_id, 1,
+				 mode));
+	do_or_die(drmModePageFlip(drm_fd, cconf->crtc->crtc_id, fb[0].fb_id,
+				  0, NULL));
+	sleep(2);
+
+	if (flags & TEST_DIRECT_RENDER) {
+		paint_fb(&fb[0], test_name, mode_format_str, cconf_str);
+	} else if (flags & TEST_GPU_BLIT) {
+		paint_fb(&fb[1], test_name, mode_format_str, cconf_str);
+		gpu_blit(&fb[0], &fb[1]);
+	}
+	sleep(5);
+
+	printf("Test %s with %s on %s: PASSED\n",
+		test_name, mode_format_str, cconf_str);
+	free(mode_format_str);
+	free(cconf_str);
+
+	kmstest_remove_fb(drm_fd, &fb[1]);
+	kmstest_remove_fb(drm_fd, &fb[0]);
+
+	return 0;
+
+err2:
+	kmstest_remove_fb(drm_fd, &fb[0]);
+err1:
+	fprintf(stderr, "skip testing unsupported format %s\n",
+		kmstest_format_str(format));
+
+	return -1;
+}
+
+static void test_connector(const char *test_name,
+			   struct kmstest_connector_config *cconf,
+			   enum test_flags flags)
+{
+	const uint32_t *formats;
+	int format_count;
+	int i;
+
+	kmstest_get_all_formats(&formats, &format_count);
+	for (i = 0; i < cconf->connector->count_modes; i++) {
+		int j;
+
+		for (j = 0; j < format_count; j++)
+			test_format(test_name,
+				    cconf, &cconf->connector->modes[i],
+				    formats[j], flags);
+	}
+}
+
+static int run_test(const char *test_name, enum test_flags flags)
+{
+	int i;
+
+	resources = drmModeGetResources(drm_fd);
+	assert(resources);
+
+	/* Find any connected displays */
+	for (i = 0; i < resources->count_connectors; i++) {
+		uint32_t connector_id;
+		int j;
+
+		connector_id = resources->connectors[i];
+		for (j = 0; j < resources->count_crtcs; j++) {
+			struct kmstest_connector_config cconf;
+			int ret;
+
+			ret = kmstest_get_connector_config(drm_fd, connector_id,
+							   1 << j, &cconf);
+			if (ret < 0)
+				continue;
+
+			test_connector(test_name, &cconf, flags);
+
+			kmstest_free_connector_config(&cconf);
+		}
+	}
+
+	drmModeFreeResources(resources);
+
+	return 1;
+}
+
+int main(int argc, char **argv)
+{
+	struct {
+		enum test_flags flags;
+		const char *name;
+	} tests[] = {
+		{ TEST_DIRECT_RENDER,	"direct-render" },
+		{ TEST_GPU_BLIT,	"gpu-blit" },
+	};
+	int i;
+
+	drmtest_subtest_init(argc, argv);
+
+	if (!drmtest_only_list_subtests()) {
+		drm_fd = drm_open_any();
+
+		bufmgr = drm_intel_bufmgr_gem_init(drm_fd, 4096);
+		devid = intel_get_drm_devid(drm_fd);
+		batch = intel_batchbuffer_alloc(bufmgr, devid);
+
+		do_or_die(drmtest_set_vt_graphics_mode());
+	}
+
+	for (i = 0; i < ARRAY_SIZE(tests); i++) {
+		if (drmtest_run_subtest(tests[i].name))
+			run_test(tests[i].name, tests[i].flags);
+	}
+
+	if (!drmtest_only_list_subtests())
+		close(drm_fd);
+
+	return 0;
+}
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [igt PATCH 1/5] lib: move connector_type_str and co to drmtest
  2013-05-31  9:23 [igt PATCH 1/5] lib: move connector_type_str and co to drmtest Imre Deak
                   ` (3 preceding siblings ...)
  2013-05-31  9:23 ` [igt PATCH 5/5] tests: add kms_render Imre Deak
@ 2013-06-05 17:40 ` Rodrigo Vivi
  4 siblings, 0 replies; 22+ messages in thread
From: Rodrigo Vivi @ 2013-06-05 17:40 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-gfx

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>

On Fri, May 31, 2013 at 6:23 AM, Imre Deak <imre.deak@intel.com> wrote:
> These are used by multiple test cases, so make them shared.
>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  demos/intel_sprite_on.c | 58 ++++------------------------------------------
>  lib/drmtest.c           | 54 +++++++++++++++++++++++++++++++++++++++++++
>  lib/drmtest.h           |  3 +++
>  tests/testdisplay.c     | 61 ++++---------------------------------------------
>  4 files changed, 65 insertions(+), 111 deletions(-)
>
> diff --git a/demos/intel_sprite_on.c b/demos/intel_sprite_on.c
> index 62bd98e..783f9af 100644
> --- a/demos/intel_sprite_on.c
> +++ b/demos/intel_sprite_on.c
> @@ -53,56 +53,6 @@
>
>  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
>
> -struct type_name {
> -       int                 type;
> -       const char          *name;
> -};
> -
> -#define type_name_fn(res) \
> -       static const char * res##_str(int type) {               \
> -               unsigned int i;                                 \
> -               for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \
> -                       if (res##_names[i].type == type)        \
> -                       return res##_names[i].name;             \
> -               }                                               \
> -               return "(invalid)";                             \
> -       }
> -
> -struct type_name encoder_type_names[] = {
> -       { DRM_MODE_ENCODER_NONE, "none" },
> -       { DRM_MODE_ENCODER_DAC, "DAC" },
> -       { DRM_MODE_ENCODER_TMDS, "TMDS" },
> -       { DRM_MODE_ENCODER_LVDS, "LVDS" },
> -       { DRM_MODE_ENCODER_TVDAC, "TVDAC" },
> -};
> -type_name_fn(encoder_type)
> -
> -struct type_name connector_status_names[] = {
> -       { DRM_MODE_CONNECTED, "connected" },
> -       { DRM_MODE_DISCONNECTED, "disconnected" },
> -       { DRM_MODE_UNKNOWNCONNECTION, "unknown" },
> -};
> -type_name_fn(connector_status)
> -
> -struct type_name connector_type_names[] = {
> -       { DRM_MODE_CONNECTOR_Unknown, "unknown" },
> -       { DRM_MODE_CONNECTOR_VGA, "VGA" },
> -       { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
> -       { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
> -       { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
> -       { DRM_MODE_CONNECTOR_Composite, "composite" },
> -       { DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
> -       { DRM_MODE_CONNECTOR_LVDS, "LVDS" },
> -       { DRM_MODE_CONNECTOR_Component, "component" },
> -       { DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" },
> -       { DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort" },
> -       { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
> -       { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
> -       { DRM_MODE_CONNECTOR_TV, "TV" },
> -       { DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort" },
> -};
> -type_name_fn(connector_type)
> -
>  /*
>   * Mode setting with the kernel interfaces is a bit of a chore.
>   * First you have to find the connector in question and make sure the
> @@ -157,8 +107,8 @@ static void dump_connectors(int gfx_fd, drmModeRes *resources)
>                 printf("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n",
>                         connector->connector_id,
>                         connector->encoder_id,
> -                       connector_status_str(connector->connection),
> -                       connector_type_str(connector->connector_type),
> +                       kmstest_connector_status_str(connector->connection),
> +                       kmstest_connector_type_str(connector->connector_type),
>                         connector->mmWidth, connector->mmHeight,
>                         connector->count_modes);
>
> @@ -744,14 +694,14 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
>                                 curr_connector.mode.flags,
>                                 curr_connector.encoder->encoder_id,
>                                 curr_connector.encoder->encoder_type,
> -                               encoder_type_str(curr_connector.encoder->encoder_type),
> +                               kmstest_encoder_type_str(curr_connector.encoder->encoder_type),
>                                 curr_connector.encoder->crtc_id,
>                                 curr_connector.encoder->possible_crtcs,
>                                 curr_connector.encoder->possible_clones,
>                                 curr_connector.connector->connector_id,
>                                 curr_connector.connector->encoder_id,
>                                 curr_connector.connector->connector_type,
> -                               connector_type_str(curr_connector.connector->connector_type),
> +                               kmstest_connector_type_str(curr_connector.connector->connector_type),
>                                 curr_connector.connector->connector_type_id);
>
>                         printf("Sprite surface dimensions = %dx%d\n"
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index d17dbb0..3c4812f 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -1023,6 +1023,60 @@ void kmstest_remove_fb(int fd, int fb_id)
>         do_or_die(drmModeRmFB(fd, fb_id));
>  }
>
> +struct type_name {
> +       int type;
> +       const char *name;
> +};
> +
> +#define type_name_fn(res) \
> +const char * kmstest_##res##_str(int type) {           \
> +       unsigned int i;                                 \
> +       for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \
> +               if (res##_names[i].type == type)        \
> +                       return res##_names[i].name;     \
> +       }                                               \
> +       return "(invalid)";                             \
> +}
> +
> +struct type_name encoder_type_names[] = {
> +       { DRM_MODE_ENCODER_NONE, "none" },
> +       { DRM_MODE_ENCODER_DAC, "DAC" },
> +       { DRM_MODE_ENCODER_TMDS, "TMDS" },
> +       { DRM_MODE_ENCODER_LVDS, "LVDS" },
> +       { DRM_MODE_ENCODER_TVDAC, "TVDAC" },
> +};
> +
> +type_name_fn(encoder_type)
> +
> +struct type_name connector_status_names[] = {
> +       { DRM_MODE_CONNECTED, "connected" },
> +       { DRM_MODE_DISCONNECTED, "disconnected" },
> +       { DRM_MODE_UNKNOWNCONNECTION, "unknown" },
> +};
> +
> +type_name_fn(connector_status)
> +
> +struct type_name connector_type_names[] = {
> +       { DRM_MODE_CONNECTOR_Unknown, "unknown" },
> +       { DRM_MODE_CONNECTOR_VGA, "VGA" },
> +       { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
> +       { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
> +       { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
> +       { DRM_MODE_CONNECTOR_Composite, "composite" },
> +       { DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
> +       { DRM_MODE_CONNECTOR_LVDS, "LVDS" },
> +       { DRM_MODE_CONNECTOR_Component, "component" },
> +       { DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" },
> +       { DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort" },
> +       { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
> +       { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
> +       { DRM_MODE_CONNECTOR_TV, "TV" },
> +       { DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort" },
> +};
> +
> +type_name_fn(connector_type)
> +
> +
>  void kmstest_dump_mode(drmModeModeInfo *mode)
>  {
>         printf("  %s %d %d %d %d %d %d %d %d %d 0x%x 0x%x %d\n",
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 7202ad5..38aeb9d 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -119,6 +119,9 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
>  void kmstest_remove_fb(int fd, int fb_id);
>  void kmstest_dump_mode(drmModeModeInfo *mode);
>  int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id);
> +const char *kmstest_encoder_type_str(int type);
> +const char *kmstest_connector_status_str(int type);
> +const char *kmstest_connector_type_str(int type);
>
>  inline static void _do_or_die(const char *function, int line, int ret)
>  {
> diff --git a/tests/testdisplay.c b/tests/testdisplay.c
> index 80cd112..e7a2555 100644
> --- a/tests/testdisplay.c
> +++ b/tests/testdisplay.c
> @@ -88,59 +88,6 @@ uint32_t *fb_ptr;
>
>  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
>
> -struct type_name {
> -       int type;
> -       const char *name;
> -};
> -
> -#define type_name_fn(res) \
> -static const char * res##_str(int type) {                      \
> -       unsigned int i;                                 \
> -       for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \
> -               if (res##_names[i].type == type)        \
> -                       return res##_names[i].name;     \
> -       }                                               \
> -       return "(invalid)";                             \
> -}
> -
> -struct type_name encoder_type_names[] = {
> -       { DRM_MODE_ENCODER_NONE, "none" },
> -       { DRM_MODE_ENCODER_DAC, "DAC" },
> -       { DRM_MODE_ENCODER_TMDS, "TMDS" },
> -       { DRM_MODE_ENCODER_LVDS, "LVDS" },
> -       { DRM_MODE_ENCODER_TVDAC, "TVDAC" },
> -};
> -
> -type_name_fn(encoder_type)
> -
> -struct type_name connector_status_names[] = {
> -       { DRM_MODE_CONNECTED, "connected" },
> -       { DRM_MODE_DISCONNECTED, "disconnected" },
> -       { DRM_MODE_UNKNOWNCONNECTION, "unknown" },
> -};
> -
> -type_name_fn(connector_status)
> -
> -struct type_name connector_type_names[] = {
> -       { DRM_MODE_CONNECTOR_Unknown, "unknown" },
> -       { DRM_MODE_CONNECTOR_VGA, "VGA" },
> -       { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
> -       { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
> -       { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
> -       { DRM_MODE_CONNECTOR_Composite, "composite" },
> -       { DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
> -       { DRM_MODE_CONNECTOR_LVDS, "LVDS" },
> -       { DRM_MODE_CONNECTOR_Component, "component" },
> -       { DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" },
> -       { DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort" },
> -       { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
> -       { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
> -       { DRM_MODE_CONNECTOR_TV, "TV" },
> -       { DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort" },
> -};
> -
> -type_name_fn(connector_type)
> -
>  /*
>   * Mode setting with the kernel interfaces is a bit of a chore.
>   * First you have to find the connector in question and make sure the
> @@ -185,8 +132,8 @@ static void dump_connectors_fd(int drmfd)
>                 printf("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n",
>                        connector->connector_id,
>                        connector->encoder_id,
> -                      connector_status_str(connector->connection),
> -                      connector_type_str(connector->connector_type),
> +                      kmstest_connector_status_str(connector->connection),
> +                      kmstest_connector_type_str(connector->connector_type),
>                        connector->mmWidth, connector->mmHeight,
>                        connector->count_modes);
>
> @@ -390,7 +337,7 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
>
>         /* Get text extents for each string */
>         snprintf(name_buf, sizeof name_buf, "%s",
> -                connector_type_str(c->connector->connector_type));
> +                kmstest_connector_type_str(c->connector->connector_type));
>         cairo_set_font_size(cr, 48);
>         cairo_select_font_face(cr, "Helvetica",
>                                CAIRO_FONT_SLANT_NORMAL,
> @@ -399,7 +346,7 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
>
>         snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz on %s encoder",
>                  c->mode.name, c->mode.vrefresh,
> -                encoder_type_str(c->encoder->encoder_type));
> +                kmstest_encoder_type_str(c->encoder->encoder_type));
>         cairo_set_font_size(cr, 36);
>         cairo_text_extents(cr, mode_buf, &mode_extents);
>
> --
> 1.8.1.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [igt PATCH 2/5] lib: add kmstest_cairo_printf_line
  2013-05-31  9:23 ` [igt PATCH 2/5] lib: add kmstest_cairo_printf_line Imre Deak
@ 2013-06-05 17:44   ` Rodrigo Vivi
  2013-06-05 19:01     ` Imre Deak
  0 siblings, 1 reply; 22+ messages in thread
From: Rodrigo Vivi @ 2013-06-05 17:44 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-gfx

This patch is big and doing considerable changes in paint_marker
besides add cairo_printf line... doesn' t it deserves a split?

On Fri, May 31, 2013 at 6:23 AM, Imre Deak <imre.deak@intel.com> wrote:
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  lib/drmtest.c       | 106 ++++++++++++++++++++++++++++------------------------
>  lib/drmtest.h       |  13 +++++++
>  tests/testdisplay.c |  96 ++++++++++++++---------------------------------
>  3 files changed, 99 insertions(+), 116 deletions(-)
>
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index 3c4812f..3ad77a8 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -907,45 +907,55 @@ paint_test_patterns(cairo_t *cr, int width, int height)
>         paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
>  }
>
> -enum corner {
> -       topleft,
> -       topright,
> -       bottomleft,
> -       bottomright,
> -};
> -
> -static void
> -paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)
> +int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
> +                               double yspacing, const char *fmt, ...)
>  {
> +       double x, y, xofs, yofs;
>         cairo_text_extents_t extents;
> -       int xoff, yoff;
> +       char *text;
> +       va_list ap;
> +       int ret;
>
> -       cairo_set_font_size(cr, 18);
> -       cairo_text_extents(cr, str, &extents);
> +       va_start(ap, fmt);
> +       ret = vasprintf(&text, fmt, ap);
> +       assert(ret >= 0);
> +       va_end(ap);
>
> -       switch (text_location) {
> -       case topleft:
> -               xoff = -20;
> -               xoff -= extents.width;
> -               yoff = -20;
> -               break;
> -       case topright:
> -               xoff = 20;
> -               yoff = -20;
> -               break;
> -       case bottomleft:
> -               xoff = -20;
> -               xoff -= extents.width;
> -               yoff = 20;
> -               break;
> -       case bottomright:
> -               xoff = 20;
> -               yoff = 20;
> -               break;
> -       default:
> -               xoff = 0;
> -               yoff = 0;
> -       }
> +       cairo_text_extents(cr, text, &extents);
> +
> +       xofs = yofs = 0;
> +       if (align & align_right)
> +               xofs = -extents.width;
> +       else if (align & align_hcenter)
> +               xofs = -extents.width / 2;
> +
> +       if (align & align_top)
> +               yofs = extents.height;
> +       else if (align & align_vcenter)
> +               yofs = extents.height / 2;
> +
> +       cairo_get_current_point(cr, &x, &y);
> +       if (xofs || yofs)
> +               cairo_rel_move_to(cr, xofs, yofs);
> +
> +       cairo_text_path(cr, text);
> +       cairo_set_source_rgb(cr, 0, 0, 0);
> +       cairo_stroke_preserve(cr);
> +       cairo_set_source_rgb(cr, 1, 1, 1);
> +       cairo_fill(cr);
> +
> +       cairo_move_to(cr, x, y + extents.height + yspacing);
> +
> +       free(text);
> +
> +       return extents.width;
> +}
> +
> +static void
> +paint_marker(cairo_t *cr, int x, int y)
> +{
> +       enum kmstest_text_align align;
> +       int xoff, yoff;
>
>         cairo_move_to(cr, x, y - 20);
>         cairo_line_to(cr, x, y + 20);
> @@ -960,12 +970,15 @@ paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)
>         cairo_set_line_width(cr, 2);
>         cairo_stroke(cr);
>
> +       xoff = x ? -20 : 20;
> +       align = x ? align_right : align_left;
> +
> +       yoff = y ? -20 : 20;
> +       align |= y ? align_bottom : align_top;
> +
>         cairo_move_to(cr, x + xoff, y + yoff);
> -       cairo_text_path(cr, str);
> -       cairo_set_source_rgb(cr, 0, 0, 0);
> -       cairo_stroke_preserve(cr);
> -       cairo_set_source_rgb(cr, 1, 1, 1);
> -       cairo_fill(cr);
> +       cairo_set_font_size(cr, 18);
> +       kmstest_cairo_printf_line(cr, align, 0, "(%d, %d)", x, y);
>  }
>
>  unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
> @@ -977,7 +990,6 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
>         cairo_surface_t *surface;
>         cairo_status_t status;
>         cairo_t *cr;
> -       char buf[128];
>         unsigned int fb_id;
>
>         surface = paint_allocate_surface(fd, width, height, depth, bpp,
> @@ -991,14 +1003,10 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
>         cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
>
>         /* Paint corner markers */
> -       snprintf(buf, sizeof buf, "(%d, %d)", 0, 0);
> -       paint_marker(cr, 0, 0, buf, bottomright);
> -       snprintf(buf, sizeof buf, "(%d, %d)", width, 0);
> -       paint_marker(cr, width, 0, buf, bottomleft);
> -       snprintf(buf, sizeof buf, "(%d, %d)", 0, height);
> -       paint_marker(cr, 0, height, buf, topright);
> -       snprintf(buf, sizeof buf, "(%d, %d)", width, height);
> -       paint_marker(cr, width, height, buf, topleft);
> +       paint_marker(cr, 0, 0);
> +       paint_marker(cr, width, 0);
> +       paint_marker(cr, 0, height);
> +       paint_marker(cr, width, height);
>
>         if (paint_func)
>                 paint_func(cr, width, height, func_arg);
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 38aeb9d..3c1368d 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -109,6 +109,19 @@ struct kmstest_fb {
>         unsigned size;
>  };
>
> +enum kmstest_text_align {
> +       align_left,
> +       align_bottom    = align_left,
> +       align_right     = 0x01,
> +       align_top       = 0x02,
> +       align_vcenter   = 0x04,
> +       align_hcenter   = 0x08,
> +};
> +
> +int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
> +                              double yspacing, const char *fmt, ...)
> +                              __attribute__((format (printf, 4, 5)));
> +
>  typedef void (*kmstest_paint_func)(cairo_t *cr, int width, int height, void *priv);
>
>  unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
> diff --git a/tests/testdisplay.c b/tests/testdisplay.c
> index e7a2555..b10c3b9 100644
> --- a/tests/testdisplay.c
> +++ b/tests/testdisplay.c
> @@ -331,86 +331,48 @@ static void
>  paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
>  {
>         struct connector *c = priv;
> -       cairo_text_extents_t name_extents, mode_extents;
> -       char name_buf[128], mode_buf[128];
> -       int i, x, y, modes_x, modes_y;
> +       double str_width;
> +       double x, y, top_y;
> +       double max_width;
> +       int i;
>
> -       /* Get text extents for each string */
> -       snprintf(name_buf, sizeof name_buf, "%s",
> -                kmstest_connector_type_str(c->connector->connector_type));
> -       cairo_set_font_size(cr, 48);
>         cairo_select_font_face(cr, "Helvetica",
>                                CAIRO_FONT_SLANT_NORMAL,
>                                CAIRO_FONT_WEIGHT_NORMAL);
> -       cairo_text_extents(cr, name_buf, &name_extents);
> -
> -       snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz on %s encoder",
> -                c->mode.name, c->mode.vrefresh,
> -                kmstest_encoder_type_str(c->encoder->encoder_type));
> -       cairo_set_font_size(cr, 36);
> -       cairo_text_extents(cr, mode_buf, &mode_extents);
> +       cairo_move_to(cr, l_width / 2, l_height / 2);
>
> -       /* Paint output name */
> -       x = l_width / 2;
> -       x -= name_extents.width / 2;
> -       y = l_height / 2;
> -       y -= (name_extents.height / 2) - (mode_extents.height / 2) - 10;
> +       /* Print connector and mode name */
>         cairo_set_font_size(cr, 48);
> -       cairo_move_to(cr, x, y);
> -       cairo_text_path(cr, name_buf);
> -       cairo_set_source_rgb(cr, 0, 0, 0);
> -       cairo_stroke_preserve(cr);
> -       cairo_set_source_rgb(cr, 1, 1, 1);
> -       cairo_fill(cr);
> -
> -       /* Paint mode name */
> -       x = l_width / 2;
> -       x -= mode_extents.width / 2;
> -       modes_x = x;
> -       y = l_height / 2;
> -       y += (mode_extents.height / 2) + (name_extents.height / 2) + 10;
> +       kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s",
> +                kmstest_connector_type_str(c->connector->connector_type));
> +
>         cairo_set_font_size(cr, 36);
> -       cairo_move_to(cr, x, y);
> -       cairo_text_path(cr, mode_buf);
> -       cairo_set_source_rgb(cr, 0, 0, 0);
> -       cairo_stroke_preserve(cr);
> -       cairo_set_source_rgb(cr, 1, 1, 1);
> -       cairo_fill(cr);
> +       str_width = kmstest_cairo_printf_line(cr, align_hcenter, 10,
> +               "%s @ %dHz on %s encoder", c->mode.name, c->mode.vrefresh,
> +               kmstest_encoder_type_str(c->encoder->encoder_type));
> +
> +       cairo_rel_move_to(cr, -str_width / 2, 0);
>
>         /* List available modes */
> -       snprintf(mode_buf, sizeof mode_buf, "Available modes:");
>         cairo_set_font_size(cr, 18);
> -       cairo_text_extents(cr, mode_buf, &mode_extents);
> -       x = modes_x;
> -       modes_x = x + mode_extents.width;
> -       y += mode_extents.height + 10;
> -       modes_y = y;
> -       cairo_move_to(cr, x, y);
> -       cairo_text_path(cr, mode_buf);
> -       cairo_set_source_rgb(cr, 0, 0, 0);
> -       cairo_stroke_preserve(cr);
> -       cairo_set_source_rgb(cr, 1, 1, 1);
> -       cairo_fill(cr);
> +       str_width = kmstest_cairo_printf_line(cr, align_left, 10,
> +                                             "Available modes:");
> +       cairo_rel_move_to(cr, str_width, 0);
> +       cairo_get_current_point(cr, &x, &top_y);
>
> +       max_width = 0;
>         for (i = 0; i < c->connector->count_modes; i++) {
> -               snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz",
> -                        c->connector->modes[i].name,
> -                        c->connector->modes[i].vrefresh);
> -               cairo_set_font_size(cr, 18);
> -               cairo_text_extents(cr, mode_buf, &mode_extents);
> -               x = modes_x - mode_extents.width; /* right justify modes */
> -               y += mode_extents.height + 10;
> -               if (y + mode_extents.height >= height) {
> -                       y = modes_y + mode_extents.height + 10;
> -                       modes_x += mode_extents.width + 10;
> -                       x = modes_x - mode_extents.width;
> +               cairo_get_current_point(cr, &x, &y);
> +               if (y >= l_height) {
> +                       x += max_width + 10;
> +                       max_width = 0;
> +                       cairo_move_to(cr, x, top_y);
>                 }
> -               cairo_move_to(cr, x, y);
> -               cairo_text_path(cr, mode_buf);
> -               cairo_set_source_rgb(cr, 0, 0, 0);
> -               cairo_stroke_preserve(cr);
> -               cairo_set_source_rgb(cr, 1, 1, 1);
> -               cairo_fill(cr);
> +               str_width = kmstest_cairo_printf_line(cr, align_right, 10,
> +                       "%s @ %dHz", c->connector->modes[i % 2].name,
> +                        c->connector->modes[i % 2].vrefresh);
> +               if (str_width > max_width)
> +                       max_width = str_width;
>         }
>
>         if (qr_code)
> --
> 1.8.1.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [igt PATCH 3/5] lib: add kmstest_get_connector_config
  2013-05-31  9:23 ` [igt PATCH 3/5] lib: add kmstest_get_connector_config Imre Deak
@ 2013-06-05 18:00   ` Rodrigo Vivi
  0 siblings, 0 replies; 22+ messages in thread
From: Rodrigo Vivi @ 2013-06-05 18:00 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-gfx

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>

On Fri, May 31, 2013 at 6:23 AM, Imre Deak <imre.deak@intel.com> wrote:
> This is used by multiple test cases, so make it shared.
>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  lib/drmtest.c       | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  lib/drmtest.h       |  14 ++++++
>  tests/kms_flip.c    | 115 ++++++++------------------------------------
>  tests/testdisplay.c | 134 +++++++++++++++-------------------------------------
>  4 files changed, 206 insertions(+), 191 deletions(-)
>
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index 3ad77a8..7368077 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -1317,3 +1317,137 @@ int drmtest_set_vt_graphics_mode(void)
>         return orig_vt_mode < 0 ? -1 : 0;
>  }
>
> +static int get_connector_default_mode(int drm_fd, drmModeConnector *connector,
> +                                     drmModeModeInfo *mode)
> +{
> +       drmModeRes *resources;
> +       int i;
> +
> +       resources = drmModeGetResources(drm_fd);
> +       if (!resources) {
> +               perror("drmModeGetResources failed");
> +
> +               return -1;
> +       }
> +
> +       if (!connector->count_modes) {
> +               fprintf(stderr, "no modes for connector %d\n",
> +                       connector->connector_id);
> +               drmModeFreeResources(resources);
> +
> +               return -1;
> +       }
> +
> +       for (i = 0; i < connector->count_modes; i++) {
> +               if (i == 0 ||
> +                   connector->modes[i].type & DRM_MODE_TYPE_PREFERRED) {
> +                       *mode = connector->modes[i];
> +                       if (mode->type & DRM_MODE_TYPE_PREFERRED)
> +                               break;
> +               }
> +       }
> +
> +       drmModeFreeResources(resources);
> +
> +       return 0;
> +}
> +
> +int kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
> +                                unsigned long crtc_idx_mask,
> +                                struct kmstest_connector_config *config)
> +{
> +       drmModeRes *resources;
> +       drmModeConnector *connector;
> +       drmModeEncoder *encoder;
> +       int i, j;
> +
> +       resources = drmModeGetResources(drm_fd);
> +       if (!resources) {
> +               perror("drmModeGetResources failed");
> +               goto err1;
> +       }
> +
> +       /* First, find the connector & mode */
> +       connector = drmModeGetConnector(drm_fd, connector_id);
> +       if (!connector)
> +               goto err2;
> +
> +       if (connector->connection != DRM_MODE_CONNECTED)
> +               goto err3;
> +
> +       if (!connector->count_modes) {
> +               fprintf(stderr, "connector %d has no modes\n", connector_id);
> +               goto err3;
> +       }
> +
> +       if (connector->connector_id != connector_id) {
> +               fprintf(stderr, "connector id doesn't match (%d != %d)\n",
> +                       connector->connector_id, connector_id);
> +               goto err3;
> +       }
> +
> +       /*
> +        * Find given CRTC if crtc_id != 0 or else the first CRTC not in use.
> +        * In both cases find the first compatible encoder and skip the CRTC
> +        * if there is non such.
> +        */
> +       encoder = NULL;         /* suppress GCC warning */
> +       for (i = 0; i < resources->count_crtcs; i++) {
> +               if (!resources->crtcs[i] || !(crtc_idx_mask & (1 << i)))
> +                       continue;
> +
> +               /* Now get a compatible encoder */
> +               for (j = 0; j < connector->count_encoders; j++) {
> +                       encoder = drmModeGetEncoder(drm_fd,
> +                                                   connector->encoders[j]);
> +
> +                       if (!encoder) {
> +                               fprintf(stderr, "could not get encoder %d: %s\n",
> +                                       resources->encoders[j], strerror(errno));
> +
> +                               continue;
> +                       }
> +
> +                       if (encoder->possible_crtcs & (1 << i))
> +                               goto found;
> +
> +                       drmModeFreeEncoder(encoder);
> +               }
> +       }
> +
> +       fprintf(stderr,
> +               "no crtc with a compatible encoder (crtc_idx_mask %08lx)\n",
> +               crtc_idx_mask);
> +       goto err3;
> +
> +found:
> +       if (get_connector_default_mode(drm_fd, connector,
> +                                      &config->default_mode) < 0)
> +               goto err4;
> +
> +       config->connector = connector;
> +       config->encoder = encoder;
> +       config->crtc = drmModeGetCrtc(drm_fd, resources->crtcs[i]);
> +       config->crtc_idx = i;
> +       config->pipe = kmstest_get_pipe_from_crtc_id(drm_fd,
> +                                                    config->crtc->crtc_id);
> +
> +       drmModeFreeResources(resources);
> +
> +       return 0;
> +err4:
> +       drmModeFreeEncoder(encoder);
> +err3:
> +       drmModeFreeConnector(connector);
> +err2:
> +       drmModeFreeResources(resources);
> +err1:
> +       return -1;
> +}
> +
> +void kmstest_free_connector_config(struct kmstest_connector_config *config)
> +{
> +       drmModeFreeCrtc(config->crtc);
> +       drmModeFreeEncoder(config->encoder);
> +       drmModeFreeConnector(config->connector);
> +}
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 3c1368d..89ded11 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -101,6 +101,20 @@ void drmtest_init_aperture_trashers(drm_intel_bufmgr *bufmgr);
>  void drmtest_trash_aperture(void);
>  void drmtest_cleanup_aperture_trashers(void);
>
> +struct kmstest_connector_config {
> +       drmModeCrtc *crtc;
> +       drmModeConnector *connector;
> +       drmModeEncoder *encoder;
> +       drmModeModeInfo default_mode;
> +       int crtc_idx;
> +       int pipe;
> +};
> +
> +int kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
> +                                unsigned long crtc_idx_mask,
> +                                struct kmstest_connector_config *config);
> +void kmstest_free_connector_config(struct kmstest_connector_config *config);
> +
>  /* helpers to create nice-looking framebuffers */
>  struct kmstest_fb {
>         uint32_t fb_id;
> diff --git a/tests/kms_flip.c b/tests/kms_flip.c
> index 735b4dd..c9b3d8a 100644
> --- a/tests/kms_flip.c
> +++ b/tests/kms_flip.c
> @@ -825,97 +825,23 @@ static void update_all_state(struct test_output *o,
>                 update_state(&o->vblank_state);
>  }
>
> -static void connector_find_preferred_mode(struct test_output *o, int crtc_id)
> +static void connector_find_preferred_mode(uint32_t connector_id, int crtc_idx,
> +                                         struct test_output *o)
>  {
> -       drmModeConnector *connector;
> -       drmModeEncoder *encoder = NULL;
> -       int i, j;
> -
> -       /* First, find the connector & mode */
> -       o->mode_valid = 0;
> -       o->crtc = 0;
> -       connector = drmModeGetConnector(drm_fd, o->id);
> -       assert(connector);
> -
> -       if (connector->connection != DRM_MODE_CONNECTED) {
> -               drmModeFreeConnector(connector);
> -               return;
> -       }
> -
> -       if (!connector->count_modes) {
> -               fprintf(stderr, "connector %d has no modes\n", o->id);
> -               drmModeFreeConnector(connector);
> -               return;
> -       }
> -
> -       if (connector->connector_id != o->id) {
> -               fprintf(stderr, "connector id doesn't match (%d != %d)\n",
> -                       connector->connector_id, o->id);
> -               drmModeFreeConnector(connector);
> -               return;
> -       }
> -
> -       for (j = 0; j < connector->count_modes; j++) {
> -               o->mode = connector->modes[j];
> -               if (o->mode.type & DRM_MODE_TYPE_PREFERRED) {
> -                       o->mode_valid = 1;
> -                       break;
> -               }
> -       }
> -
> -       if (!o->mode_valid) {
> -               if (connector->count_modes > 0) {
> -                       /* use the first mode as test mode */
> -                       o->mode = connector->modes[0];
> -                       o->mode_valid = 1;
> -               }
> -               else {
> -                       fprintf(stderr, "failed to find any modes on connector %d\n",
> -                               o->id);
> -                       return;
> -               }
> -       }
> +       struct kmstest_connector_config config;
>
> -       /* Now get the encoder */
> -       for (i = 0; i < connector->count_encoders; i++) {
> -               encoder = drmModeGetEncoder(drm_fd, connector->encoders[i]);
> -
> -               if (!encoder) {
> -                       fprintf(stderr, "could not get encoder %i: %s\n",
> -                               resources->encoders[i], strerror(errno));
> -                       drmModeFreeEncoder(encoder);
> -                       continue;
> -               }
> -
> -               break;
> -       }
> -
> -       o->encoder = encoder;
> -
> -       if (i == resources->count_encoders) {
> -               fprintf(stderr, "failed to find encoder\n");
> -               o->mode_valid = 0;
> -               return;
> -       }
> -
> -       /* Find first CRTC not in use */
> -       for (i = 0; i < resources->count_crtcs; i++) {
> -               if (resources->crtcs[i] != crtc_id)
> -                       continue;
> -               if (resources->crtcs[i] &&
> -                   (o->encoder->possible_crtcs & (1<<i))) {
> -                       o->crtc = resources->crtcs[i];
> -                       break;
> -               }
> -       }
> -
> -       if (!o->crtc) {
> -               fprintf(stderr, "could not find requested crtc %d\n", crtc_id);
> +       if (kmstest_get_connector_config(drm_fd, connector_id, 1 << crtc_idx,
> +                                        &config) < 0) {
>                 o->mode_valid = 0;
>                 return;
>         }
>
> -       o->connector = connector;
> +       o->connector = config.connector;
> +       o->encoder = config.encoder;
> +       o->crtc = config.crtc->crtc_id;
> +       o->pipe = config.pipe;
> +       o->mode = config.default_mode;
> +       o->mode_valid = 1;
>  }
>
>  static void
> @@ -1042,21 +968,21 @@ static unsigned event_loop(struct test_output *o, unsigned duration_sec)
>         return end - start;
>  }
>
> -static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
> +static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)
>  {
>         unsigned ellapsed;
>
>         o->bpp = 32;
>         o->depth = 24;
>
> -       connector_find_preferred_mode(o, crtc);
> +       connector_find_preferred_mode(o->id, crtc_idx, o);
>         if (!o->mode_valid)
>                 return;
>
>         last_connector = o->connector;
>
>         fprintf(stdout, "Beginning %s on crtc %d, connector %d\n",
> -               o->test_name, crtc, o->id);
> +               o->test_name, o->crtc, o->id);
>
>         o->fb_width = o->mode.hdisplay;
>         o->fb_height = o->mode.vdisplay;
> @@ -1116,7 +1042,7 @@ static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
>                 check_final_state(o, &o->vblank_state, ellapsed);
>
>         fprintf(stdout, "\n%s on crtc %d, connector %d: PASSED\n\n",
> -               o->test_name, crtc, o->id);
> +               o->test_name, o->crtc, o->id);
>
>         kmstest_remove_fb(drm_fd, o->fb_ids[2]);
>         kmstest_remove_fb(drm_fd, o->fb_ids[1]);
> @@ -1131,7 +1057,8 @@ static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
>  static int run_test(int duration, int flags, const char *test_name)
>  {
>         struct test_output o;
> -       int c, i;
> +       int c;
> +       int crtc_idx;
>
>         resources = drmModeGetResources(drm_fd);
>         if (!resources) {
> @@ -1142,19 +1069,15 @@ static int run_test(int duration, int flags, const char *test_name)
>
>         /* Find any connected displays */
>         for (c = 0; c < resources->count_connectors; c++) {
> -               for (i = 0; i < resources->count_crtcs; i++) {
> -                       int crtc;
> -
> +               for (crtc_idx = 0; crtc_idx < resources->count_crtcs; crtc_idx++) {
>                         memset(&o, 0, sizeof(o));
>                         o.test_name = test_name;
>                         o.id = resources->connectors[c];
>                         o.flags = flags;
>                         o.flip_state.name = "flip";
>                         o.vblank_state.name = "vblank";
> -                       crtc = resources->crtcs[i];
> -                       o.pipe = kmstest_get_pipe_from_crtc_id(drm_fd, crtc);
>
> -                       run_test_on_crtc(&o, crtc, duration);
> +                       run_test_on_crtc(&o, crtc_idx, duration);
>                 }
>         }
>
> diff --git a/tests/testdisplay.c b/tests/testdisplay.c
> index b10c3b9..4470339 100644
> --- a/tests/testdisplay.c
> +++ b/tests/testdisplay.c
> @@ -102,6 +102,7 @@ struct connector {
>         drmModeEncoder *encoder;
>         drmModeConnector *connector;
>         int crtc;
> +       int crtc_idx;
>         int pipe;
>  };
>
> @@ -185,101 +186,31 @@ static void dump_crtcs_fd(int drmfd)
>         drmModeFreeResources(mode_resources);
>  }
>
> -static void connector_find_preferred_mode(struct connector *c)
> +static void connector_find_preferred_mode(uint32_t connector_id,
> +                                         unsigned long crtc_idx_mask,
> +                                         int mode_num, struct connector *c)
>  {
> -       drmModeConnector *connector;
> -       drmModeEncoder *encoder = NULL;
> -       int i, j;
> -
> -       /* First, find the connector & mode */
> -       c->mode_valid = 0;
> -       connector = drmModeGetConnector(drm_fd, c->id);
> -       if (!connector) {
> -               fprintf(stderr, "could not get connector %d: %s\n",
> -                       c->id, strerror(errno));
> -               drmModeFreeConnector(connector);
> -               return;
> -       }
> -
> -       if (connector->connection != DRM_MODE_CONNECTED) {
> -               drmModeFreeConnector(connector);
> -               return;
> -       }
> -
> -       if (!connector->count_modes) {
> -               fprintf(stderr, "connector %d has no modes\n", c->id);
> -               drmModeFreeConnector(connector);
> -               return;
> -       }
> -
> -       if (connector->connector_id != c->id) {
> -               fprintf(stderr, "connector id doesn't match (%d != %d)\n",
> -                       connector->connector_id, c->id);
> -               drmModeFreeConnector(connector);
> -               return;
> -       }
> -
> -       for (j = 0; j < connector->count_modes; j++) {
> -               c->mode = connector->modes[j];
> -               if (c->mode.type & DRM_MODE_TYPE_PREFERRED) {
> -                       c->mode_valid = 1;
> -                       break;
> -               }
> -       }
> -
> -       if ( specified_mode_num != -1 ){
> -               c->mode = connector->modes[specified_mode_num];
> -               if (c->mode.type & DRM_MODE_TYPE_PREFERRED)
> -                       c->mode_valid = 1;
> -       }
> -
> -       if (!c->mode_valid) {
> -               if (connector->count_modes > 0) {
> -                       /* use the first mode as test mode */
> -                       c->mode = connector->modes[0];
> -                       c->mode_valid = 1;
> -               }
> -               else {
> -                       fprintf(stderr, "failed to find any modes on connector %d\n",
> -                               c->id);
> -                       return;
> -               }
> -       }
> -
> -       /* Now get the encoder */
> -       for (i = 0; i < connector->count_encoders; i++) {
> -               encoder = drmModeGetEncoder(drm_fd, connector->encoders[i]);
> -
> -               if (!encoder) {
> -                       fprintf(stderr, "could not get encoder %i: %s\n",
> -                               resources->encoders[i], strerror(errno));
> -                       drmModeFreeEncoder(encoder);
> -                       continue;
> -               }
> -
> -               break;
> -       }
> -
> -       c->encoder = encoder;
> +       struct kmstest_connector_config config;
>
> -       if (i == resources->count_encoders) {
> -               fprintf(stderr, "failed to find encoder\n");
> +       if (kmstest_get_connector_config(drm_fd, connector_id, crtc_idx_mask,
> +                                        &config) < 0) {
>                 c->mode_valid = 0;
>                 return;
>         }
>
> -       /* Find first CRTC not in use */
> -       for (i = 0; i < resources->count_crtcs; i++) {
> -               if (resources->crtcs[i] && (c->encoder->possible_crtcs & (1<<i)))
> -                       break;
> +       c->connector = config.connector;
> +       c->encoder = config.encoder;
> +       c->crtc = config.crtc->crtc_id;
> +       c->crtc_idx = config.crtc_idx;
> +       c->pipe = config.pipe;
> +
> +       if (mode_num != -1) {
> +               assert(mode_num < config.connector->count_modes);
> +               c->mode = config.connector->modes[mode_num];
> +       } else {
> +               c->mode = config.default_mode;
>         }
> -       c->crtc = resources->crtcs[i];
> -       c->pipe = i;
> -
> -       if(test_preferred_mode || force_mode || specified_mode_num != -1)
> -               resources->crtcs[i] = 0;
> -
> -       c->connector = connector;
> +       c->mode_valid = 1;
>  }
>
>  static void
> @@ -409,10 +340,6 @@ set_mode(struct connector *c)
>         else if (depth > 16 && depth <= 32)
>                 bpp = 32;
>
> -       connector_find_preferred_mode(c);
> -       if (!c->mode_valid)
> -               return;
> -
>         test_mode_num = 1;
>         if (force_mode){
>                 memcpy( &c->mode, &force_timing, sizeof(force_timing));
> @@ -506,13 +433,30 @@ int update_display(void)
>         }
>
>         if (test_preferred_mode || test_all_modes || force_mode || specified_disp_id != -1) {
> +               unsigned long crtc_idx_mask = -1UL;
> +
>                 /* Find any connected displays */
>                 for (c = 0; c < resources->count_connectors; c++) {
> -                       connectors[c].id = resources->connectors[c];
> -                       if ( specified_disp_id != -1 && connectors[c].id != specified_disp_id )
> +                       struct connector *connector = &connectors[c];
> +
> +                       connector->id = resources->connectors[c];
> +                       if (specified_disp_id != -1 &&
> +                           connector->id != specified_disp_id)
> +                               continue;
> +
> +                       connector_find_preferred_mode(connector->id,
> +                                                     crtc_idx_mask,
> +                                                     specified_mode_num,
> +                                                     connector);
> +                       if (!connector->mode_valid)
>                                 continue;
>
> -                       set_mode(&connectors[c]);
> +                       set_mode(connector);
> +
> +                       if (test_preferred_mode || force_mode ||
> +                           specified_mode_num != -1)
> +                               crtc_idx_mask &= ~(1 << connector->crtc_idx);
> +
>                 }
>         }
>         drmModeFreeResources(resources);
> --
> 1.8.1.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [igt PATCH 4/5] lib: refactor kmstest_create_fb
  2013-05-31  9:23 ` [igt PATCH 4/5] lib: refactor kmstest_create_fb Imre Deak
@ 2013-06-05 18:21   ` Rodrigo Vivi
  0 siblings, 0 replies; 22+ messages in thread
From: Rodrigo Vivi @ 2013-06-05 18:21 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-gfx

what a huge patch... but hopefully I haven' t missed anything.
Feel free to use Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>

On Fri, May 31, 2013 at 6:23 AM, Imre Deak <imre.deak@intel.com> wrote:
> Factor out parts that will be used by an upcoming patch adding
> kmstest_create_fb2.
>
> Also call the fb paint functions directly, there is not much
> point in passing a function pointer for that.
>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  lib/drmtest.c       | 176 ++++++++++++++++++++++++++++++++--------------------
>  lib/drmtest.h       |  15 +++--
>  tests/kms_flip.c    |  30 +++++----
>  tests/testdisplay.c |  15 +++--
>  4 files changed, 147 insertions(+), 89 deletions(-)
>
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index 7368077..a551e7c 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -39,6 +39,7 @@
>  #include <getopt.h>
>  #include <stdlib.h>
>  #include <linux/kd.h>
> +#include <drm/drm_fourcc.h>
>
>  #include "drmtest.h"
>  #include "i915_drm.h"
> @@ -788,16 +789,14 @@ void drmtest_cleanup_aperture_trashers(void)
>  }
>
>  /* helpers to create nice-looking framebuffers */
> -static cairo_surface_t *
> -paint_allocate_surface(int fd, int width, int height, int depth, int bpp,
> -                      bool tiled,
> -                      struct kmstest_fb *fb_info)
> +static int create_bo_for_fb(int fd, int width, int height, int bpp,
> +                           bool tiled, uint32_t *gem_handle_ret,
> +                           unsigned *size_ret, unsigned *stride_ret)
>  {
> -       cairo_format_t format;
>         struct drm_i915_gem_set_tiling set_tiling;
> +       uint32_t gem_handle;
>         int size;
>         unsigned stride;
> -       uint32_t *fb_ptr;
>
>         if (tiled) {
>                 int v;
> @@ -823,49 +822,24 @@ paint_allocate_surface(int fd, int width, int height, int depth, int bpp,
>                 size = stride * height;
>         }
>
> -       switch (depth) {
> -       case 16:
> -               format = CAIRO_FORMAT_RGB16_565;
> -               break;
> -       case 24:
> -               format = CAIRO_FORMAT_RGB24;
> -               break;
> -#if 0
> -       case 30:
> -               format = CAIRO_FORMAT_RGB30;
> -               break;
> -#endif
> -       case 32:
> -               format = CAIRO_FORMAT_ARGB32;
> -               break;
> -       default:
> -               fprintf(stderr, "bad depth %d\n", depth);
> -               return NULL;
> -       }
> -
> -       assert (bpp >= depth);
> -
> -       fb_info->gem_handle = gem_create(fd, size);
> +       gem_handle = gem_create(fd, size);
>
>         if (tiled) {
> -               set_tiling.handle = fb_info->gem_handle;
> +               set_tiling.handle = gem_handle;
>                 set_tiling.tiling_mode = I915_TILING_X;
>                 set_tiling.stride = stride;
>                 if (ioctl(fd, DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling)) {
>                         fprintf(stderr, "set tiling failed: %s (stride=%d, size=%d)\n",
>                                 strerror(errno), stride, size);
> -                       return NULL;
> +                       return -1;
>                 }
>         }
>
> -       fb_ptr = gem_mmap(fd, fb_info->gem_handle, size, PROT_READ | PROT_WRITE);
> -
> -       fb_info->stride = stride;
> -       fb_info->size = size;
> +       *stride_ret = stride;
> +       *size_ret = size;
> +       *gem_handle_ret = gem_handle;
>
> -       return cairo_image_surface_create_for_data((unsigned char *)fb_ptr,
> -                                                  format, width, height,
> -                                                  stride);
> +       return 0;
>  }
>
>  static void
> @@ -981,23 +955,8 @@ paint_marker(cairo_t *cr, int x, int y)
>         kmstest_cairo_printf_line(cr, align, 0, "(%d, %d)", x, y);
>  }
>
> -unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
> -                              int depth, bool tiled,
> -                              struct kmstest_fb *fb_info,
> -                              kmstest_paint_func paint_func,
> -                              void *func_arg)
> +void kmstest_paint_test_pattern(cairo_t *cr, int width, int height)
>  {
> -       cairo_surface_t *surface;
> -       cairo_status_t status;
> -       cairo_t *cr;
> -       unsigned int fb_id;
> -
> -       surface = paint_allocate_surface(fd, width, height, depth, bpp,
> -                                        tiled, fb_info);
> -       assert(surface);
> -
> -       cr = cairo_create(surface);
> -
>         paint_test_patterns(cr, width, height);
>
>         cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
> @@ -1008,27 +967,112 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
>         paint_marker(cr, 0, height);
>         paint_marker(cr, width, height);
>
> -       if (paint_func)
> -               paint_func(cr, width, height, func_arg);
> +       assert(!cairo_status(cr));
> +}
> +
> +#define DF(did, cid, _bpp, _depth)     \
> +       { DRM_FORMAT_##did, CAIRO_FORMAT_##cid, # did, _bpp, _depth }
> +static struct format_desc_struct {
> +       uint32_t drm_id;
> +       cairo_format_t cairo_id;
> +       const char *name;
> +       int bpp;
> +       int depth;
> +} format_desc[] = {
> +       DF(RGB565,      RGB16_565,      16, 16),
> +       DF(RGB888,      INVALID,        24, 24),
> +       DF(XRGB8888,    RGB24,          32, 24),
> +       DF(XRGB2101010, RGB30,          32, 30),
> +       DF(ARGB8888,    ARGB32,         32, 32),
> +};
> +#undef DF
> +
> +#define for_each_format(f)     \
> +       for (f = format_desc; f - format_desc < ARRAY_SIZE(format_desc); f++)
> +
> +static uint32_t bpp_depth_to_drm_format(int bpp, int depth)
> +{
> +       struct format_desc_struct *f;
> +
> +       for_each_format(f)
> +               if (f->bpp == bpp && f->depth == depth)
> +                       return f->drm_id;
> +
> +       abort();
> +}
> +
> +/* Return fb_id on success, 0 on error */
> +unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
> +                              int depth, bool tiled, struct kmstest_fb *fb)
> +{
> +       memset(fb, 0, sizeof(*fb));
>
> -       status = cairo_status(cr);
> -       assert(!status);
> -       cairo_destroy(cr);
> +       if (create_bo_for_fb(fd, width, height, bpp, tiled, &fb->gem_handle,
> +                              &fb->size, &fb->stride) < 0)
> +               return 0;
> +
> +       if (drmModeAddFB(fd, width, height, depth, bpp, fb->stride,
> +                              fb->gem_handle, &fb->fb_id) < 0) {
> +               gem_close(fd, fb->gem_handle);
> +
> +               return 0;
> +       }
> +
> +       fb->width = width;
> +       fb->height = height;
> +       fb->drm_format = bpp_depth_to_drm_format(bpp, depth);
> +
> +       return fb->fb_id;
> +}
> +
> +static cairo_format_t drm_format_to_cairo(uint32_t drm_format)
> +{
> +       struct format_desc_struct *f;
>
> -       do_or_die(drmModeAddFB(fd, width, height, depth, bpp,
> -                              fb_info->stride,
> -                              fb_info->gem_handle, &fb_id));
> +       for_each_format(f)
> +               if (f->drm_id == drm_format)
> +                       return f->cairo_id;
>
> +       abort();
> +}
> +
> +static cairo_t *create_cairo_ctx(int fd, struct kmstest_fb *fb)
> +{
> +       cairo_t *cr;
> +       cairo_surface_t *surface;
> +       cairo_format_t cformat;
> +       void *fb_ptr;
> +
> +       cformat = drm_format_to_cairo(fb->drm_format);
> +       fb_ptr = gem_mmap(fd, fb->gem_handle, fb->size, PROT_READ | PROT_WRITE);
> +       surface = cairo_image_surface_create_for_data((unsigned char *)fb_ptr,
> +                                                  cformat, fb->width,
> +                                                  fb->height, fb->stride);
> +       assert(surface);
> +       cr = cairo_create(surface);
>         cairo_surface_destroy(surface);
>
> -       fb_info->fb_id = fb_id;
> +       return cr;
> +}
> +
> +cairo_t *kmstest_get_cairo_ctx(int fd, struct kmstest_fb *fb)
> +{
> +
> +       if (!fb->cairo_ctx)
> +               fb->cairo_ctx = create_cairo_ctx(fd, fb);
> +
> +       gem_set_domain(fd, fb->gem_handle, I915_GEM_DOMAIN_CPU,
> +                      I915_GEM_DOMAIN_CPU);
>
> -       return fb_id;
> +       return fb->cairo_ctx;
>  }
>
> -void kmstest_remove_fb(int fd, int fb_id)
> +void kmstest_remove_fb(int fd, struct kmstest_fb *fb)
>  {
> -       do_or_die(drmModeRmFB(fd, fb_id));
> +       if (fb->cairo_ctx)
> +               cairo_destroy(fb->cairo_ctx);
> +       do_or_die(drmModeRmFB(fd, fb->fb_id));
> +       gem_close(fd, fb->gem_handle);
>  }
>
>  struct type_name {
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 89ded11..218914f 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -119,8 +119,13 @@ void kmstest_free_connector_config(struct kmstest_connector_config *config);
>  struct kmstest_fb {
>         uint32_t fb_id;
>         uint32_t gem_handle;
> +       uint32_t drm_format;
> +       int width;
> +       int height;
> +       int depth;
>         unsigned stride;
>         unsigned size;
> +       cairo_t *cairo_ctx;
>  };
>
>  enum kmstest_text_align {
> @@ -136,14 +141,12 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
>                                double yspacing, const char *fmt, ...)
>                                __attribute__((format (printf, 4, 5)));
>
> -typedef void (*kmstest_paint_func)(cairo_t *cr, int width, int height, void *priv);
> -
>  unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
>                                int depth, bool tiled,
> -                              struct kmstest_fb *fb_info,
> -                              kmstest_paint_func paint_func,
> -                              void *func_arg);
> -void kmstest_remove_fb(int fd, int fb_id);
> +                              struct kmstest_fb *fb_info);
> +void kmstest_remove_fb(int fd, struct kmstest_fb *fb_info);
> +cairo_t *kmstest_get_cairo_ctx(int fd, struct kmstest_fb *fb);
> +void kmstest_paint_test_pattern(cairo_t *cr, int width, int height);
>  void kmstest_dump_mode(drmModeModeInfo *mode);
>  int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id);
>  const char *kmstest_encoder_type_str(int type);
> diff --git a/tests/kms_flip.c b/tests/kms_flip.c
> index c9b3d8a..aeeaace 100644
> --- a/tests/kms_flip.c
> +++ b/tests/kms_flip.c
> @@ -844,10 +844,13 @@ static void connector_find_preferred_mode(uint32_t connector_id, int crtc_idx,
>         o->mode_valid = 1;
>  }
>
> -static void
> -paint_flip_mode(cairo_t *cr, int width, int height, void *priv)
> +static void paint_flip_mode(struct kmstest_fb *fb, bool odd_frame)
>  {
> -       bool odd_frame = (bool) priv;
> +       cairo_t *cr = kmstest_get_cairo_ctx(drm_fd, fb);
> +       int width = fb->width;
> +       int height = fb->height;
> +
> +       kmstest_paint_test_pattern(cr, width, height);
>
>         if (odd_frame)
>                 cairo_rectangle(cr, width/4, height/2, width/4, height/8);
> @@ -856,6 +859,8 @@ paint_flip_mode(cairo_t *cr, int width, int height, void *priv)
>
>         cairo_set_source_rgb(cr, 1, 1, 1);
>         cairo_fill(cr);
> +
> +       assert(!cairo_status(cr));
>  }
>
>  static int
> @@ -991,20 +996,21 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)
>                 o->fb_width *= 2;
>
>         o->fb_ids[0] = kmstest_create_fb(drm_fd, o->fb_width, o->fb_height,
> -                                        o->bpp, o->depth, false, &o->fb_info[0],
> -                                        paint_flip_mode, (void *)false);
> +                                        o->bpp, o->depth, false, &o->fb_info[0]);
>         o->fb_ids[1] = kmstest_create_fb(drm_fd, o->fb_width, o->fb_height,
> -                                        o->bpp, o->depth, false, &o->fb_info[1],
> -                                        paint_flip_mode, (void *)true);
> +                                        o->bpp, o->depth, false, &o->fb_info[1]);
>         o->fb_ids[2] = kmstest_create_fb(drm_fd, o->fb_width, o->fb_height,
> -                                        o->bpp, o->depth, true, &o->fb_info[2],
> -                                        paint_flip_mode, (void *)true);
> +                                        o->bpp, o->depth, true, &o->fb_info[2]);
>
>         if (!o->fb_ids[0] || !o->fb_ids[1] || !o->fb_ids[2]) {
>                 fprintf(stderr, "failed to create fbs\n");
>                 exit(3);
>         }
>
> +       paint_flip_mode(&o->fb_info[0], false);
> +       paint_flip_mode(&o->fb_info[1], true);
> +       paint_flip_mode(&o->fb_info[2], true);
> +
>         set_y_tiling(o, 2);
>
>         kmstest_dump_mode(&o->mode);
> @@ -1044,9 +1050,9 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)
>         fprintf(stdout, "\n%s on crtc %d, connector %d: PASSED\n\n",
>                 o->test_name, o->crtc, o->id);
>
> -       kmstest_remove_fb(drm_fd, o->fb_ids[2]);
> -       kmstest_remove_fb(drm_fd, o->fb_ids[1]);
> -       kmstest_remove_fb(drm_fd, o->fb_ids[0]);
> +       kmstest_remove_fb(drm_fd, &o->fb_info[2]);
> +       kmstest_remove_fb(drm_fd, &o->fb_info[1]);
> +       kmstest_remove_fb(drm_fd, &o->fb_info[0]);
>
>         last_connector = NULL;
>
> diff --git a/tests/testdisplay.c b/tests/testdisplay.c
> index 4470339..5ece921 100644
> --- a/tests/testdisplay.c
> +++ b/tests/testdisplay.c
> @@ -258,15 +258,18 @@ static void paint_image(cairo_t *cr, const char *file)
>         cairo_surface_destroy(image);
>  }
>
> -static void
> -paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
> +static void paint_output_info(struct connector *c, struct kmstest_fb *fb)
>  {
> -       struct connector *c = priv;
> +       cairo_t *cr = kmstest_get_cairo_ctx(drm_fd, fb);
> +       int l_width = fb->width;
> +       int l_height = fb->height;
>         double str_width;
>         double x, y, top_y;
>         double max_width;
>         int i;
>
> +       kmstest_paint_test_pattern(cr, l_width, l_height);
> +
>         cairo_select_font_face(cr, "Helvetica",
>                                CAIRO_FONT_SLANT_NORMAL,
>                                CAIRO_FONT_WEIGHT_NORMAL);
> @@ -308,6 +311,8 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
>
>         if (qr_code)
>                 paint_image(cr, "./pass.png");
> +
> +       assert(!cairo_status(cr));
>  }
>
>  static void sighandler(int signo)
> @@ -362,8 +367,8 @@ set_mode(struct connector *c)
>                 height = c->mode.vdisplay;
>
>                 fb_id = kmstest_create_fb(drm_fd, width, height, bpp, depth,
> -                                         enable_tiling, &fb_info,
> -                                         paint_output_info, c);
> +                                         enable_tiling, &fb_info);
> +               paint_output_info(c, &fb_info);
>
>                 fb_ptr = gem_mmap(drm_fd, fb_info.gem_handle,
>                                   fb_info.size, PROT_READ | PROT_WRITE);
> --
> 1.8.1.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [igt PATCH 5/5] tests: add kms_render
  2013-05-31  9:23 ` [igt PATCH 5/5] tests: add kms_render Imre Deak
@ 2013-06-05 18:28   ` Rodrigo Vivi
  2013-06-06 10:19     ` Imre Deak
  2013-06-05 19:25   ` [PATCH v2 0/6] tests: add tests for front buffer rendering Imre Deak
  1 sibling, 1 reply; 22+ messages in thread
From: Rodrigo Vivi @ 2013-06-05 18:28 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-gfx

nice tests, only now I understood why Daniel "randomly" volunteered me
to review this series ;)
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>

On Fri, May 31, 2013 at 6:23 AM, Imre Deak <imre.deak@intel.com> wrote:
> Add a test going through all connectors/crtcs/modes/formats painting to
> a front FB with CPU or painting to a back FB with CPU and blitting it
> to the front FB.
>
> Only formats understood by cairo are supported for now.
>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  lib/drmtest.c      | 101 ++++++++++++++++++++--
>  lib/drmtest.h      |   7 ++
>  tests/.gitignore   |   1 +
>  tests/Makefile.am  |   1 +
>  tests/kms_render.c | 245 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 349 insertions(+), 6 deletions(-)
>  create mode 100644 tests/kms_render.c
>
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index a551e7c..d9d58e5 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -842,8 +842,8 @@ static int create_bo_for_fb(int fd, int width, int height, int bpp,
>         return 0;
>  }
>
> -static void
> -paint_color_gradient(cairo_t *cr, int x, int y, int w, int h,
> +void
> +kmstest_paint_color_gradient(cairo_t *cr, int x, int y, int w, int h,
>                      int r, int g, int b)
>  {
>         cairo_pattern_t *pat;
> @@ -869,16 +869,16 @@ paint_test_patterns(cairo_t *cr, int width, int height)
>         gr_height = height * 0.08;
>         x = (width / 2) - (gr_width / 2);
>
> -       paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 0, 0);
> +       kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 0, 0);
>
>         y += gr_height;
> -       paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 1, 0);
> +       kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 1, 0);
>
>         y += gr_height;
> -       paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 0, 1);
> +       kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 0, 1);
>
>         y += gr_height;
> -       paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
> +       kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
>  }
>
>  int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
> @@ -1025,6 +1025,55 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
>         return fb->fb_id;
>  }
>
> +static uint32_t drm_format_to_bpp(uint32_t drm_format)
> +{
> +       struct format_desc_struct *f;
> +
> +       for_each_format(f)
> +               if (f->drm_id == drm_format)
> +                       return f->bpp;
> +
> +       abort();
> +}
> +
> +unsigned int kmstest_create_fb2(int fd, int width, int height, uint32_t format,
> +                               bool tiled, struct kmstest_fb *fb)
> +{
> +       uint32_t handles[4];
> +       uint32_t pitches[4];
> +       uint32_t offsets[4];
> +       uint32_t fb_id;
> +       int bpp;
> +       int ret;
> +
> +       memset(fb, 0, sizeof(*fb));
> +
> +       bpp = drm_format_to_bpp(format);
> +       ret = create_bo_for_fb(fd, width, height, bpp, tiled, &fb->gem_handle,
> +                             &fb->size, &fb->stride);
> +       if (ret < 0)
> +               return ret;
> +
> +       memset(handles, 0, sizeof(handles));
> +       handles[0] = fb->gem_handle;
> +       memset(pitches, 0, sizeof(pitches));
> +       pitches[0] = fb->stride;
> +       memset(offsets, 0, sizeof(offsets));
> +       if (drmModeAddFB2(fd, width, height, format, handles, pitches,
> +                         offsets, &fb_id, 0) < 0) {
> +               gem_close(fd, fb->gem_handle);
> +
> +               return 0;
> +       }
> +
> +       fb->width = width;
> +       fb->height = height;
> +       fb->drm_format = format;
> +       fb->fb_id = fb_id;
> +
> +       return fb_id;
> +}
> +
>  static cairo_format_t drm_format_to_cairo(uint32_t drm_format)
>  {
>         struct format_desc_struct *f;
> @@ -1075,6 +1124,46 @@ void kmstest_remove_fb(int fd, struct kmstest_fb *fb)
>         gem_close(fd, fb->gem_handle);
>  }
>
> +const char *kmstest_format_str(uint32_t drm_format)
> +{
> +       struct format_desc_struct *f;
> +
> +       for_each_format(f)
> +               if (f->drm_id == drm_format)
> +                       return f->name;
> +
> +       return "invalid";
> +}
> +
> +const char *kmstest_pipe_str(int pipe)
> +{
> +       const char *str[] = { "A", "B", "C" };
> +
> +       if (pipe > 2)
> +               return "invalid";
> +
> +       return str[pipe];
> +}
> +
> +void kmstest_get_all_formats(const uint32_t **formats, int *format_count)
> +{
> +       static uint32_t *drm_formats;
> +
> +       if (!drm_formats) {
> +               struct format_desc_struct *f;
> +               uint32_t *format;
> +
> +               drm_formats = calloc(ARRAY_SIZE(format_desc),
> +                                    sizeof(*drm_formats));
> +               format = &drm_formats[0];
> +               for_each_format(f)
> +                       *format++ = f->drm_id;
> +       }
> +
> +       *formats = drm_formats;
> +       *format_count = ARRAY_SIZE(format_desc);
> +}
> +
>  struct type_name {
>         int type;
>         const char *name;
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 218914f..e3a9275 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -144,11 +144,18 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
>  unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
>                                int depth, bool tiled,
>                                struct kmstest_fb *fb_info);
> +unsigned int kmstest_create_fb2(int fd, int width, int height, uint32_t format,
> +                               bool tiled, struct kmstest_fb *fb);
>  void kmstest_remove_fb(int fd, struct kmstest_fb *fb_info);
>  cairo_t *kmstest_get_cairo_ctx(int fd, struct kmstest_fb *fb);
> +void kmstest_paint_color_gradient(cairo_t *cr, int x, int y, int w, int h,
> +                                 int r, int g, int b);
>  void kmstest_paint_test_pattern(cairo_t *cr, int width, int height);
>  void kmstest_dump_mode(drmModeModeInfo *mode);
>  int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id);
> +const char *kmstest_format_str(uint32_t drm_format);
> +const char *kmstest_pipe_str(int pipe);
> +void kmstest_get_all_formats(const uint32_t **formats, int *format_count);
>  const char *kmstest_encoder_type_str(int type);
>  const char *kmstest_connector_status_str(int type);
>  const char *kmstest_connector_type_str(int type);
> diff --git a/tests/.gitignore b/tests/.gitignore
> index 3cac813..1f7c691 100644
> --- a/tests/.gitignore
> +++ b/tests/.gitignore
> @@ -85,6 +85,7 @@ getclient
>  getstats
>  getversion
>  kms_flip
> +kms_render
>  prime_nv_api
>  prime_nv_pcopy
>  prime_nv_test
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 7250968..3f301c9 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -33,6 +33,7 @@ TESTS_progs_M = \
>         gem_tiled_partial_pwrite_pread \
>         $(NOUVEAU_TESTS_M) \
>         kms_flip \
> +       kms_render \
>         prime_self_import \
>         $(NULL)
>
> diff --git a/tests/kms_render.c b/tests/kms_render.c
> new file mode 100644
> index 0000000..707ce27
> --- /dev/null
> +++ b/tests/kms_render.c
> @@ -0,0 +1,245 @@
> +/*
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + * Authors:
> + *    Imre Deak <imre.deak@intel.com>
> + */
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include <assert.h>
> +#include <cairo.h>
> +#include <errno.h>
> +#include <stdint.h>
> +#include <unistd.h>
> +#include <sys/time.h>
> +
> +#include "drmtest.h"
> +#include "testdisplay.h"
> +#include "intel_bufmgr.h"
> +#include "intel_batchbuffer.h"
> +#include "intel_gpu_tools.h"
> +
> +drmModeRes *resources;
> +int drm_fd;
> +static drm_intel_bufmgr *bufmgr;
> +struct intel_batchbuffer *batch;
> +uint32_t devid;
> +
> +enum test_flags {
> +       TEST_DIRECT_RENDER      = 0x01,
> +       TEST_GPU_BLIT           = 0x02,
> +};
> +
> +static int paint_fb(struct kmstest_fb *fb, const char *test_name,
> +                   const char *mode_format_str, const char *cconf_str)
> +{
> +       cairo_t *cr;
> +
> +       cr = kmstest_get_cairo_ctx(drm_fd, fb);
> +       if (!cr)
> +               return -1;
> +
> +       kmstest_paint_color_gradient(cr, 0, 0, fb->width, fb->height, 1, 1, 1);
> +       kmstest_paint_test_pattern(cr, fb->width, fb->height);
> +
> +       cairo_select_font_face(cr, "Helvetica", CAIRO_FONT_SLANT_NORMAL,
> +                              CAIRO_FONT_WEIGHT_NORMAL);
> +       cairo_move_to(cr, fb->width / 2, fb->height / 2);
> +       cairo_set_font_size(cr, 36);
> +       kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s", test_name);
> +       kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s", mode_format_str);
> +       kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s", cconf_str);
> +
> +       return 0;
> +}
> +
> +static void gpu_blit(struct kmstest_fb *dst_fb, struct kmstest_fb *src_fb)
> +{
> +       drm_intel_bo *dst_bo;
> +       drm_intel_bo *src_bo;
> +
> +       dst_bo = gem_handle_to_libdrm_bo(bufmgr, drm_fd, "destination",
> +                                        dst_fb->gem_handle);
> +       assert(dst_bo);
> +       src_bo = gem_handle_to_libdrm_bo(bufmgr, drm_fd, "source",
> +                                        src_fb->gem_handle);
> +       assert(src_bo);
> +
> +       intel_copy_bo(batch, dst_bo, src_bo, src_fb->width, src_fb->height);
> +       intel_batchbuffer_flush(batch);
> +       gem_quiescent_gpu(drm_fd);
> +
> +       drm_intel_bo_unreference(src_bo);
> +       drm_intel_bo_unreference(dst_bo);
> +}
> +
> +static int test_format(const char *test_name,
> +                      struct kmstest_connector_config *cconf,
> +                      drmModeModeInfo *mode, uint32_t format,
> +                      enum test_flags flags)
> +{
> +       int width;
> +       int height;
> +       struct kmstest_fb fb[2];
> +       char *mode_format_str;
> +       char *cconf_str;
> +       int ret;
> +
> +       ret = asprintf(&mode_format_str, "%s @ %dHz / %s",
> +                mode->name, mode->vrefresh, kmstest_format_str(format));
> +       assert(ret > 0);
> +       ret = asprintf(&cconf_str, "pipe %s, encoder %s, connector %s",
> +                      kmstest_pipe_str(cconf->pipe),
> +                      kmstest_encoder_type_str(cconf->encoder->encoder_type),
> +                      kmstest_connector_type_str(cconf->connector->connector_type));
> +       assert(ret > 0);
> +
> +       printf("Beginning test %s with %s on %s\n",
> +               test_name, mode_format_str, cconf_str);
> +
> +       width = mode->hdisplay;
> +       height = mode->vdisplay;
> +
> +       if (!kmstest_create_fb2(drm_fd, width, height, format, false, &fb[0]))
> +               goto err1;
> +
> +       if (!kmstest_create_fb2(drm_fd, width, height, format, false, &fb[1]))
> +               goto err2;
> +
> +       do_or_die(drmModeSetCrtc(drm_fd, cconf->crtc->crtc_id, fb[0].fb_id,
> +                                0, 0, &cconf->connector->connector_id, 1,
> +                                mode));
> +       do_or_die(drmModePageFlip(drm_fd, cconf->crtc->crtc_id, fb[0].fb_id,
> +                                 0, NULL));
> +       sleep(2);
> +
> +       if (flags & TEST_DIRECT_RENDER) {
> +               paint_fb(&fb[0], test_name, mode_format_str, cconf_str);
> +       } else if (flags & TEST_GPU_BLIT) {
> +               paint_fb(&fb[1], test_name, mode_format_str, cconf_str);
> +               gpu_blit(&fb[0], &fb[1]);
> +       }
> +       sleep(5);
> +
> +       printf("Test %s with %s on %s: PASSED\n",
> +               test_name, mode_format_str, cconf_str);
> +       free(mode_format_str);
> +       free(cconf_str);
> +
> +       kmstest_remove_fb(drm_fd, &fb[1]);
> +       kmstest_remove_fb(drm_fd, &fb[0]);
> +
> +       return 0;
> +
> +err2:
> +       kmstest_remove_fb(drm_fd, &fb[0]);
> +err1:
> +       fprintf(stderr, "skip testing unsupported format %s\n",
> +               kmstest_format_str(format));
> +
> +       return -1;
> +}
> +
> +static void test_connector(const char *test_name,
> +                          struct kmstest_connector_config *cconf,
> +                          enum test_flags flags)
> +{
> +       const uint32_t *formats;
> +       int format_count;
> +       int i;
> +
> +       kmstest_get_all_formats(&formats, &format_count);
> +       for (i = 0; i < cconf->connector->count_modes; i++) {
> +               int j;
> +
> +               for (j = 0; j < format_count; j++)
> +                       test_format(test_name,
> +                                   cconf, &cconf->connector->modes[i],
> +                                   formats[j], flags);
> +       }
> +}
> +
> +static int run_test(const char *test_name, enum test_flags flags)
> +{
> +       int i;
> +
> +       resources = drmModeGetResources(drm_fd);
> +       assert(resources);
> +
> +       /* Find any connected displays */
> +       for (i = 0; i < resources->count_connectors; i++) {
> +               uint32_t connector_id;
> +               int j;
> +
> +               connector_id = resources->connectors[i];
> +               for (j = 0; j < resources->count_crtcs; j++) {
> +                       struct kmstest_connector_config cconf;
> +                       int ret;
> +
> +                       ret = kmstest_get_connector_config(drm_fd, connector_id,
> +                                                          1 << j, &cconf);
> +                       if (ret < 0)
> +                               continue;
> +
> +                       test_connector(test_name, &cconf, flags);
> +
> +                       kmstest_free_connector_config(&cconf);
> +               }
> +       }
> +
> +       drmModeFreeResources(resources);
> +
> +       return 1;
> +}
> +
> +int main(int argc, char **argv)
> +{
> +       struct {
> +               enum test_flags flags;
> +               const char *name;
> +       } tests[] = {
> +               { TEST_DIRECT_RENDER,   "direct-render" },
> +               { TEST_GPU_BLIT,        "gpu-blit" },
> +       };
> +       int i;
> +
> +       drmtest_subtest_init(argc, argv);
> +
> +       if (!drmtest_only_list_subtests()) {
> +               drm_fd = drm_open_any();
> +
> +               bufmgr = drm_intel_bufmgr_gem_init(drm_fd, 4096);
> +               devid = intel_get_drm_devid(drm_fd);
> +               batch = intel_batchbuffer_alloc(bufmgr, devid);
> +
> +               do_or_die(drmtest_set_vt_graphics_mode());
> +       }
> +
> +       for (i = 0; i < ARRAY_SIZE(tests); i++) {
> +               if (drmtest_run_subtest(tests[i].name))
> +                       run_test(tests[i].name, tests[i].flags);
> +       }
> +
> +       if (!drmtest_only_list_subtests())
> +               close(drm_fd);
> +
> +       return 0;
> +}
> --
> 1.8.1.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [igt PATCH 2/5] lib: add kmstest_cairo_printf_line
  2013-06-05 17:44   ` Rodrigo Vivi
@ 2013-06-05 19:01     ` Imre Deak
  0 siblings, 0 replies; 22+ messages in thread
From: Imre Deak @ 2013-06-05 19:01 UTC (permalink / raw)
  To: Rodrigo Vivi; +Cc: intel-gfx

On Wed, 2013-06-05 at 14:44 -0300, Rodrigo Vivi wrote:
> This patch is big and doing considerable changes in paint_marker
> besides add cairo_printf line... doesn' t it deserves a split?

Ok, will resend this with the paint_marker changes in a separate patch.

--Imre

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH v2 0/6] tests: add tests for front buffer rendering
  2013-05-31  9:23 ` [igt PATCH 5/5] tests: add kms_render Imre Deak
  2013-06-05 18:28   ` Rodrigo Vivi
@ 2013-06-05 19:25   ` Imre Deak
  2013-06-05 19:25     ` [PATCH v2 1/6] lib: move connector_type_str and co to drmtest Imre Deak
                       ` (5 more replies)
  1 sibling, 6 replies; 22+ messages in thread
From: Imre Deak @ 2013-06-05 19:25 UTC (permalink / raw)
  To: intel-gfx

v2:
- split changes to paint_marker() to a separate patch (Rodrigo)

Imre Deak (6):
  lib: move connector_type_str and co to drmtest
  lib: add kmstest_cairo_printf_line
  lib: use kmstest_cairo_printf_line in paint_marker
  lib: add kmstest_get_connector_config
  lib: refactor kmstest_create_fb
  tests: add kms_render

 demos/intel_sprite_on.c |  58 +----
 lib/drmtest.c           | 575 +++++++++++++++++++++++++++++++++++++-----------
 lib/drmtest.h           |  50 ++++-
 tests/.gitignore        |   1 +
 tests/Makefile.am       |   1 +
 tests/kms_flip.c        | 145 ++++--------
 tests/kms_render.c      | 245 +++++++++++++++++++++
 tests/testdisplay.c     | 304 +++++++------------------
 8 files changed, 866 insertions(+), 513 deletions(-)
 create mode 100644 tests/kms_render.c

-- 
1.8.1.2

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH v2 1/6] lib: move connector_type_str and co to drmtest
  2013-06-05 19:25   ` [PATCH v2 0/6] tests: add tests for front buffer rendering Imre Deak
@ 2013-06-05 19:25     ` Imre Deak
  2013-06-05 19:25     ` [PATCH v2 2/6] lib: add kmstest_cairo_printf_line Imre Deak
                       ` (4 subsequent siblings)
  5 siblings, 0 replies; 22+ messages in thread
From: Imre Deak @ 2013-06-05 19:25 UTC (permalink / raw)
  To: intel-gfx

These are used by multiple test cases, so make them shared.

Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
---
 demos/intel_sprite_on.c | 58 ++++------------------------------------------
 lib/drmtest.c           | 54 +++++++++++++++++++++++++++++++++++++++++++
 lib/drmtest.h           |  3 +++
 tests/testdisplay.c     | 61 ++++---------------------------------------------
 4 files changed, 65 insertions(+), 111 deletions(-)

diff --git a/demos/intel_sprite_on.c b/demos/intel_sprite_on.c
index 62bd98e..783f9af 100644
--- a/demos/intel_sprite_on.c
+++ b/demos/intel_sprite_on.c
@@ -53,56 +53,6 @@
 
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
 
-struct type_name {
-	int                 type;
-	const char          *name;
-};
-
-#define type_name_fn(res) \
-	static const char * res##_str(int type) {		\
-		unsigned int i;					\
-		for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \
-			if (res##_names[i].type == type)	\
-			return res##_names[i].name;		\
-		}						\
-		return "(invalid)";				\
-	}
-
-struct type_name encoder_type_names[] = {
-	{ DRM_MODE_ENCODER_NONE, "none" },
-	{ DRM_MODE_ENCODER_DAC, "DAC" },
-	{ DRM_MODE_ENCODER_TMDS, "TMDS" },
-	{ DRM_MODE_ENCODER_LVDS, "LVDS" },
-	{ DRM_MODE_ENCODER_TVDAC, "TVDAC" },
-};
-type_name_fn(encoder_type)
-
-struct type_name connector_status_names[] = {
-	{ DRM_MODE_CONNECTED, "connected" },
-	{ DRM_MODE_DISCONNECTED, "disconnected" },
-	{ DRM_MODE_UNKNOWNCONNECTION, "unknown" },
-};
-type_name_fn(connector_status)
-
-struct type_name connector_type_names[] = {
-	{ DRM_MODE_CONNECTOR_Unknown, "unknown" },
-	{ DRM_MODE_CONNECTOR_VGA, "VGA" },
-	{ DRM_MODE_CONNECTOR_DVII, "DVI-I" },
-	{ DRM_MODE_CONNECTOR_DVID, "DVI-D" },
-	{ DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
-	{ DRM_MODE_CONNECTOR_Composite, "composite" },
-	{ DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
-	{ DRM_MODE_CONNECTOR_LVDS, "LVDS" },
-	{ DRM_MODE_CONNECTOR_Component, "component" },
-	{ DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" },
-	{ DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort" },
-	{ DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
-	{ DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
-	{ DRM_MODE_CONNECTOR_TV, "TV" },
-	{ DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort" },
-};
-type_name_fn(connector_type)
-
 /*
  * Mode setting with the kernel interfaces is a bit of a chore.
  * First you have to find the connector in question and make sure the
@@ -157,8 +107,8 @@ static void dump_connectors(int gfx_fd, drmModeRes *resources)
 		printf("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n",
 			connector->connector_id,
 			connector->encoder_id,
-			connector_status_str(connector->connection),
-			connector_type_str(connector->connector_type),
+			kmstest_connector_status_str(connector->connection),
+			kmstest_connector_type_str(connector->connector_type),
 			connector->mmWidth, connector->mmHeight,
 			connector->count_modes);
 
@@ -744,14 +694,14 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
 				curr_connector.mode.flags,
 				curr_connector.encoder->encoder_id,
 				curr_connector.encoder->encoder_type,
-				encoder_type_str(curr_connector.encoder->encoder_type),
+				kmstest_encoder_type_str(curr_connector.encoder->encoder_type),
 				curr_connector.encoder->crtc_id,
 				curr_connector.encoder->possible_crtcs,
 				curr_connector.encoder->possible_clones,
 				curr_connector.connector->connector_id,
 				curr_connector.connector->encoder_id,
 				curr_connector.connector->connector_type,
-				connector_type_str(curr_connector.connector->connector_type),
+				kmstest_connector_type_str(curr_connector.connector->connector_type),
 				curr_connector.connector->connector_type_id);
 
 			printf("Sprite surface dimensions = %dx%d\n"
diff --git a/lib/drmtest.c b/lib/drmtest.c
index d17dbb0..3c4812f 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -1023,6 +1023,60 @@ void kmstest_remove_fb(int fd, int fb_id)
 	do_or_die(drmModeRmFB(fd, fb_id));
 }
 
+struct type_name {
+	int type;
+	const char *name;
+};
+
+#define type_name_fn(res) \
+const char * kmstest_##res##_str(int type) {		\
+	unsigned int i;					\
+	for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \
+		if (res##_names[i].type == type)	\
+			return res##_names[i].name;	\
+	}						\
+	return "(invalid)";				\
+}
+
+struct type_name encoder_type_names[] = {
+	{ DRM_MODE_ENCODER_NONE, "none" },
+	{ DRM_MODE_ENCODER_DAC, "DAC" },
+	{ DRM_MODE_ENCODER_TMDS, "TMDS" },
+	{ DRM_MODE_ENCODER_LVDS, "LVDS" },
+	{ DRM_MODE_ENCODER_TVDAC, "TVDAC" },
+};
+
+type_name_fn(encoder_type)
+
+struct type_name connector_status_names[] = {
+	{ DRM_MODE_CONNECTED, "connected" },
+	{ DRM_MODE_DISCONNECTED, "disconnected" },
+	{ DRM_MODE_UNKNOWNCONNECTION, "unknown" },
+};
+
+type_name_fn(connector_status)
+
+struct type_name connector_type_names[] = {
+	{ DRM_MODE_CONNECTOR_Unknown, "unknown" },
+	{ DRM_MODE_CONNECTOR_VGA, "VGA" },
+	{ DRM_MODE_CONNECTOR_DVII, "DVI-I" },
+	{ DRM_MODE_CONNECTOR_DVID, "DVI-D" },
+	{ DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
+	{ DRM_MODE_CONNECTOR_Composite, "composite" },
+	{ DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
+	{ DRM_MODE_CONNECTOR_LVDS, "LVDS" },
+	{ DRM_MODE_CONNECTOR_Component, "component" },
+	{ DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" },
+	{ DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort" },
+	{ DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
+	{ DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
+	{ DRM_MODE_CONNECTOR_TV, "TV" },
+	{ DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort" },
+};
+
+type_name_fn(connector_type)
+
+
 void kmstest_dump_mode(drmModeModeInfo *mode)
 {
 	printf("  %s %d %d %d %d %d %d %d %d %d 0x%x 0x%x %d\n",
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 7202ad5..38aeb9d 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -119,6 +119,9 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 void kmstest_remove_fb(int fd, int fb_id);
 void kmstest_dump_mode(drmModeModeInfo *mode);
 int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id);
+const char *kmstest_encoder_type_str(int type);
+const char *kmstest_connector_status_str(int type);
+const char *kmstest_connector_type_str(int type);
 
 inline static void _do_or_die(const char *function, int line, int ret)
 {
diff --git a/tests/testdisplay.c b/tests/testdisplay.c
index 80cd112..e7a2555 100644
--- a/tests/testdisplay.c
+++ b/tests/testdisplay.c
@@ -88,59 +88,6 @@ uint32_t *fb_ptr;
 
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
 
-struct type_name {
-	int type;
-	const char *name;
-};
-
-#define type_name_fn(res) \
-static const char * res##_str(int type) {			\
-	unsigned int i;					\
-	for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \
-		if (res##_names[i].type == type)	\
-			return res##_names[i].name;	\
-	}						\
-	return "(invalid)";				\
-}
-
-struct type_name encoder_type_names[] = {
-	{ DRM_MODE_ENCODER_NONE, "none" },
-	{ DRM_MODE_ENCODER_DAC, "DAC" },
-	{ DRM_MODE_ENCODER_TMDS, "TMDS" },
-	{ DRM_MODE_ENCODER_LVDS, "LVDS" },
-	{ DRM_MODE_ENCODER_TVDAC, "TVDAC" },
-};
-
-type_name_fn(encoder_type)
-
-struct type_name connector_status_names[] = {
-	{ DRM_MODE_CONNECTED, "connected" },
-	{ DRM_MODE_DISCONNECTED, "disconnected" },
-	{ DRM_MODE_UNKNOWNCONNECTION, "unknown" },
-};
-
-type_name_fn(connector_status)
-
-struct type_name connector_type_names[] = {
-	{ DRM_MODE_CONNECTOR_Unknown, "unknown" },
-	{ DRM_MODE_CONNECTOR_VGA, "VGA" },
-	{ DRM_MODE_CONNECTOR_DVII, "DVI-I" },
-	{ DRM_MODE_CONNECTOR_DVID, "DVI-D" },
-	{ DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
-	{ DRM_MODE_CONNECTOR_Composite, "composite" },
-	{ DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
-	{ DRM_MODE_CONNECTOR_LVDS, "LVDS" },
-	{ DRM_MODE_CONNECTOR_Component, "component" },
-	{ DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" },
-	{ DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort" },
-	{ DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
-	{ DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
-	{ DRM_MODE_CONNECTOR_TV, "TV" },
-	{ DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort" },
-};
-
-type_name_fn(connector_type)
-
 /*
  * Mode setting with the kernel interfaces is a bit of a chore.
  * First you have to find the connector in question and make sure the
@@ -185,8 +132,8 @@ static void dump_connectors_fd(int drmfd)
 		printf("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n",
 		       connector->connector_id,
 		       connector->encoder_id,
-		       connector_status_str(connector->connection),
-		       connector_type_str(connector->connector_type),
+		       kmstest_connector_status_str(connector->connection),
+		       kmstest_connector_type_str(connector->connector_type),
 		       connector->mmWidth, connector->mmHeight,
 		       connector->count_modes);
 
@@ -390,7 +337,7 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
 
 	/* Get text extents for each string */
 	snprintf(name_buf, sizeof name_buf, "%s",
-		 connector_type_str(c->connector->connector_type));
+		 kmstest_connector_type_str(c->connector->connector_type));
 	cairo_set_font_size(cr, 48);
 	cairo_select_font_face(cr, "Helvetica",
 			       CAIRO_FONT_SLANT_NORMAL,
@@ -399,7 +346,7 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
 
 	snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz on %s encoder",
 		 c->mode.name, c->mode.vrefresh,
-		 encoder_type_str(c->encoder->encoder_type));
+		 kmstest_encoder_type_str(c->encoder->encoder_type));
 	cairo_set_font_size(cr, 36);
 	cairo_text_extents(cr, mode_buf, &mode_extents);
 
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v2 2/6] lib: add kmstest_cairo_printf_line
  2013-06-05 19:25   ` [PATCH v2 0/6] tests: add tests for front buffer rendering Imre Deak
  2013-06-05 19:25     ` [PATCH v2 1/6] lib: move connector_type_str and co to drmtest Imre Deak
@ 2013-06-05 19:25     ` Imre Deak
  2013-06-05 19:27       ` Rodrigo Vivi
  2013-06-05 20:04       ` [PATCH v3 " Imre Deak
  2013-06-05 19:25     ` [PATCH v2 3/6] lib: use kmstest_cairo_printf_line in paint_marker Imre Deak
                       ` (3 subsequent siblings)
  5 siblings, 2 replies; 22+ messages in thread
From: Imre Deak @ 2013-06-05 19:25 UTC (permalink / raw)
  To: intel-gfx

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 lib/drmtest.c       | 44 ++++++++++++++++++++++++
 lib/drmtest.h       | 13 ++++++++
 tests/testdisplay.c | 96 ++++++++++++++++-------------------------------------
 3 files changed, 86 insertions(+), 67 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 3c4812f..71dd06b 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -907,6 +907,50 @@ paint_test_patterns(cairo_t *cr, int width, int height)
 	paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
 }
 
+int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
+				double yspacing, const char *fmt, ...)
+{
+	double x, y, xofs, yofs;
+	cairo_text_extents_t extents;
+	char *text;
+	va_list ap;
+	int ret;
+
+	va_start(ap, fmt);
+	ret = vasprintf(&text, fmt, ap);
+	assert(ret >= 0);
+	va_end(ap);
+
+	cairo_text_extents(cr, text, &extents);
+
+	xofs = yofs = 0;
+	if (align & align_right)
+		xofs = -extents.width;
+	else if (align & align_hcenter)
+		xofs = -extents.width / 2;
+
+	if (align & align_top)
+		yofs = extents.height;
+	else if (align & align_vcenter)
+		yofs = extents.height / 2;
+
+	cairo_get_current_point(cr, &x, &y);
+	if (xofs || yofs)
+		cairo_rel_move_to(cr, xofs, yofs);
+
+	cairo_text_path(cr, text);
+	cairo_set_source_rgb(cr, 0, 0, 0);
+	cairo_stroke_preserve(cr);
+	cairo_set_source_rgb(cr, 1, 1, 1);
+	cairo_fill(cr);
+
+	cairo_move_to(cr, x, y + extents.height + yspacing);
+
+	free(text);
+
+	return extents.width;
+}
+
 enum corner {
 	topleft,
 	topright,
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 38aeb9d..3c1368d 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -109,6 +109,19 @@ struct kmstest_fb {
 	unsigned size;
 };
 
+enum kmstest_text_align {
+	align_left,
+	align_bottom	= align_left,
+	align_right	= 0x01,
+	align_top	= 0x02,
+	align_vcenter	= 0x04,
+	align_hcenter	= 0x08,
+};
+
+int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
+			       double yspacing, const char *fmt, ...)
+			       __attribute__((format (printf, 4, 5)));
+
 typedef void (*kmstest_paint_func)(cairo_t *cr, int width, int height, void *priv);
 
 unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
diff --git a/tests/testdisplay.c b/tests/testdisplay.c
index e7a2555..b10c3b9 100644
--- a/tests/testdisplay.c
+++ b/tests/testdisplay.c
@@ -331,86 +331,48 @@ static void
 paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
 {
 	struct connector *c = priv;
-	cairo_text_extents_t name_extents, mode_extents;
-	char name_buf[128], mode_buf[128];
-	int i, x, y, modes_x, modes_y;
+	double str_width;
+	double x, y, top_y;
+	double max_width;
+	int i;
 
-	/* Get text extents for each string */
-	snprintf(name_buf, sizeof name_buf, "%s",
-		 kmstest_connector_type_str(c->connector->connector_type));
-	cairo_set_font_size(cr, 48);
 	cairo_select_font_face(cr, "Helvetica",
 			       CAIRO_FONT_SLANT_NORMAL,
 			       CAIRO_FONT_WEIGHT_NORMAL);
-	cairo_text_extents(cr, name_buf, &name_extents);
-
-	snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz on %s encoder",
-		 c->mode.name, c->mode.vrefresh,
-		 kmstest_encoder_type_str(c->encoder->encoder_type));
-	cairo_set_font_size(cr, 36);
-	cairo_text_extents(cr, mode_buf, &mode_extents);
+	cairo_move_to(cr, l_width / 2, l_height / 2);
 
-	/* Paint output name */
-	x = l_width / 2;
-	x -= name_extents.width / 2;
-	y = l_height / 2;
-	y -= (name_extents.height / 2) - (mode_extents.height / 2) - 10;
+	/* Print connector and mode name */
 	cairo_set_font_size(cr, 48);
-	cairo_move_to(cr, x, y);
-	cairo_text_path(cr, name_buf);
-	cairo_set_source_rgb(cr, 0, 0, 0);
-	cairo_stroke_preserve(cr);
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	cairo_fill(cr);
-
-	/* Paint mode name */
-	x = l_width / 2;
-	x -= mode_extents.width / 2;
-	modes_x = x;
-	y = l_height / 2;
-	y += (mode_extents.height / 2) + (name_extents.height / 2) + 10;
+	kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s",
+		 kmstest_connector_type_str(c->connector->connector_type));
+
 	cairo_set_font_size(cr, 36);
-	cairo_move_to(cr, x, y);
-	cairo_text_path(cr, mode_buf);
-	cairo_set_source_rgb(cr, 0, 0, 0);
-	cairo_stroke_preserve(cr);
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	cairo_fill(cr);
+	str_width = kmstest_cairo_printf_line(cr, align_hcenter, 10,
+		"%s @ %dHz on %s encoder", c->mode.name, c->mode.vrefresh,
+		kmstest_encoder_type_str(c->encoder->encoder_type));
+
+	cairo_rel_move_to(cr, -str_width / 2, 0);
 
 	/* List available modes */
-	snprintf(mode_buf, sizeof mode_buf, "Available modes:");
 	cairo_set_font_size(cr, 18);
-	cairo_text_extents(cr, mode_buf, &mode_extents);
-	x = modes_x;
-	modes_x = x + mode_extents.width;
-	y += mode_extents.height + 10;
-	modes_y = y;
-	cairo_move_to(cr, x, y);
-	cairo_text_path(cr, mode_buf);
-	cairo_set_source_rgb(cr, 0, 0, 0);
-	cairo_stroke_preserve(cr);
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	cairo_fill(cr);
+	str_width = kmstest_cairo_printf_line(cr, align_left, 10,
+					      "Available modes:");
+	cairo_rel_move_to(cr, str_width, 0);
+	cairo_get_current_point(cr, &x, &top_y);
 
+	max_width = 0;
 	for (i = 0; i < c->connector->count_modes; i++) {
-		snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz",
-			 c->connector->modes[i].name,
-			 c->connector->modes[i].vrefresh);
-		cairo_set_font_size(cr, 18);
-		cairo_text_extents(cr, mode_buf, &mode_extents);
-		x = modes_x - mode_extents.width; /* right justify modes */
-		y += mode_extents.height + 10;
-		if (y + mode_extents.height >= height) {
-			y = modes_y + mode_extents.height + 10;
-			modes_x += mode_extents.width + 10;
-			x = modes_x - mode_extents.width;
+		cairo_get_current_point(cr, &x, &y);
+		if (y >= l_height) {
+			x += max_width + 10;
+			max_width = 0;
+			cairo_move_to(cr, x, top_y);
 		}
-		cairo_move_to(cr, x, y);
-		cairo_text_path(cr, mode_buf);
-		cairo_set_source_rgb(cr, 0, 0, 0);
-		cairo_stroke_preserve(cr);
-		cairo_set_source_rgb(cr, 1, 1, 1);
-		cairo_fill(cr);
+		str_width = kmstest_cairo_printf_line(cr, align_right, 10,
+			"%s @ %dHz", c->connector->modes[i % 2].name,
+			 c->connector->modes[i % 2].vrefresh);
+		if (str_width > max_width)
+			max_width = str_width;
 	}
 
 	if (qr_code)
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v2 3/6] lib: use kmstest_cairo_printf_line in paint_marker
  2013-06-05 19:25   ` [PATCH v2 0/6] tests: add tests for front buffer rendering Imre Deak
  2013-06-05 19:25     ` [PATCH v2 1/6] lib: move connector_type_str and co to drmtest Imre Deak
  2013-06-05 19:25     ` [PATCH v2 2/6] lib: add kmstest_cairo_printf_line Imre Deak
@ 2013-06-05 19:25     ` Imre Deak
  2013-06-05 19:29       ` Rodrigo Vivi
  2013-06-05 19:25     ` [PATCH v2 4/6] lib: add kmstest_get_connector_config Imre Deak
                       ` (2 subsequent siblings)
  5 siblings, 1 reply; 22+ messages in thread
From: Imre Deak @ 2013-06-05 19:25 UTC (permalink / raw)
  To: intel-gfx

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 lib/drmtest.c | 64 +++++++++++++----------------------------------------------
 1 file changed, 14 insertions(+), 50 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 71dd06b..3ad77a8 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -951,46 +951,12 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
 	return extents.width;
 }
 
-enum corner {
-	topleft,
-	topright,
-	bottomleft,
-	bottomright,
-};
-
 static void
-paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)
+paint_marker(cairo_t *cr, int x, int y)
 {
-	cairo_text_extents_t extents;
+	enum kmstest_text_align align;
 	int xoff, yoff;
 
-	cairo_set_font_size(cr, 18);
-	cairo_text_extents(cr, str, &extents);
-
-	switch (text_location) {
-	case topleft:
-		xoff = -20;
-		xoff -= extents.width;
-		yoff = -20;
-		break;
-	case topright:
-		xoff = 20;
-		yoff = -20;
-		break;
-	case bottomleft:
-		xoff = -20;
-		xoff -= extents.width;
-		yoff = 20;
-		break;
-	case bottomright:
-		xoff = 20;
-		yoff = 20;
-		break;
-	default:
-		xoff = 0;
-		yoff = 0;
-	}
-
 	cairo_move_to(cr, x, y - 20);
 	cairo_line_to(cr, x, y + 20);
 	cairo_move_to(cr, x - 20, y);
@@ -1004,12 +970,15 @@ paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)
 	cairo_set_line_width(cr, 2);
 	cairo_stroke(cr);
 
+	xoff = x ? -20 : 20;
+	align = x ? align_right : align_left;
+
+	yoff = y ? -20 : 20;
+	align |= y ? align_bottom : align_top;
+
 	cairo_move_to(cr, x + xoff, y + yoff);
-	cairo_text_path(cr, str);
-	cairo_set_source_rgb(cr, 0, 0, 0);
-	cairo_stroke_preserve(cr);
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	cairo_fill(cr);
+	cairo_set_font_size(cr, 18);
+	kmstest_cairo_printf_line(cr, align, 0, "(%d, %d)", x, y);
 }
 
 unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
@@ -1021,7 +990,6 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 	cairo_surface_t *surface;
 	cairo_status_t status;
 	cairo_t *cr;
-	char buf[128];
 	unsigned int fb_id;
 
 	surface = paint_allocate_surface(fd, width, height, depth, bpp,
@@ -1035,14 +1003,10 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 	cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
 
 	/* Paint corner markers */
-	snprintf(buf, sizeof buf, "(%d, %d)", 0, 0);
-	paint_marker(cr, 0, 0, buf, bottomright);
-	snprintf(buf, sizeof buf, "(%d, %d)", width, 0);
-	paint_marker(cr, width, 0, buf, bottomleft);
-	snprintf(buf, sizeof buf, "(%d, %d)", 0, height);
-	paint_marker(cr, 0, height, buf, topright);
-	snprintf(buf, sizeof buf, "(%d, %d)", width, height);
-	paint_marker(cr, width, height, buf, topleft);
+	paint_marker(cr, 0, 0);
+	paint_marker(cr, width, 0);
+	paint_marker(cr, 0, height);
+	paint_marker(cr, width, height);
 
 	if (paint_func)
 		paint_func(cr, width, height, func_arg);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v2 4/6] lib: add kmstest_get_connector_config
  2013-06-05 19:25   ` [PATCH v2 0/6] tests: add tests for front buffer rendering Imre Deak
                       ` (2 preceding siblings ...)
  2013-06-05 19:25     ` [PATCH v2 3/6] lib: use kmstest_cairo_printf_line in paint_marker Imre Deak
@ 2013-06-05 19:25     ` Imre Deak
  2013-06-05 19:25     ` [PATCH v2 5/6] lib: refactor kmstest_create_fb Imre Deak
  2013-06-05 19:25     ` [PATCH v2 6/6] tests: add kms_render Imre Deak
  5 siblings, 0 replies; 22+ messages in thread
From: Imre Deak @ 2013-06-05 19:25 UTC (permalink / raw)
  To: intel-gfx

This is used by multiple test cases, so make it shared.

Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
---
 lib/drmtest.c       | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/drmtest.h       |  14 ++++++
 tests/kms_flip.c    | 115 ++++++++------------------------------------
 tests/testdisplay.c | 134 +++++++++++++++-------------------------------------
 4 files changed, 206 insertions(+), 191 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 3ad77a8..7368077 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -1317,3 +1317,137 @@ int drmtest_set_vt_graphics_mode(void)
 	return orig_vt_mode < 0 ? -1 : 0;
 }
 
+static int get_connector_default_mode(int drm_fd, drmModeConnector *connector,
+				      drmModeModeInfo *mode)
+{
+	drmModeRes *resources;
+	int i;
+
+	resources = drmModeGetResources(drm_fd);
+	if (!resources) {
+		perror("drmModeGetResources failed");
+
+		return -1;
+	}
+
+	if (!connector->count_modes) {
+		fprintf(stderr, "no modes for connector %d\n",
+			connector->connector_id);
+		drmModeFreeResources(resources);
+
+		return -1;
+	}
+
+	for (i = 0; i < connector->count_modes; i++) {
+		if (i == 0 ||
+		    connector->modes[i].type & DRM_MODE_TYPE_PREFERRED) {
+			*mode = connector->modes[i];
+			if (mode->type & DRM_MODE_TYPE_PREFERRED)
+				break;
+		}
+	}
+
+	drmModeFreeResources(resources);
+
+	return 0;
+}
+
+int kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
+				 unsigned long crtc_idx_mask,
+				 struct kmstest_connector_config *config)
+{
+	drmModeRes *resources;
+	drmModeConnector *connector;
+	drmModeEncoder *encoder;
+	int i, j;
+
+	resources = drmModeGetResources(drm_fd);
+	if (!resources) {
+		perror("drmModeGetResources failed");
+		goto err1;
+	}
+
+	/* First, find the connector & mode */
+	connector = drmModeGetConnector(drm_fd, connector_id);
+	if (!connector)
+		goto err2;
+
+	if (connector->connection != DRM_MODE_CONNECTED)
+		goto err3;
+
+	if (!connector->count_modes) {
+		fprintf(stderr, "connector %d has no modes\n", connector_id);
+		goto err3;
+	}
+
+	if (connector->connector_id != connector_id) {
+		fprintf(stderr, "connector id doesn't match (%d != %d)\n",
+			connector->connector_id, connector_id);
+		goto err3;
+	}
+
+	/*
+	 * Find given CRTC if crtc_id != 0 or else the first CRTC not in use.
+	 * In both cases find the first compatible encoder and skip the CRTC
+	 * if there is non such.
+	 */
+	encoder = NULL;		/* suppress GCC warning */
+	for (i = 0; i < resources->count_crtcs; i++) {
+		if (!resources->crtcs[i] || !(crtc_idx_mask & (1 << i)))
+			continue;
+
+		/* Now get a compatible encoder */
+		for (j = 0; j < connector->count_encoders; j++) {
+			encoder = drmModeGetEncoder(drm_fd,
+						    connector->encoders[j]);
+
+			if (!encoder) {
+				fprintf(stderr, "could not get encoder %d: %s\n",
+					resources->encoders[j], strerror(errno));
+
+				continue;
+			}
+
+			if (encoder->possible_crtcs & (1 << i))
+				goto found;
+
+			drmModeFreeEncoder(encoder);
+		}
+	}
+
+	fprintf(stderr,
+		"no crtc with a compatible encoder (crtc_idx_mask %08lx)\n",
+		crtc_idx_mask);
+	goto err3;
+
+found:
+	if (get_connector_default_mode(drm_fd, connector,
+				       &config->default_mode) < 0)
+		goto err4;
+
+	config->connector = connector;
+	config->encoder = encoder;
+	config->crtc = drmModeGetCrtc(drm_fd, resources->crtcs[i]);
+	config->crtc_idx = i;
+	config->pipe = kmstest_get_pipe_from_crtc_id(drm_fd,
+						     config->crtc->crtc_id);
+
+	drmModeFreeResources(resources);
+
+	return 0;
+err4:
+	drmModeFreeEncoder(encoder);
+err3:
+	drmModeFreeConnector(connector);
+err2:
+	drmModeFreeResources(resources);
+err1:
+	return -1;
+}
+
+void kmstest_free_connector_config(struct kmstest_connector_config *config)
+{
+	drmModeFreeCrtc(config->crtc);
+	drmModeFreeEncoder(config->encoder);
+	drmModeFreeConnector(config->connector);
+}
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 3c1368d..89ded11 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -101,6 +101,20 @@ void drmtest_init_aperture_trashers(drm_intel_bufmgr *bufmgr);
 void drmtest_trash_aperture(void);
 void drmtest_cleanup_aperture_trashers(void);
 
+struct kmstest_connector_config {
+	drmModeCrtc *crtc;
+	drmModeConnector *connector;
+	drmModeEncoder *encoder;
+	drmModeModeInfo default_mode;
+	int crtc_idx;
+	int pipe;
+};
+
+int kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
+				 unsigned long crtc_idx_mask,
+				 struct kmstest_connector_config *config);
+void kmstest_free_connector_config(struct kmstest_connector_config *config);
+
 /* helpers to create nice-looking framebuffers */
 struct kmstest_fb {
 	uint32_t fb_id;
diff --git a/tests/kms_flip.c b/tests/kms_flip.c
index 735b4dd..c9b3d8a 100644
--- a/tests/kms_flip.c
+++ b/tests/kms_flip.c
@@ -825,97 +825,23 @@ static void update_all_state(struct test_output *o,
 		update_state(&o->vblank_state);
 }
 
-static void connector_find_preferred_mode(struct test_output *o, int crtc_id)
+static void connector_find_preferred_mode(uint32_t connector_id, int crtc_idx,
+					  struct test_output *o)
 {
-	drmModeConnector *connector;
-	drmModeEncoder *encoder = NULL;
-	int i, j;
-
-	/* First, find the connector & mode */
-	o->mode_valid = 0;
-	o->crtc = 0;
-	connector = drmModeGetConnector(drm_fd, o->id);
-	assert(connector);
-
-	if (connector->connection != DRM_MODE_CONNECTED) {
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	if (!connector->count_modes) {
-		fprintf(stderr, "connector %d has no modes\n", o->id);
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	if (connector->connector_id != o->id) {
-		fprintf(stderr, "connector id doesn't match (%d != %d)\n",
-			connector->connector_id, o->id);
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	for (j = 0; j < connector->count_modes; j++) {
-		o->mode = connector->modes[j];
-		if (o->mode.type & DRM_MODE_TYPE_PREFERRED) {
-			o->mode_valid = 1;
-			break;
-		}
-	}
-
-	if (!o->mode_valid) {
-		if (connector->count_modes > 0) {
-			/* use the first mode as test mode */
-			o->mode = connector->modes[0];
-			o->mode_valid = 1;
-		}
-		else {
-			fprintf(stderr, "failed to find any modes on connector %d\n",
-				o->id);
-			return;
-		}
-	}
+	struct kmstest_connector_config config;
 
-	/* Now get the encoder */
-	for (i = 0; i < connector->count_encoders; i++) {
-		encoder = drmModeGetEncoder(drm_fd, connector->encoders[i]);
-
-		if (!encoder) {
-			fprintf(stderr, "could not get encoder %i: %s\n",
-				resources->encoders[i], strerror(errno));
-			drmModeFreeEncoder(encoder);
-			continue;
-		}
-
-		break;
-	}
-
-	o->encoder = encoder;
-
-	if (i == resources->count_encoders) {
-		fprintf(stderr, "failed to find encoder\n");
-		o->mode_valid = 0;
-		return;
-	}
-
-	/* Find first CRTC not in use */
-	for (i = 0; i < resources->count_crtcs; i++) {
-		if (resources->crtcs[i] != crtc_id)
-			continue;
-		if (resources->crtcs[i] &&
-		    (o->encoder->possible_crtcs & (1<<i))) {
-			o->crtc = resources->crtcs[i];
-			break;
-		}
-	}
-
-	if (!o->crtc) {
-		fprintf(stderr, "could not find requested crtc %d\n", crtc_id);
+	if (kmstest_get_connector_config(drm_fd, connector_id, 1 << crtc_idx,
+					 &config) < 0) {
 		o->mode_valid = 0;
 		return;
 	}
 
-	o->connector = connector;
+	o->connector = config.connector;
+	o->encoder = config.encoder;
+	o->crtc = config.crtc->crtc_id;
+	o->pipe = config.pipe;
+	o->mode = config.default_mode;
+	o->mode_valid = 1;
 }
 
 static void
@@ -1042,21 +968,21 @@ static unsigned event_loop(struct test_output *o, unsigned duration_sec)
 	return end - start;
 }
 
-static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
+static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)
 {
 	unsigned ellapsed;
 
 	o->bpp = 32;
 	o->depth = 24;
 
-	connector_find_preferred_mode(o, crtc);
+	connector_find_preferred_mode(o->id, crtc_idx, o);
 	if (!o->mode_valid)
 		return;
 
 	last_connector = o->connector;
 
 	fprintf(stdout, "Beginning %s on crtc %d, connector %d\n",
-		o->test_name, crtc, o->id);
+		o->test_name, o->crtc, o->id);
 
 	o->fb_width = o->mode.hdisplay;
 	o->fb_height = o->mode.vdisplay;
@@ -1116,7 +1042,7 @@ static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
 		check_final_state(o, &o->vblank_state, ellapsed);
 
 	fprintf(stdout, "\n%s on crtc %d, connector %d: PASSED\n\n",
-		o->test_name, crtc, o->id);
+		o->test_name, o->crtc, o->id);
 
 	kmstest_remove_fb(drm_fd, o->fb_ids[2]);
 	kmstest_remove_fb(drm_fd, o->fb_ids[1]);
@@ -1131,7 +1057,8 @@ static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
 static int run_test(int duration, int flags, const char *test_name)
 {
 	struct test_output o;
-	int c, i;
+	int c;
+	int crtc_idx;
 
 	resources = drmModeGetResources(drm_fd);
 	if (!resources) {
@@ -1142,19 +1069,15 @@ static int run_test(int duration, int flags, const char *test_name)
 
 	/* Find any connected displays */
 	for (c = 0; c < resources->count_connectors; c++) {
-		for (i = 0; i < resources->count_crtcs; i++) {
-			int crtc;
-
+		for (crtc_idx = 0; crtc_idx < resources->count_crtcs; crtc_idx++) {
 			memset(&o, 0, sizeof(o));
 			o.test_name = test_name;
 			o.id = resources->connectors[c];
 			o.flags = flags;
 			o.flip_state.name = "flip";
 			o.vblank_state.name = "vblank";
-			crtc = resources->crtcs[i];
-			o.pipe = kmstest_get_pipe_from_crtc_id(drm_fd, crtc);
 
-			run_test_on_crtc(&o, crtc, duration);
+			run_test_on_crtc(&o, crtc_idx, duration);
 		}
 	}
 
diff --git a/tests/testdisplay.c b/tests/testdisplay.c
index b10c3b9..4470339 100644
--- a/tests/testdisplay.c
+++ b/tests/testdisplay.c
@@ -102,6 +102,7 @@ struct connector {
 	drmModeEncoder *encoder;
 	drmModeConnector *connector;
 	int crtc;
+	int crtc_idx;
 	int pipe;
 };
 
@@ -185,101 +186,31 @@ static void dump_crtcs_fd(int drmfd)
 	drmModeFreeResources(mode_resources);
 }
 
-static void connector_find_preferred_mode(struct connector *c)
+static void connector_find_preferred_mode(uint32_t connector_id,
+					  unsigned long crtc_idx_mask,
+					  int mode_num, struct connector *c)
 {
-	drmModeConnector *connector;
-	drmModeEncoder *encoder = NULL;
-	int i, j;
-
-	/* First, find the connector & mode */
-	c->mode_valid = 0;
-	connector = drmModeGetConnector(drm_fd, c->id);
-	if (!connector) {
-		fprintf(stderr, "could not get connector %d: %s\n",
-			c->id, strerror(errno));
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	if (connector->connection != DRM_MODE_CONNECTED) {
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	if (!connector->count_modes) {
-		fprintf(stderr, "connector %d has no modes\n", c->id);
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	if (connector->connector_id != c->id) {
-		fprintf(stderr, "connector id doesn't match (%d != %d)\n",
-			connector->connector_id, c->id);
-		drmModeFreeConnector(connector);
-		return;
-	}
-
-	for (j = 0; j < connector->count_modes; j++) {
-		c->mode = connector->modes[j];
-		if (c->mode.type & DRM_MODE_TYPE_PREFERRED) {
-			c->mode_valid = 1;
-			break;
-		}
-	}
-
-	if ( specified_mode_num != -1 ){
-		c->mode = connector->modes[specified_mode_num];
-		if (c->mode.type & DRM_MODE_TYPE_PREFERRED)
-			c->mode_valid = 1;
-	}
-
-	if (!c->mode_valid) {
-		if (connector->count_modes > 0) {
-			/* use the first mode as test mode */
-			c->mode = connector->modes[0];
-			c->mode_valid = 1;
-		}
-		else {
-			fprintf(stderr, "failed to find any modes on connector %d\n",
-				c->id);
-			return;
-		}
-	}
-
-	/* Now get the encoder */
-	for (i = 0; i < connector->count_encoders; i++) {
-		encoder = drmModeGetEncoder(drm_fd, connector->encoders[i]);
-
-		if (!encoder) {
-			fprintf(stderr, "could not get encoder %i: %s\n",
-				resources->encoders[i], strerror(errno));
-			drmModeFreeEncoder(encoder);
-			continue;
-		}
-
-		break;
-	}
-
-	c->encoder = encoder;
+	struct kmstest_connector_config config;
 
-	if (i == resources->count_encoders) {
-		fprintf(stderr, "failed to find encoder\n");
+	if (kmstest_get_connector_config(drm_fd, connector_id, crtc_idx_mask,
+					 &config) < 0) {
 		c->mode_valid = 0;
 		return;
 	}
 
-	/* Find first CRTC not in use */
-	for (i = 0; i < resources->count_crtcs; i++) {
-		if (resources->crtcs[i] && (c->encoder->possible_crtcs & (1<<i)))
-			break;
+	c->connector = config.connector;
+	c->encoder = config.encoder;
+	c->crtc = config.crtc->crtc_id;
+	c->crtc_idx = config.crtc_idx;
+	c->pipe = config.pipe;
+
+	if (mode_num != -1) {
+		assert(mode_num < config.connector->count_modes);
+		c->mode = config.connector->modes[mode_num];
+	} else {
+		c->mode = config.default_mode;
 	}
-	c->crtc = resources->crtcs[i];
-	c->pipe = i;
-
-	if(test_preferred_mode || force_mode || specified_mode_num != -1)
-		resources->crtcs[i] = 0;
-
-	c->connector = connector;
+	c->mode_valid = 1;
 }
 
 static void
@@ -409,10 +340,6 @@ set_mode(struct connector *c)
 	else if (depth > 16 && depth <= 32)
 		bpp = 32;
 
-	connector_find_preferred_mode(c);
-	if (!c->mode_valid)
-		return;
-
 	test_mode_num = 1;
 	if (force_mode){
 		memcpy( &c->mode, &force_timing, sizeof(force_timing));
@@ -506,13 +433,30 @@ int update_display(void)
 	}
 
 	if (test_preferred_mode || test_all_modes || force_mode || specified_disp_id != -1) {
+		unsigned long crtc_idx_mask = -1UL;
+
 		/* Find any connected displays */
 		for (c = 0; c < resources->count_connectors; c++) {
-			connectors[c].id = resources->connectors[c];
-			if ( specified_disp_id != -1 && connectors[c].id != specified_disp_id )
+			struct connector *connector = &connectors[c];
+
+			connector->id = resources->connectors[c];
+			if (specified_disp_id != -1 &&
+			    connector->id != specified_disp_id)
+				continue;
+
+			connector_find_preferred_mode(connector->id,
+						      crtc_idx_mask,
+						      specified_mode_num,
+						      connector);
+			if (!connector->mode_valid)
 				continue;
 
-			set_mode(&connectors[c]);
+			set_mode(connector);
+
+			if (test_preferred_mode || force_mode ||
+			    specified_mode_num != -1)
+				crtc_idx_mask &= ~(1 << connector->crtc_idx);
+
 		}
 	}
 	drmModeFreeResources(resources);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v2 5/6] lib: refactor kmstest_create_fb
  2013-06-05 19:25   ` [PATCH v2 0/6] tests: add tests for front buffer rendering Imre Deak
                       ` (3 preceding siblings ...)
  2013-06-05 19:25     ` [PATCH v2 4/6] lib: add kmstest_get_connector_config Imre Deak
@ 2013-06-05 19:25     ` Imre Deak
  2013-06-05 19:25     ` [PATCH v2 6/6] tests: add kms_render Imre Deak
  5 siblings, 0 replies; 22+ messages in thread
From: Imre Deak @ 2013-06-05 19:25 UTC (permalink / raw)
  To: intel-gfx

Factor out parts that will be used by an upcoming patch adding
kmstest_create_fb2.

Also call the fb paint functions directly, there is not much
point in passing a function pointer for that.

Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
---
 lib/drmtest.c       | 176 ++++++++++++++++++++++++++++++++--------------------
 lib/drmtest.h       |  15 +++--
 tests/kms_flip.c    |  30 +++++----
 tests/testdisplay.c |  15 +++--
 4 files changed, 147 insertions(+), 89 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 7368077..a551e7c 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -39,6 +39,7 @@
 #include <getopt.h>
 #include <stdlib.h>
 #include <linux/kd.h>
+#include <drm/drm_fourcc.h>
 
 #include "drmtest.h"
 #include "i915_drm.h"
@@ -788,16 +789,14 @@ void drmtest_cleanup_aperture_trashers(void)
 }
 
 /* helpers to create nice-looking framebuffers */
-static cairo_surface_t *
-paint_allocate_surface(int fd, int width, int height, int depth, int bpp,
-		       bool tiled,
-		       struct kmstest_fb *fb_info)
+static int create_bo_for_fb(int fd, int width, int height, int bpp,
+			    bool tiled, uint32_t *gem_handle_ret,
+			    unsigned *size_ret, unsigned *stride_ret)
 {
-	cairo_format_t format;
 	struct drm_i915_gem_set_tiling set_tiling;
+	uint32_t gem_handle;
 	int size;
 	unsigned stride;
-	uint32_t *fb_ptr;
 
 	if (tiled) {
 		int v;
@@ -823,49 +822,24 @@ paint_allocate_surface(int fd, int width, int height, int depth, int bpp,
 		size = stride * height;
 	}
 
-	switch (depth) {
-	case 16:
-		format = CAIRO_FORMAT_RGB16_565;
-		break;
-	case 24:
-		format = CAIRO_FORMAT_RGB24;
-		break;
-#if 0
-	case 30:
-		format = CAIRO_FORMAT_RGB30;
-		break;
-#endif
-	case 32:
-		format = CAIRO_FORMAT_ARGB32;
-		break;
-	default:
-		fprintf(stderr, "bad depth %d\n", depth);
-		return NULL;
-	}
-
-	assert (bpp >= depth);
-
-	fb_info->gem_handle = gem_create(fd, size);
+	gem_handle = gem_create(fd, size);
 
 	if (tiled) {
-		set_tiling.handle = fb_info->gem_handle;
+		set_tiling.handle = gem_handle;
 		set_tiling.tiling_mode = I915_TILING_X;
 		set_tiling.stride = stride;
 		if (ioctl(fd, DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling)) {
 			fprintf(stderr, "set tiling failed: %s (stride=%d, size=%d)\n",
 				strerror(errno), stride, size);
-			return NULL;
+			return -1;
 		}
 	}
 
-	fb_ptr = gem_mmap(fd, fb_info->gem_handle, size, PROT_READ | PROT_WRITE);
-
-	fb_info->stride = stride;
-	fb_info->size = size;
+	*stride_ret = stride;
+	*size_ret = size;
+	*gem_handle_ret = gem_handle;
 
-	return cairo_image_surface_create_for_data((unsigned char *)fb_ptr,
-						   format, width, height,
-						   stride);
+	return 0;
 }
 
 static void
@@ -981,23 +955,8 @@ paint_marker(cairo_t *cr, int x, int y)
 	kmstest_cairo_printf_line(cr, align, 0, "(%d, %d)", x, y);
 }
 
-unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
-			       int depth, bool tiled,
-			       struct kmstest_fb *fb_info,
-			       kmstest_paint_func paint_func,
-			       void *func_arg)
+void kmstest_paint_test_pattern(cairo_t *cr, int width, int height)
 {
-	cairo_surface_t *surface;
-	cairo_status_t status;
-	cairo_t *cr;
-	unsigned int fb_id;
-
-	surface = paint_allocate_surface(fd, width, height, depth, bpp,
-					 tiled, fb_info);
-	assert(surface);
-
-	cr = cairo_create(surface);
-
 	paint_test_patterns(cr, width, height);
 
 	cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
@@ -1008,27 +967,112 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 	paint_marker(cr, 0, height);
 	paint_marker(cr, width, height);
 
-	if (paint_func)
-		paint_func(cr, width, height, func_arg);
+	assert(!cairo_status(cr));
+}
+
+#define DF(did, cid, _bpp, _depth)	\
+	{ DRM_FORMAT_##did, CAIRO_FORMAT_##cid, # did, _bpp, _depth }
+static struct format_desc_struct {
+	uint32_t drm_id;
+	cairo_format_t cairo_id;
+	const char *name;
+	int bpp;
+	int depth;
+} format_desc[] = {
+	DF(RGB565,	RGB16_565,	16, 16),
+	DF(RGB888,	INVALID,	24, 24),
+	DF(XRGB8888,	RGB24,		32, 24),
+	DF(XRGB2101010,	RGB30,		32, 30),
+	DF(ARGB8888,	ARGB32,		32, 32),
+};
+#undef DF
+
+#define for_each_format(f)	\
+	for (f = format_desc; f - format_desc < ARRAY_SIZE(format_desc); f++)
+
+static uint32_t bpp_depth_to_drm_format(int bpp, int depth)
+{
+	struct format_desc_struct *f;
+
+	for_each_format(f)
+		if (f->bpp == bpp && f->depth == depth)
+			return f->drm_id;
+
+	abort();
+}
+
+/* Return fb_id on success, 0 on error */
+unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
+			       int depth, bool tiled, struct kmstest_fb *fb)
+{
+	memset(fb, 0, sizeof(*fb));
 
-	status = cairo_status(cr);
-	assert(!status);
-	cairo_destroy(cr);
+	if (create_bo_for_fb(fd, width, height, bpp, tiled, &fb->gem_handle,
+			       &fb->size, &fb->stride) < 0)
+		return 0;
+
+	if (drmModeAddFB(fd, width, height, depth, bpp, fb->stride,
+			       fb->gem_handle, &fb->fb_id) < 0) {
+		gem_close(fd, fb->gem_handle);
+
+		return 0;
+	}
+
+	fb->width = width;
+	fb->height = height;
+	fb->drm_format = bpp_depth_to_drm_format(bpp, depth);
+
+	return fb->fb_id;
+}
+
+static cairo_format_t drm_format_to_cairo(uint32_t drm_format)
+{
+	struct format_desc_struct *f;
 
-	do_or_die(drmModeAddFB(fd, width, height, depth, bpp,
-			       fb_info->stride,
-			       fb_info->gem_handle, &fb_id));
+	for_each_format(f)
+		if (f->drm_id == drm_format)
+			return f->cairo_id;
 
+	abort();
+}
+
+static cairo_t *create_cairo_ctx(int fd, struct kmstest_fb *fb)
+{
+	cairo_t *cr;
+	cairo_surface_t *surface;
+	cairo_format_t cformat;
+	void *fb_ptr;
+
+	cformat = drm_format_to_cairo(fb->drm_format);
+	fb_ptr = gem_mmap(fd, fb->gem_handle, fb->size, PROT_READ | PROT_WRITE);
+	surface = cairo_image_surface_create_for_data((unsigned char *)fb_ptr,
+						   cformat, fb->width,
+						   fb->height, fb->stride);
+	assert(surface);
+	cr = cairo_create(surface);
 	cairo_surface_destroy(surface);
 
-	fb_info->fb_id = fb_id;
+	return cr;
+}
+
+cairo_t *kmstest_get_cairo_ctx(int fd, struct kmstest_fb *fb)
+{
+
+	if (!fb->cairo_ctx)
+		fb->cairo_ctx = create_cairo_ctx(fd, fb);
+
+	gem_set_domain(fd, fb->gem_handle, I915_GEM_DOMAIN_CPU,
+		       I915_GEM_DOMAIN_CPU);
 
-	return fb_id;
+	return fb->cairo_ctx;
 }
 
-void kmstest_remove_fb(int fd, int fb_id)
+void kmstest_remove_fb(int fd, struct kmstest_fb *fb)
 {
-	do_or_die(drmModeRmFB(fd, fb_id));
+	if (fb->cairo_ctx)
+		cairo_destroy(fb->cairo_ctx);
+	do_or_die(drmModeRmFB(fd, fb->fb_id));
+	gem_close(fd, fb->gem_handle);
 }
 
 struct type_name {
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 89ded11..218914f 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -119,8 +119,13 @@ void kmstest_free_connector_config(struct kmstest_connector_config *config);
 struct kmstest_fb {
 	uint32_t fb_id;
 	uint32_t gem_handle;
+	uint32_t drm_format;
+	int width;
+	int height;
+	int depth;
 	unsigned stride;
 	unsigned size;
+	cairo_t *cairo_ctx;
 };
 
 enum kmstest_text_align {
@@ -136,14 +141,12 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
 			       double yspacing, const char *fmt, ...)
 			       __attribute__((format (printf, 4, 5)));
 
-typedef void (*kmstest_paint_func)(cairo_t *cr, int width, int height, void *priv);
-
 unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 			       int depth, bool tiled,
-			       struct kmstest_fb *fb_info,
-			       kmstest_paint_func paint_func,
-			       void *func_arg);
-void kmstest_remove_fb(int fd, int fb_id);
+			       struct kmstest_fb *fb_info);
+void kmstest_remove_fb(int fd, struct kmstest_fb *fb_info);
+cairo_t *kmstest_get_cairo_ctx(int fd, struct kmstest_fb *fb);
+void kmstest_paint_test_pattern(cairo_t *cr, int width, int height);
 void kmstest_dump_mode(drmModeModeInfo *mode);
 int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id);
 const char *kmstest_encoder_type_str(int type);
diff --git a/tests/kms_flip.c b/tests/kms_flip.c
index c9b3d8a..aeeaace 100644
--- a/tests/kms_flip.c
+++ b/tests/kms_flip.c
@@ -844,10 +844,13 @@ static void connector_find_preferred_mode(uint32_t connector_id, int crtc_idx,
 	o->mode_valid = 1;
 }
 
-static void
-paint_flip_mode(cairo_t *cr, int width, int height, void *priv)
+static void paint_flip_mode(struct kmstest_fb *fb, bool odd_frame)
 {
-	bool odd_frame = (bool) priv;
+	cairo_t *cr = kmstest_get_cairo_ctx(drm_fd, fb);
+	int width = fb->width;
+	int height = fb->height;
+
+	kmstest_paint_test_pattern(cr, width, height);
 
 	if (odd_frame)
 		cairo_rectangle(cr, width/4, height/2, width/4, height/8);
@@ -856,6 +859,8 @@ paint_flip_mode(cairo_t *cr, int width, int height, void *priv)
 
 	cairo_set_source_rgb(cr, 1, 1, 1);
 	cairo_fill(cr);
+
+	assert(!cairo_status(cr));
 }
 
 static int
@@ -991,20 +996,21 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)
 		o->fb_width *= 2;
 
 	o->fb_ids[0] = kmstest_create_fb(drm_fd, o->fb_width, o->fb_height,
-					 o->bpp, o->depth, false, &o->fb_info[0],
-					 paint_flip_mode, (void *)false);
+					 o->bpp, o->depth, false, &o->fb_info[0]);
 	o->fb_ids[1] = kmstest_create_fb(drm_fd, o->fb_width, o->fb_height,
-					 o->bpp, o->depth, false, &o->fb_info[1],
-					 paint_flip_mode, (void *)true);
+					 o->bpp, o->depth, false, &o->fb_info[1]);
 	o->fb_ids[2] = kmstest_create_fb(drm_fd, o->fb_width, o->fb_height,
-					 o->bpp, o->depth, true, &o->fb_info[2],
-					 paint_flip_mode, (void *)true);
+					 o->bpp, o->depth, true, &o->fb_info[2]);
 
 	if (!o->fb_ids[0] || !o->fb_ids[1] || !o->fb_ids[2]) {
 		fprintf(stderr, "failed to create fbs\n");
 		exit(3);
 	}
 
+	paint_flip_mode(&o->fb_info[0], false);
+	paint_flip_mode(&o->fb_info[1], true);
+	paint_flip_mode(&o->fb_info[2], true);
+
 	set_y_tiling(o, 2);
 
 	kmstest_dump_mode(&o->mode);
@@ -1044,9 +1050,9 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)
 	fprintf(stdout, "\n%s on crtc %d, connector %d: PASSED\n\n",
 		o->test_name, o->crtc, o->id);
 
-	kmstest_remove_fb(drm_fd, o->fb_ids[2]);
-	kmstest_remove_fb(drm_fd, o->fb_ids[1]);
-	kmstest_remove_fb(drm_fd, o->fb_ids[0]);
+	kmstest_remove_fb(drm_fd, &o->fb_info[2]);
+	kmstest_remove_fb(drm_fd, &o->fb_info[1]);
+	kmstest_remove_fb(drm_fd, &o->fb_info[0]);
 
 	last_connector = NULL;
 
diff --git a/tests/testdisplay.c b/tests/testdisplay.c
index 4470339..5ece921 100644
--- a/tests/testdisplay.c
+++ b/tests/testdisplay.c
@@ -258,15 +258,18 @@ static void paint_image(cairo_t *cr, const char *file)
 	cairo_surface_destroy(image);
 }
 
-static void
-paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
+static void paint_output_info(struct connector *c, struct kmstest_fb *fb)
 {
-	struct connector *c = priv;
+	cairo_t *cr = kmstest_get_cairo_ctx(drm_fd, fb);
+	int l_width = fb->width;
+	int l_height = fb->height;
 	double str_width;
 	double x, y, top_y;
 	double max_width;
 	int i;
 
+	kmstest_paint_test_pattern(cr, l_width, l_height);
+
 	cairo_select_font_face(cr, "Helvetica",
 			       CAIRO_FONT_SLANT_NORMAL,
 			       CAIRO_FONT_WEIGHT_NORMAL);
@@ -308,6 +311,8 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
 
 	if (qr_code)
 		paint_image(cr, "./pass.png");
+
+	assert(!cairo_status(cr));
 }
 
 static void sighandler(int signo)
@@ -362,8 +367,8 @@ set_mode(struct connector *c)
 		height = c->mode.vdisplay;
 
 		fb_id = kmstest_create_fb(drm_fd, width, height, bpp, depth,
-					  enable_tiling, &fb_info,
-					  paint_output_info, c);
+					  enable_tiling, &fb_info);
+		paint_output_info(c, &fb_info);
 
 		fb_ptr = gem_mmap(drm_fd, fb_info.gem_handle,
 				  fb_info.size, PROT_READ | PROT_WRITE);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v2 6/6] tests: add kms_render
  2013-06-05 19:25   ` [PATCH v2 0/6] tests: add tests for front buffer rendering Imre Deak
                       ` (4 preceding siblings ...)
  2013-06-05 19:25     ` [PATCH v2 5/6] lib: refactor kmstest_create_fb Imre Deak
@ 2013-06-05 19:25     ` Imre Deak
  5 siblings, 0 replies; 22+ messages in thread
From: Imre Deak @ 2013-06-05 19:25 UTC (permalink / raw)
  To: intel-gfx

Add a test going through all connectors/crtcs/modes/formats painting to
a front FB with CPU or painting to a back FB with CPU and blitting it
to the front FB.

Only formats understood by cairo are supported for now.

Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
---
 lib/drmtest.c      | 101 ++++++++++++++++++++--
 lib/drmtest.h      |   7 ++
 tests/.gitignore   |   1 +
 tests/Makefile.am  |   1 +
 tests/kms_render.c | 245 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 349 insertions(+), 6 deletions(-)
 create mode 100644 tests/kms_render.c

diff --git a/lib/drmtest.c b/lib/drmtest.c
index a551e7c..d9d58e5 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -842,8 +842,8 @@ static int create_bo_for_fb(int fd, int width, int height, int bpp,
 	return 0;
 }
 
-static void
-paint_color_gradient(cairo_t *cr, int x, int y, int w, int h,
+void
+kmstest_paint_color_gradient(cairo_t *cr, int x, int y, int w, int h,
 		     int r, int g, int b)
 {
 	cairo_pattern_t *pat;
@@ -869,16 +869,16 @@ paint_test_patterns(cairo_t *cr, int width, int height)
 	gr_height = height * 0.08;
 	x = (width / 2) - (gr_width / 2);
 
-	paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 0, 0);
+	kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 0, 0);
 
 	y += gr_height;
-	paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 1, 0);
+	kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 1, 0);
 
 	y += gr_height;
-	paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 0, 1);
+	kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 0, 0, 1);
 
 	y += gr_height;
-	paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
+	kmstest_paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
 }
 
 int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
@@ -1025,6 +1025,55 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 	return fb->fb_id;
 }
 
+static uint32_t drm_format_to_bpp(uint32_t drm_format)
+{
+	struct format_desc_struct *f;
+
+	for_each_format(f)
+		if (f->drm_id == drm_format)
+			return f->bpp;
+
+	abort();
+}
+
+unsigned int kmstest_create_fb2(int fd, int width, int height, uint32_t format,
+			        bool tiled, struct kmstest_fb *fb)
+{
+	uint32_t handles[4];
+	uint32_t pitches[4];
+	uint32_t offsets[4];
+	uint32_t fb_id;
+	int bpp;
+	int ret;
+
+	memset(fb, 0, sizeof(*fb));
+
+	bpp = drm_format_to_bpp(format);
+	ret = create_bo_for_fb(fd, width, height, bpp, tiled, &fb->gem_handle,
+			      &fb->size, &fb->stride);
+	if (ret < 0)
+		return ret;
+
+	memset(handles, 0, sizeof(handles));
+	handles[0] = fb->gem_handle;
+	memset(pitches, 0, sizeof(pitches));
+	pitches[0] = fb->stride;
+	memset(offsets, 0, sizeof(offsets));
+	if (drmModeAddFB2(fd, width, height, format, handles, pitches,
+			  offsets, &fb_id, 0) < 0) {
+		gem_close(fd, fb->gem_handle);
+
+		return 0;
+	}
+
+	fb->width = width;
+	fb->height = height;
+	fb->drm_format = format;
+	fb->fb_id = fb_id;
+
+	return fb_id;
+}
+
 static cairo_format_t drm_format_to_cairo(uint32_t drm_format)
 {
 	struct format_desc_struct *f;
@@ -1075,6 +1124,46 @@ void kmstest_remove_fb(int fd, struct kmstest_fb *fb)
 	gem_close(fd, fb->gem_handle);
 }
 
+const char *kmstest_format_str(uint32_t drm_format)
+{
+	struct format_desc_struct *f;
+
+	for_each_format(f)
+		if (f->drm_id == drm_format)
+			return f->name;
+
+	return "invalid";
+}
+
+const char *kmstest_pipe_str(int pipe)
+{
+	const char *str[] = { "A", "B", "C" };
+
+	if (pipe > 2)
+		return "invalid";
+
+	return str[pipe];
+}
+
+void kmstest_get_all_formats(const uint32_t **formats, int *format_count)
+{
+	static uint32_t *drm_formats;
+
+	if (!drm_formats) {
+		struct format_desc_struct *f;
+		uint32_t *format;
+
+		drm_formats = calloc(ARRAY_SIZE(format_desc),
+				     sizeof(*drm_formats));
+		format = &drm_formats[0];
+		for_each_format(f)
+			*format++ = f->drm_id;
+	}
+
+	*formats = drm_formats;
+	*format_count = ARRAY_SIZE(format_desc);
+}
+
 struct type_name {
 	int type;
 	const char *name;
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 218914f..e3a9275 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -144,11 +144,18 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
 unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
 			       int depth, bool tiled,
 			       struct kmstest_fb *fb_info);
+unsigned int kmstest_create_fb2(int fd, int width, int height, uint32_t format,
+			        bool tiled, struct kmstest_fb *fb);
 void kmstest_remove_fb(int fd, struct kmstest_fb *fb_info);
 cairo_t *kmstest_get_cairo_ctx(int fd, struct kmstest_fb *fb);
+void kmstest_paint_color_gradient(cairo_t *cr, int x, int y, int w, int h,
+				  int r, int g, int b);
 void kmstest_paint_test_pattern(cairo_t *cr, int width, int height);
 void kmstest_dump_mode(drmModeModeInfo *mode);
 int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id);
+const char *kmstest_format_str(uint32_t drm_format);
+const char *kmstest_pipe_str(int pipe);
+void kmstest_get_all_formats(const uint32_t **formats, int *format_count);
 const char *kmstest_encoder_type_str(int type);
 const char *kmstest_connector_status_str(int type);
 const char *kmstest_connector_type_str(int type);
diff --git a/tests/.gitignore b/tests/.gitignore
index 3cac813..1f7c691 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -85,6 +85,7 @@ getclient
 getstats
 getversion
 kms_flip
+kms_render
 prime_nv_api
 prime_nv_pcopy
 prime_nv_test
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 7250968..3f301c9 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -33,6 +33,7 @@ TESTS_progs_M = \
 	gem_tiled_partial_pwrite_pread \
 	$(NOUVEAU_TESTS_M) \
 	kms_flip \
+	kms_render \
 	prime_self_import \
 	$(NULL)
 
diff --git a/tests/kms_render.c b/tests/kms_render.c
new file mode 100644
index 0000000..707ce27
--- /dev/null
+++ b/tests/kms_render.c
@@ -0,0 +1,245 @@
+/*
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Imre Deak <imre.deak@intel.com>
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <assert.h>
+#include <cairo.h>
+#include <errno.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+#include "drmtest.h"
+#include "testdisplay.h"
+#include "intel_bufmgr.h"
+#include "intel_batchbuffer.h"
+#include "intel_gpu_tools.h"
+
+drmModeRes *resources;
+int drm_fd;
+static drm_intel_bufmgr *bufmgr;
+struct intel_batchbuffer *batch;
+uint32_t devid;
+
+enum test_flags {
+	TEST_DIRECT_RENDER	= 0x01,
+	TEST_GPU_BLIT		= 0x02,
+};
+
+static int paint_fb(struct kmstest_fb *fb, const char *test_name,
+		    const char *mode_format_str, const char *cconf_str)
+{
+	cairo_t *cr;
+
+	cr = kmstest_get_cairo_ctx(drm_fd, fb);
+	if (!cr)
+		return -1;
+
+	kmstest_paint_color_gradient(cr, 0, 0, fb->width, fb->height, 1, 1, 1);
+	kmstest_paint_test_pattern(cr, fb->width, fb->height);
+
+	cairo_select_font_face(cr, "Helvetica", CAIRO_FONT_SLANT_NORMAL,
+			       CAIRO_FONT_WEIGHT_NORMAL);
+	cairo_move_to(cr, fb->width / 2, fb->height / 2);
+	cairo_set_font_size(cr, 36);
+	kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s", test_name);
+	kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s", mode_format_str);
+	kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s", cconf_str);
+
+	return 0;
+}
+
+static void gpu_blit(struct kmstest_fb *dst_fb, struct kmstest_fb *src_fb)
+{
+	drm_intel_bo *dst_bo;
+	drm_intel_bo *src_bo;
+
+	dst_bo = gem_handle_to_libdrm_bo(bufmgr, drm_fd, "destination",
+					 dst_fb->gem_handle);
+	assert(dst_bo);
+	src_bo = gem_handle_to_libdrm_bo(bufmgr, drm_fd, "source",
+					 src_fb->gem_handle);
+	assert(src_bo);
+
+	intel_copy_bo(batch, dst_bo, src_bo, src_fb->width, src_fb->height);
+	intel_batchbuffer_flush(batch);
+	gem_quiescent_gpu(drm_fd);
+
+	drm_intel_bo_unreference(src_bo);
+	drm_intel_bo_unreference(dst_bo);
+}
+
+static int test_format(const char *test_name,
+		       struct kmstest_connector_config *cconf,
+		       drmModeModeInfo *mode, uint32_t format,
+		       enum test_flags flags)
+{
+	int width;
+	int height;
+	struct kmstest_fb fb[2];
+	char *mode_format_str;
+	char *cconf_str;
+	int ret;
+
+	ret = asprintf(&mode_format_str, "%s @ %dHz / %s",
+		 mode->name, mode->vrefresh, kmstest_format_str(format));
+	assert(ret > 0);
+	ret = asprintf(&cconf_str, "pipe %s, encoder %s, connector %s",
+		       kmstest_pipe_str(cconf->pipe),
+		       kmstest_encoder_type_str(cconf->encoder->encoder_type),
+		       kmstest_connector_type_str(cconf->connector->connector_type));
+	assert(ret > 0);
+
+	printf("Beginning test %s with %s on %s\n",
+		test_name, mode_format_str, cconf_str);
+
+	width = mode->hdisplay;
+	height = mode->vdisplay;
+
+	if (!kmstest_create_fb2(drm_fd, width, height, format, false, &fb[0]))
+		goto err1;
+
+	if (!kmstest_create_fb2(drm_fd, width, height, format, false, &fb[1]))
+		goto err2;
+
+	do_or_die(drmModeSetCrtc(drm_fd, cconf->crtc->crtc_id, fb[0].fb_id,
+				 0, 0, &cconf->connector->connector_id, 1,
+				 mode));
+	do_or_die(drmModePageFlip(drm_fd, cconf->crtc->crtc_id, fb[0].fb_id,
+				  0, NULL));
+	sleep(2);
+
+	if (flags & TEST_DIRECT_RENDER) {
+		paint_fb(&fb[0], test_name, mode_format_str, cconf_str);
+	} else if (flags & TEST_GPU_BLIT) {
+		paint_fb(&fb[1], test_name, mode_format_str, cconf_str);
+		gpu_blit(&fb[0], &fb[1]);
+	}
+	sleep(5);
+
+	printf("Test %s with %s on %s: PASSED\n",
+		test_name, mode_format_str, cconf_str);
+	free(mode_format_str);
+	free(cconf_str);
+
+	kmstest_remove_fb(drm_fd, &fb[1]);
+	kmstest_remove_fb(drm_fd, &fb[0]);
+
+	return 0;
+
+err2:
+	kmstest_remove_fb(drm_fd, &fb[0]);
+err1:
+	fprintf(stderr, "skip testing unsupported format %s\n",
+		kmstest_format_str(format));
+
+	return -1;
+}
+
+static void test_connector(const char *test_name,
+			   struct kmstest_connector_config *cconf,
+			   enum test_flags flags)
+{
+	const uint32_t *formats;
+	int format_count;
+	int i;
+
+	kmstest_get_all_formats(&formats, &format_count);
+	for (i = 0; i < cconf->connector->count_modes; i++) {
+		int j;
+
+		for (j = 0; j < format_count; j++)
+			test_format(test_name,
+				    cconf, &cconf->connector->modes[i],
+				    formats[j], flags);
+	}
+}
+
+static int run_test(const char *test_name, enum test_flags flags)
+{
+	int i;
+
+	resources = drmModeGetResources(drm_fd);
+	assert(resources);
+
+	/* Find any connected displays */
+	for (i = 0; i < resources->count_connectors; i++) {
+		uint32_t connector_id;
+		int j;
+
+		connector_id = resources->connectors[i];
+		for (j = 0; j < resources->count_crtcs; j++) {
+			struct kmstest_connector_config cconf;
+			int ret;
+
+			ret = kmstest_get_connector_config(drm_fd, connector_id,
+							   1 << j, &cconf);
+			if (ret < 0)
+				continue;
+
+			test_connector(test_name, &cconf, flags);
+
+			kmstest_free_connector_config(&cconf);
+		}
+	}
+
+	drmModeFreeResources(resources);
+
+	return 1;
+}
+
+int main(int argc, char **argv)
+{
+	struct {
+		enum test_flags flags;
+		const char *name;
+	} tests[] = {
+		{ TEST_DIRECT_RENDER,	"direct-render" },
+		{ TEST_GPU_BLIT,	"gpu-blit" },
+	};
+	int i;
+
+	drmtest_subtest_init(argc, argv);
+
+	if (!drmtest_only_list_subtests()) {
+		drm_fd = drm_open_any();
+
+		bufmgr = drm_intel_bufmgr_gem_init(drm_fd, 4096);
+		devid = intel_get_drm_devid(drm_fd);
+		batch = intel_batchbuffer_alloc(bufmgr, devid);
+
+		do_or_die(drmtest_set_vt_graphics_mode());
+	}
+
+	for (i = 0; i < ARRAY_SIZE(tests); i++) {
+		if (drmtest_run_subtest(tests[i].name))
+			run_test(tests[i].name, tests[i].flags);
+	}
+
+	if (!drmtest_only_list_subtests())
+		close(drm_fd);
+
+	return 0;
+}
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH v2 2/6] lib: add kmstest_cairo_printf_line
  2013-06-05 19:25     ` [PATCH v2 2/6] lib: add kmstest_cairo_printf_line Imre Deak
@ 2013-06-05 19:27       ` Rodrigo Vivi
  2013-06-05 20:04       ` [PATCH v3 " Imre Deak
  1 sibling, 0 replies; 22+ messages in thread
From: Rodrigo Vivi @ 2013-06-05 19:27 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-gfx

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>

On Wed, Jun 5, 2013 at 4:25 PM, Imre Deak <imre.deak@intel.com> wrote:
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  lib/drmtest.c       | 44 ++++++++++++++++++++++++
>  lib/drmtest.h       | 13 ++++++++
>  tests/testdisplay.c | 96 ++++++++++++++++-------------------------------------
>  3 files changed, 86 insertions(+), 67 deletions(-)
>
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index 3c4812f..71dd06b 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -907,6 +907,50 @@ paint_test_patterns(cairo_t *cr, int width, int height)
>         paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
>  }
>
> +int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
> +                               double yspacing, const char *fmt, ...)
> +{
> +       double x, y, xofs, yofs;
> +       cairo_text_extents_t extents;
> +       char *text;
> +       va_list ap;
> +       int ret;
> +
> +       va_start(ap, fmt);
> +       ret = vasprintf(&text, fmt, ap);
> +       assert(ret >= 0);
> +       va_end(ap);
> +
> +       cairo_text_extents(cr, text, &extents);
> +
> +       xofs = yofs = 0;
> +       if (align & align_right)
> +               xofs = -extents.width;
> +       else if (align & align_hcenter)
> +               xofs = -extents.width / 2;
> +
> +       if (align & align_top)
> +               yofs = extents.height;
> +       else if (align & align_vcenter)
> +               yofs = extents.height / 2;
> +
> +       cairo_get_current_point(cr, &x, &y);
> +       if (xofs || yofs)
> +               cairo_rel_move_to(cr, xofs, yofs);
> +
> +       cairo_text_path(cr, text);
> +       cairo_set_source_rgb(cr, 0, 0, 0);
> +       cairo_stroke_preserve(cr);
> +       cairo_set_source_rgb(cr, 1, 1, 1);
> +       cairo_fill(cr);
> +
> +       cairo_move_to(cr, x, y + extents.height + yspacing);
> +
> +       free(text);
> +
> +       return extents.width;
> +}
> +
>  enum corner {
>         topleft,
>         topright,
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 38aeb9d..3c1368d 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -109,6 +109,19 @@ struct kmstest_fb {
>         unsigned size;
>  };
>
> +enum kmstest_text_align {
> +       align_left,
> +       align_bottom    = align_left,
> +       align_right     = 0x01,
> +       align_top       = 0x02,
> +       align_vcenter   = 0x04,
> +       align_hcenter   = 0x08,
> +};
> +
> +int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
> +                              double yspacing, const char *fmt, ...)
> +                              __attribute__((format (printf, 4, 5)));
> +
>  typedef void (*kmstest_paint_func)(cairo_t *cr, int width, int height, void *priv);
>
>  unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
> diff --git a/tests/testdisplay.c b/tests/testdisplay.c
> index e7a2555..b10c3b9 100644
> --- a/tests/testdisplay.c
> +++ b/tests/testdisplay.c
> @@ -331,86 +331,48 @@ static void
>  paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
>  {
>         struct connector *c = priv;
> -       cairo_text_extents_t name_extents, mode_extents;
> -       char name_buf[128], mode_buf[128];
> -       int i, x, y, modes_x, modes_y;
> +       double str_width;
> +       double x, y, top_y;
> +       double max_width;
> +       int i;
>
> -       /* Get text extents for each string */
> -       snprintf(name_buf, sizeof name_buf, "%s",
> -                kmstest_connector_type_str(c->connector->connector_type));
> -       cairo_set_font_size(cr, 48);
>         cairo_select_font_face(cr, "Helvetica",
>                                CAIRO_FONT_SLANT_NORMAL,
>                                CAIRO_FONT_WEIGHT_NORMAL);
> -       cairo_text_extents(cr, name_buf, &name_extents);
> -
> -       snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz on %s encoder",
> -                c->mode.name, c->mode.vrefresh,
> -                kmstest_encoder_type_str(c->encoder->encoder_type));
> -       cairo_set_font_size(cr, 36);
> -       cairo_text_extents(cr, mode_buf, &mode_extents);
> +       cairo_move_to(cr, l_width / 2, l_height / 2);
>
> -       /* Paint output name */
> -       x = l_width / 2;
> -       x -= name_extents.width / 2;
> -       y = l_height / 2;
> -       y -= (name_extents.height / 2) - (mode_extents.height / 2) - 10;
> +       /* Print connector and mode name */
>         cairo_set_font_size(cr, 48);
> -       cairo_move_to(cr, x, y);
> -       cairo_text_path(cr, name_buf);
> -       cairo_set_source_rgb(cr, 0, 0, 0);
> -       cairo_stroke_preserve(cr);
> -       cairo_set_source_rgb(cr, 1, 1, 1);
> -       cairo_fill(cr);
> -
> -       /* Paint mode name */
> -       x = l_width / 2;
> -       x -= mode_extents.width / 2;
> -       modes_x = x;
> -       y = l_height / 2;
> -       y += (mode_extents.height / 2) + (name_extents.height / 2) + 10;
> +       kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s",
> +                kmstest_connector_type_str(c->connector->connector_type));
> +
>         cairo_set_font_size(cr, 36);
> -       cairo_move_to(cr, x, y);
> -       cairo_text_path(cr, mode_buf);
> -       cairo_set_source_rgb(cr, 0, 0, 0);
> -       cairo_stroke_preserve(cr);
> -       cairo_set_source_rgb(cr, 1, 1, 1);
> -       cairo_fill(cr);
> +       str_width = kmstest_cairo_printf_line(cr, align_hcenter, 10,
> +               "%s @ %dHz on %s encoder", c->mode.name, c->mode.vrefresh,
> +               kmstest_encoder_type_str(c->encoder->encoder_type));
> +
> +       cairo_rel_move_to(cr, -str_width / 2, 0);
>
>         /* List available modes */
> -       snprintf(mode_buf, sizeof mode_buf, "Available modes:");
>         cairo_set_font_size(cr, 18);
> -       cairo_text_extents(cr, mode_buf, &mode_extents);
> -       x = modes_x;
> -       modes_x = x + mode_extents.width;
> -       y += mode_extents.height + 10;
> -       modes_y = y;
> -       cairo_move_to(cr, x, y);
> -       cairo_text_path(cr, mode_buf);
> -       cairo_set_source_rgb(cr, 0, 0, 0);
> -       cairo_stroke_preserve(cr);
> -       cairo_set_source_rgb(cr, 1, 1, 1);
> -       cairo_fill(cr);
> +       str_width = kmstest_cairo_printf_line(cr, align_left, 10,
> +                                             "Available modes:");
> +       cairo_rel_move_to(cr, str_width, 0);
> +       cairo_get_current_point(cr, &x, &top_y);
>
> +       max_width = 0;
>         for (i = 0; i < c->connector->count_modes; i++) {
> -               snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz",
> -                        c->connector->modes[i].name,
> -                        c->connector->modes[i].vrefresh);
> -               cairo_set_font_size(cr, 18);
> -               cairo_text_extents(cr, mode_buf, &mode_extents);
> -               x = modes_x - mode_extents.width; /* right justify modes */
> -               y += mode_extents.height + 10;
> -               if (y + mode_extents.height >= height) {
> -                       y = modes_y + mode_extents.height + 10;
> -                       modes_x += mode_extents.width + 10;
> -                       x = modes_x - mode_extents.width;
> +               cairo_get_current_point(cr, &x, &y);
> +               if (y >= l_height) {
> +                       x += max_width + 10;
> +                       max_width = 0;
> +                       cairo_move_to(cr, x, top_y);
>                 }
> -               cairo_move_to(cr, x, y);
> -               cairo_text_path(cr, mode_buf);
> -               cairo_set_source_rgb(cr, 0, 0, 0);
> -               cairo_stroke_preserve(cr);
> -               cairo_set_source_rgb(cr, 1, 1, 1);
> -               cairo_fill(cr);
> +               str_width = kmstest_cairo_printf_line(cr, align_right, 10,
> +                       "%s @ %dHz", c->connector->modes[i % 2].name,
> +                        c->connector->modes[i % 2].vrefresh);
> +               if (str_width > max_width)
> +                       max_width = str_width;
>         }
>
>         if (qr_code)
> --
> 1.8.1.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v2 3/6] lib: use kmstest_cairo_printf_line in paint_marker
  2013-06-05 19:25     ` [PATCH v2 3/6] lib: use kmstest_cairo_printf_line in paint_marker Imre Deak
@ 2013-06-05 19:29       ` Rodrigo Vivi
  0 siblings, 0 replies; 22+ messages in thread
From: Rodrigo Vivi @ 2013-06-05 19:29 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-gfx

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>

On Wed, Jun 5, 2013 at 4:25 PM, Imre Deak <imre.deak@intel.com> wrote:
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  lib/drmtest.c | 64 +++++++++++++----------------------------------------------
>  1 file changed, 14 insertions(+), 50 deletions(-)
>
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index 71dd06b..3ad77a8 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -951,46 +951,12 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
>         return extents.width;
>  }
>
> -enum corner {
> -       topleft,
> -       topright,
> -       bottomleft,
> -       bottomright,
> -};
> -
>  static void
> -paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)
> +paint_marker(cairo_t *cr, int x, int y)
>  {
> -       cairo_text_extents_t extents;
> +       enum kmstest_text_align align;
>         int xoff, yoff;
>
> -       cairo_set_font_size(cr, 18);
> -       cairo_text_extents(cr, str, &extents);
> -
> -       switch (text_location) {
> -       case topleft:
> -               xoff = -20;
> -               xoff -= extents.width;
> -               yoff = -20;
> -               break;
> -       case topright:
> -               xoff = 20;
> -               yoff = -20;
> -               break;
> -       case bottomleft:
> -               xoff = -20;
> -               xoff -= extents.width;
> -               yoff = 20;
> -               break;
> -       case bottomright:
> -               xoff = 20;
> -               yoff = 20;
> -               break;
> -       default:
> -               xoff = 0;
> -               yoff = 0;
> -       }
> -
>         cairo_move_to(cr, x, y - 20);
>         cairo_line_to(cr, x, y + 20);
>         cairo_move_to(cr, x - 20, y);
> @@ -1004,12 +970,15 @@ paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)
>         cairo_set_line_width(cr, 2);
>         cairo_stroke(cr);
>
> +       xoff = x ? -20 : 20;
> +       align = x ? align_right : align_left;
> +
> +       yoff = y ? -20 : 20;
> +       align |= y ? align_bottom : align_top;
> +
>         cairo_move_to(cr, x + xoff, y + yoff);
> -       cairo_text_path(cr, str);
> -       cairo_set_source_rgb(cr, 0, 0, 0);
> -       cairo_stroke_preserve(cr);
> -       cairo_set_source_rgb(cr, 1, 1, 1);
> -       cairo_fill(cr);
> +       cairo_set_font_size(cr, 18);
> +       kmstest_cairo_printf_line(cr, align, 0, "(%d, %d)", x, y);
>  }
>
>  unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
> @@ -1021,7 +990,6 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
>         cairo_surface_t *surface;
>         cairo_status_t status;
>         cairo_t *cr;
> -       char buf[128];
>         unsigned int fb_id;
>
>         surface = paint_allocate_surface(fd, width, height, depth, bpp,
> @@ -1035,14 +1003,10 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
>         cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
>
>         /* Paint corner markers */
> -       snprintf(buf, sizeof buf, "(%d, %d)", 0, 0);
> -       paint_marker(cr, 0, 0, buf, bottomright);
> -       snprintf(buf, sizeof buf, "(%d, %d)", width, 0);
> -       paint_marker(cr, width, 0, buf, bottomleft);
> -       snprintf(buf, sizeof buf, "(%d, %d)", 0, height);
> -       paint_marker(cr, 0, height, buf, topright);
> -       snprintf(buf, sizeof buf, "(%d, %d)", width, height);
> -       paint_marker(cr, width, height, buf, topleft);
> +       paint_marker(cr, 0, 0);
> +       paint_marker(cr, width, 0);
> +       paint_marker(cr, 0, height);
> +       paint_marker(cr, width, height);
>
>         if (paint_func)
>                 paint_func(cr, width, height, func_arg);
> --
> 1.8.1.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH v3 2/6] lib: add kmstest_cairo_printf_line
  2013-06-05 19:25     ` [PATCH v2 2/6] lib: add kmstest_cairo_printf_line Imre Deak
  2013-06-05 19:27       ` Rodrigo Vivi
@ 2013-06-05 20:04       ` Imre Deak
  1 sibling, 0 replies; 22+ messages in thread
From: Imre Deak @ 2013-06-05 20:04 UTC (permalink / raw)
  To: intel-gfx

Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
[v3: fix mode printing in paint_output_info() botched by debugging leftover :/ ]
---
 lib/drmtest.c       | 44 ++++++++++++++++++++++++
 lib/drmtest.h       | 13 ++++++++
 tests/testdisplay.c | 96 ++++++++++++++++-------------------------------------
 3 files changed, 86 insertions(+), 67 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 3c4812f..71dd06b 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -907,6 +907,50 @@ paint_test_patterns(cairo_t *cr, int width, int height)
 	paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
 }
 
+int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
+				double yspacing, const char *fmt, ...)
+{
+	double x, y, xofs, yofs;
+	cairo_text_extents_t extents;
+	char *text;
+	va_list ap;
+	int ret;
+
+	va_start(ap, fmt);
+	ret = vasprintf(&text, fmt, ap);
+	assert(ret >= 0);
+	va_end(ap);
+
+	cairo_text_extents(cr, text, &extents);
+
+	xofs = yofs = 0;
+	if (align & align_right)
+		xofs = -extents.width;
+	else if (align & align_hcenter)
+		xofs = -extents.width / 2;
+
+	if (align & align_top)
+		yofs = extents.height;
+	else if (align & align_vcenter)
+		yofs = extents.height / 2;
+
+	cairo_get_current_point(cr, &x, &y);
+	if (xofs || yofs)
+		cairo_rel_move_to(cr, xofs, yofs);
+
+	cairo_text_path(cr, text);
+	cairo_set_source_rgb(cr, 0, 0, 0);
+	cairo_stroke_preserve(cr);
+	cairo_set_source_rgb(cr, 1, 1, 1);
+	cairo_fill(cr);
+
+	cairo_move_to(cr, x, y + extents.height + yspacing);
+
+	free(text);
+
+	return extents.width;
+}
+
 enum corner {
 	topleft,
 	topright,
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 38aeb9d..3c1368d 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -109,6 +109,19 @@ struct kmstest_fb {
 	unsigned size;
 };
 
+enum kmstest_text_align {
+	align_left,
+	align_bottom	= align_left,
+	align_right	= 0x01,
+	align_top	= 0x02,
+	align_vcenter	= 0x04,
+	align_hcenter	= 0x08,
+};
+
+int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
+			       double yspacing, const char *fmt, ...)
+			       __attribute__((format (printf, 4, 5)));
+
 typedef void (*kmstest_paint_func)(cairo_t *cr, int width, int height, void *priv);
 
 unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
diff --git a/tests/testdisplay.c b/tests/testdisplay.c
index e7a2555..67b7031 100644
--- a/tests/testdisplay.c
+++ b/tests/testdisplay.c
@@ -331,86 +331,48 @@ static void
 paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)
 {
 	struct connector *c = priv;
-	cairo_text_extents_t name_extents, mode_extents;
-	char name_buf[128], mode_buf[128];
-	int i, x, y, modes_x, modes_y;
+	double str_width;
+	double x, y, top_y;
+	double max_width;
+	int i;
 
-	/* Get text extents for each string */
-	snprintf(name_buf, sizeof name_buf, "%s",
-		 kmstest_connector_type_str(c->connector->connector_type));
-	cairo_set_font_size(cr, 48);
 	cairo_select_font_face(cr, "Helvetica",
 			       CAIRO_FONT_SLANT_NORMAL,
 			       CAIRO_FONT_WEIGHT_NORMAL);
-	cairo_text_extents(cr, name_buf, &name_extents);
-
-	snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz on %s encoder",
-		 c->mode.name, c->mode.vrefresh,
-		 kmstest_encoder_type_str(c->encoder->encoder_type));
-	cairo_set_font_size(cr, 36);
-	cairo_text_extents(cr, mode_buf, &mode_extents);
+	cairo_move_to(cr, l_width / 2, l_height / 2);
 
-	/* Paint output name */
-	x = l_width / 2;
-	x -= name_extents.width / 2;
-	y = l_height / 2;
-	y -= (name_extents.height / 2) - (mode_extents.height / 2) - 10;
+	/* Print connector and mode name */
 	cairo_set_font_size(cr, 48);
-	cairo_move_to(cr, x, y);
-	cairo_text_path(cr, name_buf);
-	cairo_set_source_rgb(cr, 0, 0, 0);
-	cairo_stroke_preserve(cr);
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	cairo_fill(cr);
-
-	/* Paint mode name */
-	x = l_width / 2;
-	x -= mode_extents.width / 2;
-	modes_x = x;
-	y = l_height / 2;
-	y += (mode_extents.height / 2) + (name_extents.height / 2) + 10;
+	kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s",
+		 kmstest_connector_type_str(c->connector->connector_type));
+
 	cairo_set_font_size(cr, 36);
-	cairo_move_to(cr, x, y);
-	cairo_text_path(cr, mode_buf);
-	cairo_set_source_rgb(cr, 0, 0, 0);
-	cairo_stroke_preserve(cr);
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	cairo_fill(cr);
+	str_width = kmstest_cairo_printf_line(cr, align_hcenter, 10,
+		"%s @ %dHz on %s encoder", c->mode.name, c->mode.vrefresh,
+		kmstest_encoder_type_str(c->encoder->encoder_type));
+
+	cairo_rel_move_to(cr, -str_width / 2, 0);
 
 	/* List available modes */
-	snprintf(mode_buf, sizeof mode_buf, "Available modes:");
 	cairo_set_font_size(cr, 18);
-	cairo_text_extents(cr, mode_buf, &mode_extents);
-	x = modes_x;
-	modes_x = x + mode_extents.width;
-	y += mode_extents.height + 10;
-	modes_y = y;
-	cairo_move_to(cr, x, y);
-	cairo_text_path(cr, mode_buf);
-	cairo_set_source_rgb(cr, 0, 0, 0);
-	cairo_stroke_preserve(cr);
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	cairo_fill(cr);
+	str_width = kmstest_cairo_printf_line(cr, align_left, 10,
+					      "Available modes:");
+	cairo_rel_move_to(cr, str_width, 0);
+	cairo_get_current_point(cr, &x, &top_y);
 
+	max_width = 0;
 	for (i = 0; i < c->connector->count_modes; i++) {
-		snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz",
-			 c->connector->modes[i].name,
-			 c->connector->modes[i].vrefresh);
-		cairo_set_font_size(cr, 18);
-		cairo_text_extents(cr, mode_buf, &mode_extents);
-		x = modes_x - mode_extents.width; /* right justify modes */
-		y += mode_extents.height + 10;
-		if (y + mode_extents.height >= height) {
-			y = modes_y + mode_extents.height + 10;
-			modes_x += mode_extents.width + 10;
-			x = modes_x - mode_extents.width;
+		cairo_get_current_point(cr, &x, &y);
+		if (y >= l_height) {
+			x += max_width + 10;
+			max_width = 0;
+			cairo_move_to(cr, x, top_y);
 		}
-		cairo_move_to(cr, x, y);
-		cairo_text_path(cr, mode_buf);
-		cairo_set_source_rgb(cr, 0, 0, 0);
-		cairo_stroke_preserve(cr);
-		cairo_set_source_rgb(cr, 1, 1, 1);
-		cairo_fill(cr);
+		str_width = kmstest_cairo_printf_line(cr, align_right, 10,
+			"%s @ %dHz", c->connector->modes[i].name,
+			 c->connector->modes[i].vrefresh);
+		if (str_width > max_width)
+			max_width = str_width;
 	}
 
 	if (qr_code)
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [igt PATCH 5/5] tests: add kms_render
  2013-06-05 18:28   ` Rodrigo Vivi
@ 2013-06-06 10:19     ` Imre Deak
  0 siblings, 0 replies; 22+ messages in thread
From: Imre Deak @ 2013-06-06 10:19 UTC (permalink / raw)
  To: Rodrigo Vivi; +Cc: intel-gfx

On Wed, 2013-06-05 at 15:28 -0300, Rodrigo Vivi wrote:
> nice tests, only now I understood why Daniel "randomly" volunteered me
> to review this series ;)
> Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>

Thanks for the review, the patchset is pushed now to igt.

--Imre

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2013-06-06 10:19 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-31  9:23 [igt PATCH 1/5] lib: move connector_type_str and co to drmtest Imre Deak
2013-05-31  9:23 ` [igt PATCH 2/5] lib: add kmstest_cairo_printf_line Imre Deak
2013-06-05 17:44   ` Rodrigo Vivi
2013-06-05 19:01     ` Imre Deak
2013-05-31  9:23 ` [igt PATCH 3/5] lib: add kmstest_get_connector_config Imre Deak
2013-06-05 18:00   ` Rodrigo Vivi
2013-05-31  9:23 ` [igt PATCH 4/5] lib: refactor kmstest_create_fb Imre Deak
2013-06-05 18:21   ` Rodrigo Vivi
2013-05-31  9:23 ` [igt PATCH 5/5] tests: add kms_render Imre Deak
2013-06-05 18:28   ` Rodrigo Vivi
2013-06-06 10:19     ` Imre Deak
2013-06-05 19:25   ` [PATCH v2 0/6] tests: add tests for front buffer rendering Imre Deak
2013-06-05 19:25     ` [PATCH v2 1/6] lib: move connector_type_str and co to drmtest Imre Deak
2013-06-05 19:25     ` [PATCH v2 2/6] lib: add kmstest_cairo_printf_line Imre Deak
2013-06-05 19:27       ` Rodrigo Vivi
2013-06-05 20:04       ` [PATCH v3 " Imre Deak
2013-06-05 19:25     ` [PATCH v2 3/6] lib: use kmstest_cairo_printf_line in paint_marker Imre Deak
2013-06-05 19:29       ` Rodrigo Vivi
2013-06-05 19:25     ` [PATCH v2 4/6] lib: add kmstest_get_connector_config Imre Deak
2013-06-05 19:25     ` [PATCH v2 5/6] lib: refactor kmstest_create_fb Imre Deak
2013-06-05 19:25     ` [PATCH v2 6/6] tests: add kms_render Imre Deak
2013-06-05 17:40 ` [igt PATCH 1/5] lib: move connector_type_str and co to drmtest Rodrigo Vivi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.