[Piglit] [PATCH] copyteximage: refactor the code for readability and debugging

Brian Paul brianp at vmware.com
Fri Aug 24 07:20:32 PDT 2012


Test a single target/format combination in test_target_and_format().
This makes it a bit easier to hack the code to debug a specific
combination.  It's also easier to read.

(note: the patch/diff might look really ugly and complicated but the
code movement is pretty simple, actually)
---
 tests/texturing/copyteximage.c |  373 +++++++++++++++++++++-------------------
 1 files changed, 197 insertions(+), 176 deletions(-)

diff --git a/tests/texturing/copyteximage.c b/tests/texturing/copyteximage.c
index 4b7f877..4da8228 100644
--- a/tests/texturing/copyteximage.c
+++ b/tests/texturing/copyteximage.c
@@ -398,221 +398,242 @@ static GLboolean probe_rect(int x, int y, int w, int h,
 	return piglit_probe_rect_rgba(x, y, w, h, expected_scaled);
 }
 
-enum piglit_result
-piglit_display(void)
+
+/**
+ * Test a specific texture target and format combination.
+ */
+static GLboolean
+test_target_and_format(GLint x, GLint y, GLenum target, GLenum format,
+		       const GLfloat *expected)
 {
-	GLuint tex;
 	GLboolean pass = GL_TRUE;
-	GLenum format;
-	const GLfloat *expected;
-	int i, j, k;
+	GLuint k;
 
-	glClear(GL_COLOR_BUFFER_BIT);
+	if (!piglit_automatic)
+		printf("Texture target = %s, Internal format = %s",
+		       piglit_get_gl_enum_name(target),
+		       piglit_get_gl_enum_name(format));
+
+	if (!supported_format(format) ||
+	    !supported_target_format(target, format)) {
+		if (!piglit_automatic)
+			printf(" - skipped\n");
+		return GL_TRUE; /* not a failure */
+	} else {
+		if (!piglit_automatic)
+			printf("\n");
+	}
 
-	/* Do glCopyPixels and draw a textured rectangle for each format
-	 * and each texture target
+	/* To avoid failures not related to this test case,
+	 * loosen up the tolerence for compressed texture
+	 * formats
 	 */
-	for (j = 0; j < ARRAY_SIZE(target); j++) {
-		if (test_target != -1 && test_target != j)
-			continue;
-		if (!supported_target(j))
-			continue;
-
-		printf("Testing %s\n", piglit_get_gl_enum_name(target[j].target));
-
-		if (target[j].target == GL_TEXTURE_1D_ARRAY) {
-			printf("NOTE: We use glCopyTexSubImage2D to set 4 texture layers at once.\n");
+	if (is_compressed_format(format))
+		piglit_set_tolerance_for_bits(7, 7, 7, 7);
+	else
+		piglit_set_tolerance_for_bits(8, 8, 8, 8);
+
+	switch(target) {
+
+	case GL_TEXTURE_1D:
+		draw(format, 1.0);
+		glCopyTexImage1D(GL_TEXTURE_1D, 0,
+				 format,
+				 0, 0, IMAGE_SIZE, 0);
+		pass = piglit_check_gl_error(GL_NO_ERROR)
+			&& pass;
+
+		glEnable(target);
+		glTexCoordPointer(2, GL_FLOAT, 0, texCoords_2d);
+		piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
+		pass = piglit_probe_rect_rgba(x, y, IMAGE_SIZE,
+					      IMAGE_SIZE,
+					      expected)
+			&& pass;
+		break;
+
+	case GL_TEXTURE_2D:
+		draw(format, 1.0);
+		glCopyTexImage2D(GL_TEXTURE_2D, 0, format, 0, 0,
+				 IMAGE_SIZE, IMAGE_SIZE, 0);
+		pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+		glEnable(target);
+		glTexCoordPointer(2, GL_FLOAT, 0, texCoords_2d);
+
+		piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
+		pass = piglit_probe_rect_rgba(x, y, IMAGE_SIZE,
+					      IMAGE_SIZE,
+					      expected)
+			&& pass;
+		break;
+
+	case GL_TEXTURE_3D:
+		glTexImage3D(GL_TEXTURE_3D, 0, format, IMAGE_SIZE, IMAGE_SIZE, 4,
+			     0, GL_RGBA, GL_FLOAT, NULL);
+
+		for (k = 0; k < 4; k++) {
+			draw(format, 1.0 - k*0.2);
+			glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, k,
+					    0, 0, IMAGE_SIZE, IMAGE_SIZE);
 		}
 
-		/* Texture setup */
-		glGenTextures(1, &tex);
-		glBindTexture(target[j].target, tex);
-		glTexParameteri(target[j].target,
-				GL_TEXTURE_MIN_FILTER,
-				GL_NEAREST);
-		glTexParameteri(target[j].target,
-				GL_TEXTURE_MAG_FILTER,
-				GL_NEAREST);
-		glTexParameteri(target[j].target,
-				GL_GENERATE_MIPMAP,
-				GL_FALSE);
-
-		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+		pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
 
-		for (i = 0; i < ARRAY_SIZE(test_vectors); i++) {
-			GLint x = IMAGE_SIZE * (i + 1);
-			GLint y = 0;
+		glEnable(target);
 
-			format = test_vectors[i].format;
-			expected = (const float*)test_vectors[i].expected;
+		for (k = 0; k < 4; k++) {
+			glTexCoordPointer(3, GL_FLOAT, 0, texCoords_3d[k]);
+			piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
+			pass = probe_rect(x, y, IMAGE_SIZE, IMAGE_SIZE,
+					  expected, 1.0 - k*0.2) && pass;
+		}
+		break;
+
+	case GL_TEXTURE_CUBE_MAP:
+		for (k = 0; k < 6; k++) {
+			draw(format, 1.0 - k*0.15);
+			glCopyTexImage2D(cube_face_targets[k],
+					 0, format, 0, 0,
+					 IMAGE_SIZE, IMAGE_SIZE, 0);
+		}
 
-			if (!piglit_automatic)
-				printf("Texture target = %s, Internal"
-				       " format = %s",
-				       piglit_get_gl_enum_name(target[j].target),
-				       piglit_get_gl_enum_name(format));
-
-			if (!supported_format(format) ||
-			    !supported_target_format(target[j].target, format)) {
-				if (!piglit_automatic)
-					printf(" - skipped\n");
-				continue;
-			} else {
-				if (!piglit_automatic)
-					printf("\n");
-			}
+		pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
 
+		glEnable(target);
 
-			/* To avoid failures not related to this test case,
-			 * loosen up the tolerence for compressed texture
-			 * formats
-			 */
-			if (is_compressed_format(format))
-				piglit_set_tolerance_for_bits(7, 7, 7, 7);
-			else
-				piglit_set_tolerance_for_bits(8, 8, 8, 8);
-
-			switch(target[j].target) {
-
-			case GL_TEXTURE_1D:
-				draw(format, 1.0);
-				glCopyTexImage1D(GL_TEXTURE_1D, 0,
-						 format,
-						 0, 0, IMAGE_SIZE, 0);
-				pass = piglit_check_gl_error(GL_NO_ERROR)
-				       && pass;
-
-				glEnable(target[j].target);
-				glTexCoordPointer(2, GL_FLOAT, 0, texCoords_2d);
-				piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
-				pass = piglit_probe_rect_rgba(x, y, IMAGE_SIZE,
-							      IMAGE_SIZE,
-							      expected)
-				       && pass;
-				break;
+		for (k = 0; k < 6; k++) {
+			glTexCoordPointer(3, GL_FLOAT, 0,
+					  cube_face_texcoords[k]);
+			piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
+			pass = probe_rect(x, y, IMAGE_SIZE, IMAGE_SIZE,
+					  expected, 1.0 - k*0.15) && pass;
+		}
+		break;
 
-			case GL_TEXTURE_2D:
-				draw(format, 1.0);
-				glCopyTexImage2D(GL_TEXTURE_2D, 0, format, 0, 0,
-						 IMAGE_SIZE, IMAGE_SIZE, 0);
-				pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+	case GL_TEXTURE_1D_ARRAY:
+		glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, format, IMAGE_SIZE, 16,
+			     0, get_format(format), GL_FLOAT, NULL);
 
-				glEnable(target[j].target);
-				glTexCoordPointer(2, GL_FLOAT, 0, texCoords_2d);
+		for (k = 0; k < 4; k++) {
+			draw(format, 1.0 - 0.2*k);
+			glCopyTexSubImage2D(GL_TEXTURE_1D_ARRAY, 0, 0, 4*k,
+					    0, 0, IMAGE_SIZE, 4);
+		}
 
-				piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
-				pass = piglit_probe_rect_rgba(x, y, IMAGE_SIZE,
-							      IMAGE_SIZE,
-							      expected)
-				       && pass;
-				break;
+		pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
 
-			case GL_TEXTURE_3D:
-				glTexImage3D(GL_TEXTURE_3D, 0, format, IMAGE_SIZE, IMAGE_SIZE, 4,
-					     0, GL_RGBA, GL_FLOAT, NULL);
+		glEnable(target);
 
-				for (k = 0; k < 4; k++) {
-					draw(format, 1.0 - k*0.2);
-					glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, k,
-							    0, 0, IMAGE_SIZE, IMAGE_SIZE);
-				}
+		for (k = 0; k < 16; k++) {
+			glTexCoordPointer(2, GL_FLOAT, 0, texCoords_1d_array[k]);
+			piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
+			pass = probe_rect(x, y, IMAGE_SIZE, IMAGE_SIZE,
+					  expected, 1.0 - 0.2*(k/4)) && pass;
+		}
+		break;
 
-				pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+	case GL_TEXTURE_2D_ARRAY:
+		glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, format, IMAGE_SIZE, IMAGE_SIZE, 4,
+			     0, get_format(format), GL_FLOAT, NULL);
 
-				glEnable(target[j].target);
+		for (k = 0; k < 4; k++) {
+			draw(format, 1.0 - k*0.2);
+			glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, k,
+					    0, 0, IMAGE_SIZE, IMAGE_SIZE);
+		}
 
-				for (k = 0; k < 4; k++) {
-					glTexCoordPointer(3, GL_FLOAT, 0, texCoords_3d[k]);
-					piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
-					pass = probe_rect(x, y, IMAGE_SIZE, IMAGE_SIZE,
-							  expected, 1.0 - k*0.2) && pass;
-				}
-				break;
+		pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
 
-			case GL_TEXTURE_CUBE_MAP:
-				for (k = 0; k < 6; k++) {
-					draw(format, 1.0 - k*0.15);
-					glCopyTexImage2D(cube_face_targets[k],
-							 0, format, 0, 0,
-							 IMAGE_SIZE, IMAGE_SIZE, 0);
-				}
+		glEnable(target);
 
-				pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+		for (k = 0; k < 4; k++) {
+			glTexCoordPointer(3, GL_FLOAT, 0, texCoords_2d_array[k]);
+			piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
+			pass = probe_rect(x, y, IMAGE_SIZE, IMAGE_SIZE,
+					  expected, 1.0 - k*0.2) && pass;
+		}
+		break;
+
+	case GL_TEXTURE_RECTANGLE:
+		draw(format, 1.0);
+		glCopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, format, 0, 0,
+				 IMAGE_SIZE, IMAGE_SIZE, 0);
+		pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+		
+		glEnable(target);
+		glTexCoordPointer(2, GL_FLOAT, 0, texCoords_rect);
+
+		piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
+		pass = piglit_probe_rect_rgba(x, y, IMAGE_SIZE,
+					      IMAGE_SIZE,
+					      expected)
+			&& pass;
+		break;
+	}
 
