[Piglit] [PATCH 1/7] texsubimage: Refactor single round for fixed region

Topi Pohjolainen topi.pohjolainen at intel.com
Tue Mar 1 10:13:22 UTC 2016


Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
---
 tests/texturing/texsubimage.c | 124 +++++++++++++++++++++++++-----------------
 1 file changed, 74 insertions(+), 50 deletions(-)

diff --git a/tests/texturing/texsubimage.c b/tests/texturing/texsubimage.c
index cc8f6b5..52a4252 100644
--- a/tests/texturing/texsubimage.c
+++ b/tests/texturing/texsubimage.c
@@ -98,6 +98,8 @@ static const struct test_desc texsubimage_test_sets[] = {
 #define DEFAULT_TEX_HEIGHT 64
 #define DEFAULT_TEX_DEPTH 8
 
+static const GLenum srcFormat = GL_RGBA;
+
 /* List of texture targets to test, terminated by GL_NONE */
 static const GLenum *test_targets;
 
@@ -310,6 +312,74 @@ create_texture(GLenum target,
 	return tex;
 }
 
+static bool
+test_region(GLuint pbo, GLenum target, GLenum internal_format,
+	    const unsigned char *original_img,
+	    const unsigned char *original_ref,
+	    const unsigned char *updated_img,
+	    const unsigned char *updated_ref,
+	    unsigned w, unsigned h, unsigned d,
+	    int tx, int ty, int tz, int tw, int th, int td)
+{
+	bool pass = true;
+	GLuint tex;
+	unsigned char *test_img = (unsigned char *)malloc(w * h * d * 4);
+
+	/* Recreate the original texture */
+	tex = create_texture(target, internal_format, w, h, d,
+			     srcFormat, original_img);
+
+	if (use_pbo)
+		glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
+
+	/* replace texture region with data from updated image */
+	glPixelStorei(GL_UNPACK_SKIP_PIXELS, tx);
+	glPixelStorei(GL_UNPACK_SKIP_ROWS, ty);
+	glPixelStorei(GL_UNPACK_SKIP_IMAGES, tz);
+	if (d > 1) {
+		glTexSubImage3D(target, 0, tx, ty, tz, tw, th, td,
+				srcFormat, GL_UNSIGNED_BYTE,
+				use_pbo ? NULL : updated_img);
+	} else if (h > 1) {
+		glTexSubImage2D(target, 0, tx, ty, tw, th,
+				srcFormat, GL_UNSIGNED_BYTE,
+				use_pbo ? NULL : updated_img);
+	} else if (w > 1) {
+		glTexSubImage1D(target, 0, tx, tw,
+				srcFormat, GL_UNSIGNED_BYTE,
+				use_pbo ? NULL : updated_img);
+	} else {
+		assert(!"Unknown image dimensions");
+	}
+
+	if (use_pbo)
+		glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+
+	/* draw test image */
+	glClear(GL_COLOR_BUFFER_BIT);
+	draw_and_read_texture(w, h, d, test_img);
+
+	glDeleteTextures(1, &tex);
+
+	piglit_present_results();
+
+	if (!equal_images(target,
+			  original_ref, updated_ref, test_img,
+			  w, h, d,
+			  tx, ty, tz, tw, th, td)) {
+		printf("texsubimage failed\n");
+		printf("  target: %s\n", piglit_get_gl_enum_name(target));
+		printf("  internal format: %s\n",
+			piglit_get_gl_enum_name(internal_format));
+		printf("  region: %d, %d  %d x %d\n", tx, ty, tw, th);
+		pass = false;
+	}
+
+	free(test_img);
+
+	return pass;
+}
+
 /**
  * Create two textures with different reference values. Draw both of
  * the textures to the framebuffer and save the reference images with
@@ -330,14 +400,12 @@ create_texture(GLenum target,
 static GLboolean
 test_format(GLenum target, GLenum intFormat)
 {
-	const GLenum srcFormat = GL_RGBA;
 	GLuint w = DEFAULT_TEX_WIDTH;
 	GLuint h = DEFAULT_TEX_HEIGHT;
 	GLuint d = DEFAULT_TEX_DEPTH;
 	GLuint tex, i, j, k, n, t;
 	GLubyte *original_img, *original_ref;
 	GLubyte *updated_img, *updated_ref;
-	GLubyte *testImg;
 	GLboolean pass = GL_TRUE;
 	GLuint bw, bh, bb, wMask, hMask, dMask;
 	GLuint pbo = 0;
@@ -360,7 +428,6 @@ test_format(GLenum target, GLenum intFormat)
 	original_ref = (GLubyte *) malloc(w * h * d * 4);
 	updated_img = (GLubyte *) malloc(w * h * d * 4);
 	updated_ref = (GLubyte *) malloc(w * h * d * 4);
-	testImg = (GLubyte *) malloc(w * h * d * 4);
 
 	/* fill source tex images */
 	n = 0;
@@ -424,56 +491,14 @@ test_format(GLenum target, GLenum intFormat)
 		GLint ty = (rand() % (h - th)) & hMask;
 		GLint tz = (rand() % (d - td)) & dMask;
 
-		/* Recreate the original texture */
-		tex = create_texture(target, intFormat, w, h, d,
-				     srcFormat, original_img);
-
 		assert(tx + tw <= w);
 		assert(ty + th <= h);
 		assert(tz + td <= d);
 
-		if (use_pbo)
-			glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
-
-		/* replace texture region with data from updated image */
-		glPixelStorei(GL_UNPACK_SKIP_PIXELS, tx);
-		glPixelStorei(GL_UNPACK_SKIP_ROWS, ty);
-		glPixelStorei(GL_UNPACK_SKIP_IMAGES, tz);
-		if (d > 1) {
-			glTexSubImage3D(target, 0, tx, ty, tz, tw, th, td,
-					srcFormat, GL_UNSIGNED_BYTE,
-					use_pbo ? NULL : updated_img);
-		} else if (h > 1) {
-			glTexSubImage2D(target, 0, tx, ty, tw, th,
-					srcFormat, GL_UNSIGNED_BYTE,
-					use_pbo ? NULL : updated_img);
-		} else if (w > 1) {
-			glTexSubImage1D(target, 0, tx, tw,
-					srcFormat, GL_UNSIGNED_BYTE,
-					use_pbo ? NULL : updated_img);
-		} else {
-			assert(!"Unknown image dimensions");
-		}
-
-		if (use_pbo)
-			glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
-
-		/* draw test image */
-		glClear(GL_COLOR_BUFFER_BIT);
-		draw_and_read_texture(w, h, d, testImg);
-
-		glDeleteTextures(1, &tex);
-
-		piglit_present_results();
-
-		if (!equal_images(target,
-				  original_ref, updated_ref, testImg,
-				  w, h, d,
-				  tx, ty, tz, tw, th, td)) {
-			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));
-			printf("  region: %d, %d  %d x %d\n", tx, ty, tw, th);
+		if (!test_region(pbo, target, intFormat,
+				 original_img, original_ref,
+				 updated_img, updated_ref,
+				 w, h, d, tx, ty, tz, tw, th, td)) {
 			pass = GL_FALSE;
 			break;
 		}
@@ -483,7 +508,6 @@ test_format(GLenum target, GLenum intFormat)
 	free(original_ref);
 	free(updated_img);
 	free(updated_ref);
-	free(testImg);
 	if (use_pbo)
 		glDeleteBuffers(1, &pbo);
 
-- 
2.5.0



More information about the Piglit mailing list