[Piglit] [PATCH 2/2] texturing/s3rc-errors: double check GL_TEXTURE parameters and alloc
Ian Romanick
idr at freedesktop.org
Mon Feb 10 18:57:28 PST 2014
On 02/05/2014 10:30 PM, Daniel Kurtz wrote:
> If the GL does not actually support one of the compression
> formats in s3tc_formats, it may silently choose a different actual
> internalformat.
>
> In such a case, the resulting compressed image size may be larger,
> leading to memory corruption when the bigger-than-expected image is read back
> with glGetCompressedTexImage() into a buffer that was allocated to the
> expected, smaller, size.
>
> Instead, first confirm the texture has really been compressed, that the
> format is as expected, and that the size matches our pre-computed expected
> size. If any of these fail, set pass to false and spit an error, but
> keep going, using the actual format and size returned by the GL.
>
> Signed-off-by: Daniel Kurtz <djkurtz at chromium.org>
> ---
> tests/texturing/s3tc-errors.c | 42 ++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 38 insertions(+), 4 deletions(-)
>
> diff --git a/tests/texturing/s3tc-errors.c b/tests/texturing/s3tc-errors.c
> index 710625c..bfe8053 100644
> --- a/tests/texturing/s3tc-errors.c
> +++ b/tests/texturing/s3tc-errors.c
> @@ -125,14 +125,17 @@ check_gl_error2_(GLenum err1, GLenum err2, int line)
>
>
> static bool
> -test_format(int width, int height, GLfloat *image, GLenum format)
> +test_format(int width, int height, GLfloat *image, GLenum requested_format)
> {
> - GLubyte *compressed_image =
> - malloc(piglit_compressed_image_size(format, width, height));
> + GLubyte *compressed_image;
> GLenum format2;
> int x, y, w, h;
> GLuint tex;
> bool pass = true;
> + GLuint expected_size;
> + bool is_compressed;
> + GLuint compressed_size;
> + GLenum format;
>
> glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
> glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
> @@ -143,12 +146,43 @@ test_format(int width, int height, GLfloat *image, GLenum format)
> glBindTexture(GL_TEXTURE_2D, tex);
> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
> - glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0,
> + glTexImage2D(GL_TEXTURE_2D, 0, requested_format, width, height, 0,
> GL_RGBA, GL_FLOAT, image);
>
> pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> pass = check_rendering(width, height) && pass;
>
> + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED,
> + &is_compressed);
> + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT,
> + &format);
> + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
> + GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compressed_size);
> +
> + pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> +
> + if (!is_compressed)
> + printf("Image was not compressed\n");
> + pass = is_compressed && pass;
It's better to do each of these blocks as:
if (!is_compressed) {
printf("Image was not compressed\n");
pass = false;
}
With each of the three cases of that fixed,
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
(One other suggestion below.)
> +
> + if (format != requested_format)
> + printf("Internal Format mismatch. Found: 0x%04x Expected: 0x%04x\n",
> + format, requested_format);
> + pass = (format == requested_format) && pass;
> +
> + expected_size = piglit_compressed_image_size(requested_format, width,
> + height);
> +
> + if (compressed_size != expected_size)
> + printf("Compressed image size mismatch. Found: %u Expected: %u\n",
> + compressed_size, expected_size);
> + pass = (compressed_size == expected_size) && pass;
> +
> + /* Use GL_TEXTURE_COMPRESSED_IMAGE_SIZE even if it wasn't what we
> + * expected to avoid corruption due to under-allocated buffer.
> + */
> + compressed_image = malloc(compressed_size);
> +
If we're going to all this effort, we should probably go all the way. A
follow-on patch should check that glGetCompressedTexImage doesn't
over-run the buffer.
> /* Read back the compressed image data */
> glGetCompressedTexImage(GL_TEXTURE_2D, 0, compressed_image);
>
>
More information about the Piglit
mailing list