-				glEnable(target[j].target);
+	glDisable(target);
 
-				for (k = 0; k < 6; k++) {
-					glTexCoordPointer(3, GL_FLOAT, 0,
-							  cube_face_texcoords[k]);
-					piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
-					pass = probe_rect(x, y, IMAGE_SIZE, IMAGE_SIZE,
-							  expected, 1.0 - k*0.15) && pass;
-				}
-				break;
+	return pass;
+}
 
-			case GL_TEXTURE_1D_ARRAY:
-				glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, format, IMAGE_SIZE, 16,
-					     0, get_format(format), GL_FLOAT, NULL);
 
-				for (k = 0; k < 4; k++) {
-					draw(format, 1.0 - 0.2*k);
-					glCopyTexSubImage2D(GL_TEXTURE_1D_ARRAY, 0, 0, 4*k,
-							    0, 0, IMAGE_SIZE, 4);
-				}
+static GLuint
+create_texture(GLenum target)
+{
+	GLuint tex;
 
-				pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+	glGenTextures(1, &tex);
+	glBindTexture(target, tex);
+	glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(target,	GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexParameteri(target, GL_GENERATE_MIPMAP, GL_FALSE);
 
-				glEnable(target[j].target);
+	return tex;
+}
 
-				for (k = 0; k < 16; k++) {
-					glTexCoordPointer(2, GL_FLOAT, 0, texCoords_1d_array[k]);
-					piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
-					pass = probe_rect(x, y, IMAGE_SIZE, IMAGE_SIZE,
-							  expected, 1.0 - 0.2*(k/4)) && pass;
-				}
-				break;
 
-			case GL_TEXTURE_2D_ARRAY:
-				glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, format, IMAGE_SIZE, IMAGE_SIZE, 4,
-					     0, get_format(format), GL_FLOAT, NULL);
+enum piglit_result
+piglit_display(void)
+{
+	GLuint tex;
+	GLboolean pass = GL_TRUE;
+	const GLfloat *expected;
+	int i, j;
 
-				for (k = 0; k < 4; k++) {
-					draw(format, 1.0 - k*0.2);
-					glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, k,
-							    0, 0, IMAGE_SIZE, IMAGE_SIZE);
-				}
+	glClear(GL_COLOR_BUFFER_BIT);
 
