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(+)

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;
 }
-- 
1.7.10.4

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to