[Piglit] [PATCH 2/2] EXT_texture_integer/api-drawpixels: Make this test for the GL 3.0 behavior.

Brian Paul brianp at vmware.com
Fri Dec 2 06:17:12 PST 2011


On 12/01/2011 09:28 PM, Eric Anholt wrote:
> See the giant comment in the test file for rationale.
> ---
>   tests/spec/ext_texture_integer/api-drawpixels.c |   54 ++++++++++++++++++++++-
>   1 files changed, 52 insertions(+), 2 deletions(-)
>
> diff --git a/tests/spec/ext_texture_integer/api-drawpixels.c b/tests/spec/ext_texture_integer/api-drawpixels.c
> index adf311e..c5ba408 100644
> --- a/tests/spec/ext_texture_integer/api-drawpixels.c
> +++ b/tests/spec/ext_texture_integer/api-drawpixels.c
> @@ -26,6 +26,34 @@
>    * @file api-teximage.c
>    *
>    * Tests GL_EXT_texture_integer's error behavior with glTexImage2D().
> + *
> + * The GL_EXT_texture_integer spec doesn't specify how glDrawPixels
> + * with an integer format is supposed to work.  glDrawPixels generally
> + * generates fragments for a fragment shader with the gl_Color from
> + * the immediate data in the DrawPixels call.  However, with
> + * GL_EXT_texture_integer formats, the immediate data is now integer
> + * despite gl_Color being a floating-point vec4, and the spec for
> + * other cases of possible integer-versus-float conflicts resolves
> + * that the results are undefined.  It doesn't specify any particular
> + * conversion specific to drawpixels.
> + *
> + * In particular, in order for glDrawPixels of integer to be actually
> + * useful to a user, it needs to put integer values into the fragment
> + * shader without conversion, and there's no defined way to map the
> + * DrawPixels input to some user-defined (integer) fragment shader
> + * input.
> + *
> + * The GL 3.0 specification adds the following additional text in
> + * section 3.7.4 ("Rasterization of Pixel Rectangles) on page 151 of
> + * the GL 3.0 specification:
> + *
> + *     "If format contains integer components, as shown in
> + *      table 3.6, an INVALID OPERATION error is generated."
> + *
> + * The NVIDIA driver, which exposes both 3.0 and
> + * GL_EXT_texture_integer, follows this behavior.  Resolve that this
> + * behavior is a correction to the GL_EXT_texture_integer
> + * specification and check that impleentations follow that.
>    */
>
>   #include "piglit-util.h"
> @@ -36,16 +64,38 @@ int piglit_window_mode = GLUT_RGB | GLUT_ALPHA | GLUT_DOUBLE;
>   enum piglit_result
>   piglit_display(void)
>   {
> -	static const float black[4] = {0, 0, 0, 0};
> +	static const int black[4] = {0, 0, 0, 0};
>   	static const float green[4] = {0, 1, 0, 0};
>   	bool pass;
>
> +	/* We don't have to do an integer FBO for this test, because
> +	 * no error is specified in the non-integer FBO case:
> +	 *
> +	 *     "Results of rasterization are undefined if any of the
> +	 *      selected draw buffers of the draw framebuffer have an
> +	 *      integer format and no fragment shader is active.  "
> +	 */
>   	glClearColor(0.0, 1.0, 0.0, 0.0);
>   	glClear(GL_COLOR_BUFFER_BIT);
>
> +	glDrawPixels(1, 1, GL_RGBA_INTEGER_EXT, GL_UNSIGNED_INT, black);
> +	piglit_check_gl_error(GL_INVALID_OPERATION, PIGLIT_FAIL);
> +
> +	/* The text in GL 3.0 specification banning
> +	 * glDrawPixels(integer format) precedes the restriction from
> +	 * GL_EXT_texture_integer which is still included in that
> +	 * section:
> +	 *
> +	 *     "If format is one of the integer component formats as
> +	 *      defined in table 3.6 and type is FLOAT, the error
> +	 *      INVALID ENUM occurs."
> +	 *
> +	 * Based on this, we test for GL_INVALID_OPERATION even for FLOAT.
> +	 */
>   	glDrawPixels(1, 1, GL_RGBA_INTEGER_EXT, GL_FLOAT, black);
> -	piglit_check_gl_error(GL_INVALID_ENUM, PIGLIT_FAIL);
> +	piglit_check_gl_error(GL_INVALID_OPERATION, PIGLIT_FAIL);
>
> +	/* Make sure that we really didn't render anything. */
>   	pass = piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height, green);
>
>   	return pass ? PIGLIT_PASS : PIGLIT_FAIL;


Reviewed-by: Brian Paul <brianp at vmware.com>


More information about the Piglit mailing list