s3tc-errors: check GL_ARB_compressed_texture_pixel_storage errors

Submitted by Brian Paul on Aug. 15, 2014, 11:04 p.m.

Details

Message ID 1408143867-10007-1-git-send-email-brianp@vmware.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Brian Paul Aug. 15, 2014, 11:04 p.m.
Basic checking that the SKIP_PIXELS, SKIP_ROWS parameters are
multiples of the block size.

And check that if a GL error is generated, the glCompressedTexSubImage2D()
call is no-op'd (to exercise a Mesa bug.)
---
 tests/texturing/s3tc-errors.c |   78 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

Patch hide | download patch | download mbox

diff --git a/tests/texturing/s3tc-errors.c b/tests/texturing/s3tc-errors.c
index 0ed1279..d74d91e 100644
--- a/tests/texturing/s3tc-errors.c
+++ b/tests/texturing/s3tc-errors.c
@@ -504,12 +504,90 @@  test_formats(void)
 }
 
 
+/**
+ * Test GL_ARB_compressed_texture_pixel_storage error checking.
+ * \param return true for pass, false for failure
+ */
+static bool
+test_compressed_pixel_storage(void)
+{
+	const int width = 32, height = 16;
+	const int imageSize = (width / 4) * (height / 4) * 8;
+	const int format = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
+	GLuint tex;
+	GLubyte *buf, *zeros, *ones;
+	bool pass = true;
+
+	if (!piglit_is_extension_supported("GL_ARB_compressed_texture_pixel_storage"))
+		return true;  /* not a failure */
+
+	buf = malloc(imageSize);
+	zeros = calloc(imageSize, 1);
+	ones = malloc(imageSize);
+	memset(ones, 1, imageSize);
+
+	/* Setup initial texture */
+	glGenTextures(1, &tex);
+	glBindTexture(GL_TEXTURE_2D, tex);
+	glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0,
+		     GL_RGBA, GL_UNSIGNED_BYTE, buf);
+
+	pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+	/* Specify the S3TC block size */
+	glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_SIZE, 8);
+	glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_WIDTH, 4);
+	glPixelStorei(GL_UNPACK_COMPRESSED_BLOCK_HEIGHT, 4);
+
+	/* This should work */
+	glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
+				  format, imageSize, zeros);
+	pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+	/* This should fail */
+	glPixelStorei(GL_UNPACK_SKIP_PIXELS, 3); /* illegal */
+	glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
+				  format, imageSize, ones);
+	pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;
+
+	/* This should fail */
+	glPixelStorei(GL_UNPACK_SKIP_PIXELS, 4); /* legal */
+	glPixelStorei(GL_UNPACK_SKIP_ROWS, 2); /* illegal */
+	glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
+				  format, imageSize, ones);
+	pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;
+
+	glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
+	glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
+
+	/* Read back the compressed texture image and make sure it's still
+	 * all zeros (exercises a Mesa bug).
+	 */
+	glGetCompressedTexImage(GL_TEXTURE_2D, 0, buf);
+
+	if (memcmp(buf, zeros, imageSize)) {
+		printf("Failure: Error-generating glCompressedTexSubImage2D()"
+		       " modified the texture!\n");
+		pass = false;
+	}
+
+	glDeleteTextures(1, &tex);
+
+	free(buf);
+	free(zeros);
+	free(ones);
+
+	return pass;
+}
+
+
 enum piglit_result
 piglit_display(void)
 {
 	bool pass = test_formats();
 	pass = test_small_mipmap_level() && pass;
 	pass = test_non_power_of_two() && pass;
+	pass = test_compressed_pixel_storage() && pass;
 
 	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
 }