[Piglit] [PATCH] copyteximage: Don't use fixed-function for array textures

Ian Romanick idr at freedesktop.org
Wed Nov 27 13:36:13 PST 2013


From: Ian Romanick <ian.d.romanick at intel.com>

GL_EXT_texture_array does not add support for array textures with fixed
function.  The only reason this ever worked with Mesa is because Mesa
also supported GL_MESA_texture_array... which does add support for array
textures with fixed function.

For the GL_TEXTURE_1D_ARRAY and GL_TEXTURE_2D_ARRAY cases, the test now
uses a fragment shader that interacts with fixed-function vertex
processing.

I can't see how the GL_TEXTURE_1D_ARRAY or GL_TEXTURE_2D_ARRAY cases
could have ever worked on any implementation other than Mesa.  There are
currently patches on the mesa-dev list that remove support for
GL_MESA_texture_array, and these patches cause the unpatched version of
this test to fail.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 tests/texturing/copyteximage.c | 46 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 43 insertions(+), 3 deletions(-)

diff --git a/tests/texturing/copyteximage.c b/tests/texturing/copyteximage.c
index 8cd6d7e..0afcba5 100644
--- a/tests/texturing/copyteximage.c
+++ b/tests/texturing/copyteximage.c
@@ -120,6 +120,25 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
 
 PIGLIT_GL_TEST_CONFIG_END
 
+static const char array1D_shader_text[] =
+	"#extension GL_EXT_texture_array: require\n"
+	"uniform sampler1DArray s;\n"
+	"void main()\n"
+	"{\n"
+	"    gl_FragColor = texture1DArray(s, gl_TexCoord[0].xy);\n"
+	"}\n"
+	;
+
+static const char array2D_shader_text[] =
+	"#extension GL_EXT_texture_array: require\n"
+	"uniform sampler2DArray s;\n"
+	"void main()\n"
+	"{\n"
+	"    gl_FragColor = texture2DArray(s, gl_TexCoord[0].xyz);\n"
+	"}\n"
+	;
+
+
 static GLboolean
 is_compressed_format(GLenum format)
 {
@@ -188,6 +207,14 @@ supported_target_format(GLenum target, GLenum format)
 static bool
 supported_target(unsigned i)
 {
+	/* Array targets are only supported if GLSL is available.
+	 */
+	if ((target[i].target == GL_TEXTURE_1D_ARRAY
+	     || target[i].target == GL_TEXTURE_2D_ARRAY)
+	    && (piglit_get_gl_version() < 20
+		&& !piglit_is_extension_supported("GL_ARB_fragment_shader")))
+		return false;
+
 	return piglit_get_gl_version() >= target[i].gl_version ||
 		(target[i].extension &&
 		 piglit_is_extension_supported(target[i].extension));
@@ -364,6 +391,7 @@ test_target_and_format(GLint x, GLint y, GLenum target, GLenum format,
 {
 	GLboolean pass = GL_TRUE;
 	GLuint k;
+	GLuint prog = 0;
 
 	printf("Texture target = %s, Internal format = %s",
 	       piglit_get_gl_enum_name(target),
@@ -474,7 +502,9 @@ test_target_and_format(GLint x, GLint y, GLenum target, GLenum format,
 
 		pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
 
-		glEnable(target);
+		prog = piglit_build_simple_program(NULL, array1D_shader_text);
+		glUseProgram(prog);
+		glDeleteProgram(prog);
 
 		for (k = 0; k < 16; k++) {
 			piglit_draw_rect_tex(x, y, IMAGE_SIZE, IMAGE_SIZE,
@@ -496,7 +526,9 @@ test_target_and_format(GLint x, GLint y, GLenum target, GLenum format,
 
 		pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
 
-		glEnable(target);
+		prog = piglit_build_simple_program(NULL, array2D_shader_text);
+		glUseProgram(prog);
+		glDeleteProgram(prog);
 
 		for (k = 0; k < 4; k++) {
 			draw_rect_tex_3d(x, y, IMAGE_SIZE, IMAGE_SIZE,
@@ -522,7 +554,15 @@ test_target_and_format(GLint x, GLint y, GLenum target, GLenum format,
 		break;
 	}
 
-	glDisable(target);
+	/* If a GLSL program is in use, then the preceeding code should not
+	 * have called glEnable(target).  In that case, this code should not
+	 * disable it.  For some targets, like GL_TEXTURE_1D_ARRAY,
+	 * glDisable(target) will generate an error.
+	 */
+	if (prog == 0)
+		glDisable(target);
+	else
+		glUseProgram(0);
 
 	return pass;
 }
-- 
1.8.1.4



More information about the Piglit mailing list