[Piglit] [PATCH 2/2] linestipple: Report subtest results.

Eric Anholt eric at anholt.net
Wed Apr 24 19:27:19 PDT 2013


It's a tricky test to get right, so being able to identify
improvements in components is useful.

This required removing the "/" from one test's name, since those are
intepreted as group dividers.
---
 tests/general/linestipple.c |   78 +++++++++++++++++++++----------------------
 1 file changed, 39 insertions(+), 39 deletions(-)

diff --git a/tests/general/linestipple.c b/tests/general/linestipple.c
index 2e1b409..21d689c 100644
--- a/tests/general/linestipple.c
+++ b/tests/general/linestipple.c
@@ -38,15 +38,6 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
 
 PIGLIT_GL_TEST_CONFIG_END
 
-static void
-probe_pixel(int x, int y, const float* expected)
-{
-	if (!piglit_probe_pixel_rgb(x, y, expected)) {
-		if (piglit_automatic)
-			piglit_report_result(PIGLIT_FAIL);
-	}
-}
-
 struct vertex {
 	GLuint x;
 	GLuint y;
@@ -70,12 +61,11 @@ static float background[3] = { 0, 0, 0 };
 /**
  * @note Only horizontal and vertical lines supported right now.
  */
-static GLuint
-probe_line(const struct stipple_line *line,
-	   const struct vertex *v1,
-	   const struct vertex *v2,
-	   GLuint fragment)
+static bool
+probe_line(const struct stipple_line *line, int v1i, int v2i, GLuint *fragment)
 {
+	const struct vertex *v1 = &line->vertices[v1i];
+	const struct vertex *v2 = &line->vertices[v2i];
 	int x = v1->x;
 	int y = v1->y;
 	int length, dx = 0, dy = 0;
@@ -95,22 +85,28 @@ probe_line(const struct stipple_line *line,
 	}
 
 	while (length) {
-		GLuint s = (fragment/line->factor) & 15;
+		GLuint s = ((*fragment) / line->factor) & 15;
+		const float *color;
+
 		if (line->pattern & (1 << s))
-			probe_pixel(basex + x, basey + y, line->color);
+			color = line->color;
 		else
-			probe_pixel(basex + x, basey + y, background);
+			color = background;
+
+		if (!piglit_probe_pixel_rgb(basex + x, basex + y, color)) {
+			return false;
+		}
 
 		length--;
-		fragment++;
+		(*fragment)++;
 		x += dx;
 		y += dy;
 	}
 
-	return fragment;
+	return true;
 }
 
-static void
+static bool
 test_line(const struct stipple_line *line)
 {
 	GLuint i;
@@ -125,20 +121,23 @@ test_line(const struct stipple_line *line)
 	glReadBuffer(GL_BACK);
 	if (line->primitive == GL_LINES) {
 		for (i = 0; i + 1 < line->nvertices; i += 2) {
-			probe_line(line, &line->vertices[i],
-				   &line->vertices[i+1], 0);
+			GLuint fragment = 0;
+			if (!probe_line(line, i, i + 1, &fragment))
+				return false;
 		}
 	} else {
 		GLuint fragment = 0;
 		for (i = 0; i + 1 < line->nvertices; ++i) {
-			fragment = probe_line(line, &line->vertices[i],
-					      &line->vertices[i+1], fragment);
+			if (!probe_line(line, i, i + 1, &fragment))
+				return false;
 		}
 		if (line->primitive == GL_LINE_LOOP) {
-			probe_line(line, &line->vertices[i],
-				   &line->vertices[0], fragment);
+			if (!probe_line(line, i, 0, &fragment))
+				return false;
 		}
 	}
+
+	return true;
 }
 
 static struct vertex BaselineVertices[] = { { 0, 0 },
@@ -170,7 +169,7 @@ static struct stipple_line Lines[] = {
 		BaselineVertices
 	},
 	{ /* Restarting lines within a single Begin/End block */
-		"Restarting lines within a single Begin/End block",
+		"Restarting lines within a single Begin-End block",
 		1, 0x00ff, { 1.0, 0.0, 0.0 },
 		GL_LINES, 4,
 		RestartVertices
@@ -201,9 +200,13 @@ static struct stipple_line Lines[] = {
 	}
 };
 
-static void test(void)
+enum piglit_result
+piglit_display(void)
 {
 	int i;
+	bool pass = true;
+
+	piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
 
 	glClearColor(0.0, 0.0, 0.0, 1.0);
 	glClear(GL_COLOR_BUFFER_BIT);
@@ -214,22 +217,19 @@ static void test(void)
 	glTranslatef(basex, basey, 0.0);
 
 	for (i = 0; i < ARRAY_SIZE(Lines); ++i) {
-		puts(Lines[i].name);
-		test_line(&Lines[i]);
+		printf("Testing %s:\n", Lines[i].name);
+		if (test_line(&Lines[i])) {
+			piglit_report_subtest_result(PIGLIT_PASS, Lines[i].name);
+		} else {
+			piglit_report_subtest_result(PIGLIT_FAIL, Lines[i].name);
+			pass = false;
+		}
 	}
 	glPopMatrix();
 
 	piglit_present_results();
-}
-
-
-enum piglit_result
-piglit_display(void)
-{
-	piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
-	test();
 
-	return PIGLIT_PASS;
+	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
 }
 
 void
-- 
1.7.10.4



More information about the Piglit mailing list