-				pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-				glEnable(target[j].target);
+	/* Do glCopyPixels and draw a textured rectangle for each format
+	 * and each texture target
+	 */
+	for (j = 0; j < ARRAY_SIZE(target); j++) {
+		if (test_target != -1 && test_target != j)
+			continue;
+		if (!supported_target(j))
+			continue;
 
-				for (k = 0; k < 4; k++) {
-					glTexCoordPointer(3, GL_FLOAT, 0, texCoords_2d_array[k]);
-					piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
-					pass = probe_rect(x, y, IMAGE_SIZE, IMAGE_SIZE,
-							  expected, 1.0 - k*0.2) && pass;
-				}
-				break;
+		printf("Testing %s\n", piglit_get_gl_enum_name(target[j].target));
 
-			case GL_TEXTURE_RECTANGLE:
-				draw(format, 1.0);
-				glCopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, format, 0, 0,
-						 IMAGE_SIZE, IMAGE_SIZE, 0);
-				pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+		if (target[j].target == GL_TEXTURE_1D_ARRAY) {
+			printf("NOTE: We use glCopyTexSubImage2D to set 4 texture layers at once.\n");
+		}
 
-				glEnable(target[j].target);
-				glTexCoordPointer(2, GL_FLOAT, 0, texCoords_rect);
+		tex = create_texture(target[j].target);
 
-				piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
-				pass = piglit_probe_rect_rgba(x, y, IMAGE_SIZE,
-							      IMAGE_SIZE,
-							      expected)
-				       && pass;
-				break;
+		for (i = 0; i < ARRAY_SIZE(test_vectors); i++) {
+			GLint x = IMAGE_SIZE * (i + 1);
+			GLint y = 0;
+			expected = (const float*)test_vectors[i].expected;
+
+			if (!test_target_and_format(x, y, target[j].target,
+						    test_vectors[i].format,
+						    expected)) {
+				pass = GL_FALSE;
 			}
-			glDisable(target[j].target);
 		}
-		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
 		glDeleteTextures(1, &tex);
 	}
 	if (!piglit_automatic)
-- 
1.7.3.4



More information about the Piglit mailing list