[Piglit] [PATCH piglit 1/2] texsubimage: Add tests for array textures

Neil Roberts neil at linux.intel.com
Thu Dec 18 12:49:31 PST 2014


If the 'array' command line option is passed to the texsubimage test
it will now try updating subregions of 1D and 2D array textures. This
requires a shader to render.
---
 tests/all.py                  |   1 +
 tests/texturing/texsubimage.c | 122 +++++++++++++++++++++++++++++++++---------
 2 files changed, 99 insertions(+), 24 deletions(-)

diff --git a/tests/all.py b/tests/all.py
index a3c8628..0175ffc 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -2881,6 +2881,7 @@ add_concurrent_test(ext_texture_array, 'getteximage-targets 2D_ARRAY')
 for test_mode in ['teximage', 'texsubimage']:
     test_name = 'compressed {0}'.format(test_mode)
     ext_texture_array[test_name] = PiglitGLTest(['ext_texture_array-{}'.format(test_name), '-fbo'])
+add_concurrent_test(ext_texture_array, 'texsubimage array')
 
 arb_texture_cube_map = {}
 spec['ARB_texture_cube_map'] = arb_texture_cube_map
diff --git a/tests/texturing/texsubimage.c b/tests/texturing/texsubimage.c
index d2aab25..126dc06 100644
--- a/tests/texturing/texsubimage.c
+++ b/tests/texturing/texsubimage.c
@@ -89,6 +89,30 @@ static const struct test_desc texsubimage_test_sets[] = {
 	}
 };
 
+/* List of texture targets to test, terminated by GL_NONE */
+static const GLenum *test_targets;
+
+static const char fragment_1d_array[] =
+	"#extension GL_EXT_texture_array : require\n"
+	"uniform sampler1DArray tex;\n"
+	"void\n"
+	"main()\n"
+	"{\n"
+	"        float layer = gl_TexCoord[0].t * 64.0 - 0.5;\n"
+	"        gl_FragColor = texture1DArray(tex, vec2(gl_TexCoord[0].s,\n"
+	"                                                layer));\n"
+	"}\n";
+
+static const char fragment_2d_array[] =
+	"#extension GL_EXT_texture_array : require\n"
+	"uniform sampler2DArray tex;\n"
+	"void\n"
+	"main()\n"
+	"{\n"
+	"        float layer = gl_TexCoord[0].p * 8.0 - 0.5;\n"
+	"        gl_FragColor = texture2DArray(tex, vec3(gl_TexCoord[0].st,\n"
+	"                                                layer));\n"
+	"}\n";
 
 /**
  * XXX add this to piglit-util if useful elsewhere.
@@ -159,6 +183,7 @@ equal_images(GLenum target,
 		th = 1;
 		/* flow through */
 	case GL_TEXTURE_2D:
+	case GL_TEXTURE_1D_ARRAY:
 		tz = 0;
 		td = 1;
 		break;
@@ -270,17 +295,19 @@ create_texture(GLenum target,
 	glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
 	glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
 	glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0);
