[Mesa-dev] [PATCH] mesa: add missing color buffer datatype check for glBlitFramebuffer()

Ian Romanick idr at freedesktop.org
Mon Jan 9 12:54:02 PST 2012


On 01/06/2012 04:13 PM, Brian Paul wrote:
> ---
>   src/mesa/main/fbobject.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
>   1 files changed, 44 insertions(+), 0 deletions(-)
>
> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
> index ddd70be..6ff09f7 100644
> --- a/src/mesa/main/fbobject.c
> +++ b/src/mesa/main/fbobject.c
> @@ -2579,6 +2579,44 @@ find_attachment(const struct gl_framebuffer *fb,
>   }
>
>
> +/**
> + * Helper function for checking if the datatypes of color buffers are
> + * compatible for glBlitFramebuffer.  From the spec:

Where is this language from?  I was trying to find it, but I can't find 
it in the GL3.0 spec, the EXT_texture_integer spec, the 
EXT_framebuffer_blit spec, or the ARB_framebuffer_object spec.  I did 
find the following on page 277 (page 293 of the PDF) of the OpenGL 3.0 spec:

     Format conversion is not supported for all data types. If the read
     buffer contains floating-point values and any draw buffer does not
     contain floating-point values, or if the read buffer contains
     non-floating-point values and any draw buffer contains
     floating-point values, an INVALID OPERATION error is generated.

Question 2, do we have any tests that check this error?

> + *
> + * "GL_INVALID_OPERATION is generated if mask contains GL_COLOR_BUFFER_BIT
> + *  and any of the following conditions hold:
> + *   - The read buffer contains fixed-point or floating-point values and any
> + *     draw buffer contains neither fixed-point nor floating-point values.
> + *   - The read buffer contains unsigned integer values and any draw buffer
> + *     does not contain unsigned integer values.
> + *   - The read buffer contains signed integer values and any draw buffer
> + *     does not contain signed integer values."
> + */
> +static GLboolean
> +compatible_color_datatypes(gl_format srcFormat, gl_format dstFormat)
> +{
> +   GLenum srcType = _mesa_get_format_datatype(srcFormat);
> +   GLenum dstType = _mesa_get_format_datatype(dstFormat);
> +
> +   if (srcType != GL_INT&&  srcType != GL_UNSIGNED_INT) {
> +      assert(srcType == GL_UNSIGNED_NORMALIZED ||
> +             srcType == GL_SIGNED_NORMALIZED ||
> +             srcType == GL_FLOAT);
> +      /* Boil any of those types down to GL_FLOAT */
> +      srcType = GL_FLOAT;
> +   }
> +
> +   if (dstType != GL_INT&&  dstType != GL_UNSIGNED_INT) {
> +      assert(dstType == GL_UNSIGNED_NORMALIZED ||
> +             dstType == GL_SIGNED_NORMALIZED ||
> +             dstType == GL_FLOAT);
> +      /* Boil any of those types down to GL_FLOAT */
> +      dstType = GL_FLOAT;
> +   }
> +
> +   return srcType == dstType;
> +}
> +
>
>   /**
>    * Blit rectangular region, optionally from one framebuffer to another.
> @@ -2663,6 +2701,12 @@ _mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>   	 colorReadRb = colorDrawRb = NULL;
>   	 mask&= ~GL_COLOR_BUFFER_BIT;
>         }
> +      else if (!compatible_color_datatypes(colorReadRb->Format,
> +                                           colorDrawRb->Format)) {
> +         _mesa_error(ctx, GL_INVALID_OPERATION,
> +                     "glBlitFramebufferEXT(color buffer datatypes mismatch)");
> +         return;
> +      }
>      }
>      else {
>         colorReadRb = colorDrawRb = NULL;



More information about the mesa-dev mailing list