[Piglit] [PATCH piglit 2/3] texsubimage: Render all of the images of a 3D texture

Neil Roberts neil at linux.intel.com
Wed Dec 17 09:45:13 PST 2014


Previously when testing a 3D texture the test would just draw a single
image with the width and height of the texture and the z coordinates
set to span across the depth. This wouldn't end up drawing all of the
texels in the texture so instead it will now render all of the images
in a vertical line. In order to do this the test needs a taller window
than the default 160 pixels.
---
 tests/texturing/texsubimage.c | 35 ++++++++++++++++++++++++++++-------
 1 file changed, 28 insertions(+), 7 deletions(-)

diff --git a/tests/texturing/texsubimage.c b/tests/texturing/texsubimage.c
index 0388da6..e091fd1 100644
--- a/tests/texturing/texsubimage.c
+++ b/tests/texturing/texsubimage.c
@@ -41,6 +41,9 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
 
 	config.window_visual = PIGLIT_GL_VISUAL_RGBA | PIGLIT_GL_VISUAL_DOUBLE;
 
+	config.window_width = 512;
+	config.window_height = 512;
+
 PIGLIT_GL_TEST_CONFIG_END
 
 /**
@@ -141,9 +144,9 @@ piglit_draw_rect_tex3d(float x, float y, float w, float h,
 
 static GLboolean
 equal_images(const GLubyte *img1, const GLubyte *img2,
-             GLuint w, GLuint h)
+             GLuint w, GLuint h, GLuint d)
 {
-	return memcmp(img1, img2, w*h*4) == 0;
+	return memcmp(img1, img2, w*h*d*4) == 0;
 }
 
 
@@ -190,6 +193,26 @@ get_format_block_size(GLenum format, GLuint *bw, GLuint *bh)
 	}
 }
 
+/**
+ * Draw each image of the texture to the framebuffer and then save the
+ * entire thing to a buffer with glReadPixels().
+ */
+static void
+draw_and_read_texture(GLuint w, GLuint h, GLuint d, GLubyte *ref)
+{
+	int i;
+
+	for (i = 0; i < d; i++) {
+		float tz = (i + 0.5f) / d;
+		piglit_draw_rect_tex3d(0, i * h, /* x/y */
+				       w, h,
+				       0.0, 0.0, /* tx/ty */
+				       1.0, 1.0, /* tw/th */
+				       tz, tz /* tz0/tz1 */);
+	}
+
+	glReadPixels(0, 0, w, h * d, GL_RGBA, GL_UNSIGNED_BYTE, ref);
+}
 
 /**
  * Create a texture image with reference values.  Draw a textured quad.
@@ -267,8 +290,7 @@ test_format(GLenum target, GLenum intFormat)
 
 	/* draw reference image */
 	glClear(GL_COLOR_BUFFER_BIT);
-	piglit_draw_rect_tex3d(0, 0, w, h, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0);
-	glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, ref);
+	draw_and_read_texture(w, h, d, ref);
 
 	for (t = 0; t < 10; t++) {
 		/* Choose random region of texture to update.
@@ -305,12 +327,11 @@ test_format(GLenum target, GLenum intFormat)
 
 		/* draw test image */
 		glClear(GL_COLOR_BUFFER_BIT);
-		piglit_draw_rect_tex3d(0, 0, w, h, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0);
-		glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, testImg);
+		draw_and_read_texture(w, h, d, testImg);
 
 		piglit_present_results();
 
-		if (!equal_images(ref, testImg, w, h)) {
+		if (!equal_images(ref, testImg, w, h, d)) {
 			printf("texsubimage failed\n");
 			printf("  target: %s\n", piglit_get_gl_enum_name(target));
 			printf("  internal format: %s\n", piglit_get_gl_enum_name(intFormat));
-- 
1.9.3



More information about the Piglit mailing list