-	if (target == GL_TEXTURE_1D) {
-		glTexImage1D(target, 0, intFormat, w, 0,
+	if (d > 1) {
+		glTexImage3D(target, 0, intFormat, w, h, d, 0,
 			     srcFormat, GL_UNSIGNED_BYTE, img);
 	}
-	else if (target == GL_TEXTURE_2D) {
+	else if (h > 1) {
 		glTexImage2D(target, 0, intFormat, w, h, 0,
 			     srcFormat, GL_UNSIGNED_BYTE, img);
 	}
-	else if (target == GL_TEXTURE_3D) {
-		glTexImage3D(target, 0, intFormat, w, h, d, 0,
+	else if (w > 1) {
+		glTexImage1D(target, 0, intFormat, w, 0,
 			     srcFormat, GL_UNSIGNED_BYTE, img);
+	} else {
+		assert(!"Unknown texture dimensions");
 	}
 
 	return tex;
@@ -319,7 +346,7 @@ test_format(GLenum target, GLenum intFormat)
 	hMask = ~(bh-1);
 	dMask = ~0;
 
-	if (target != GL_TEXTURE_3D)
+	if (target != GL_TEXTURE_3D && target != GL_TEXTURE_2D_ARRAY)
 		d = 1;
 	if (target == GL_TEXTURE_1D)
 		h = 1;
@@ -353,8 +380,6 @@ test_format(GLenum target, GLenum intFormat)
 		}
 	}
 
-	glEnable(target);
-
 	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
 
 
@@ -396,20 +421,20 @@ test_format(GLenum target, GLenum intFormat)
 		glPixelStorei(GL_UNPACK_SKIP_PIXELS, tx);
 		glPixelStorei(GL_UNPACK_SKIP_ROWS, ty);
 		glPixelStorei(GL_UNPACK_SKIP_IMAGES, tz);
-		if (target == GL_TEXTURE_1D) {
-			glTexSubImage1D(target, 0, tx, tw,
+		if (d > 1) {
+			glTexSubImage3D(target, 0, tx, ty, tz, tw, th, td,
 					srcFormat, GL_UNSIGNED_BYTE,
 					updated_img);
-		}
-		else if (target == GL_TEXTURE_2D) {
+		} else if (h > 1) {
 			glTexSubImage2D(target, 0, tx, ty, tw, th,
 					srcFormat, GL_UNSIGNED_BYTE,
 					updated_img);
-		}
-		else if (target == GL_TEXTURE_3D) {
-			glTexSubImage3D(target, 0, tx, ty, tz, tw, th, td,
+		} else if (w > 1) {
+			glTexSubImage1D(target, 0, tx, tw,
 					srcFormat, GL_UNSIGNED_BYTE,
 					updated_img);
+		} else {
+			assert(!"Unknown image dimensions");
 		}
 
 		/* draw test image */
@@ -433,8 +458,6 @@ test_format(GLenum target, GLenum intFormat)
 		}
 	}
 
-	glDisable(target);
-
 	free(original_img);
 	free(original_ref);
 	free(updated_img);
@@ -453,8 +476,29 @@ static GLboolean
 test_formats(GLenum target)
 {
 	GLboolean pass = GL_TRUE;
+	GLuint program = 0;
 	int i, j;
 
+	switch (target) {
+	case GL_TEXTURE_1D_ARRAY:
+		program = piglit_build_simple_program(NULL, fragment_1d_array);
+		break;
+	case GL_TEXTURE_2D_ARRAY:
+		program = piglit_build_simple_program(NULL, fragment_2d_array);
+		break;
+	default:
+		glEnable(target);
+		break;
+	}
+
+	if (program != 0) {
+		GLuint tex_location;
+
+		glUseProgram(program);
+		tex_location = glGetUniformLocation(program, "tex");
+		glUniform1i(tex_location, 0);
+	}
+
 	/* loop over the format groups */
 	for (i = 0; i < ARRAY_SIZE(texsubimage_test_sets); i++) {
 		const struct test_desc *set = &texsubimage_test_sets[i];
@@ -485,6 +529,13 @@ test_formats(GLenum target)
 		}
 	}
 
+	if (program == 0) {
+		glDisable(target);
+	} else {
+		glUseProgram(0);
+		glDeleteProgram(program);
+	}
+
 	return pass;
 }
 
@@ -492,17 +543,12 @@ test_formats(GLenum target)
 enum piglit_result
 piglit_display(void)
 {
-	static const GLenum targets[] = {
-		GL_TEXTURE_1D,
-		GL_TEXTURE_2D,
-		GL_TEXTURE_3D
-	};
 	GLboolean pass = GL_TRUE;
 	int i;
 
 	/* Loop over 1/2/3D texture targets */
-	for (i = 0; i < ARRAY_SIZE(targets); i++) {
-		pass = test_formats(targets[i]) && pass;
+	for (i = 0; test_targets[i] != GL_NONE; i++) {
+		pass = test_formats(test_targets[i]) && pass;
 	}
 
 	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
@@ -512,6 +558,34 @@ piglit_display(void)
 void
 piglit_init(int argc, char **argv)
 {
+	static const GLenum core_targets[] = {
+		GL_TEXTURE_1D,
+		GL_TEXTURE_2D,
+		GL_TEXTURE_3D,
+		GL_NONE
+	};
+	static const GLenum array_targets[] = {
+		GL_TEXTURE_1D_ARRAY_EXT,
+		GL_TEXTURE_2D_ARRAY_EXT,
+		GL_NONE
+	};
+
+	test_targets = core_targets;
+
+	if (argc > 1) {
+		if (!strcmp(argv[1], "array")) {
+			piglit_require_extension("GL_EXT_texture_array");
+			piglit_require_GLSL();
+			test_targets = array_targets;
+		} else {
+			goto handled_targets;
+		}
+
+		argc--;
+		argv++;
+	}
+ handled_targets:
+
 	fbo_formats_init(argc, argv, 0);
 	(void) fbo_formats_display;
 
-- 
1.9.3



More information about the Piglit mailing list