[Mesa-dev] [PATCH] mesa: fix format checking when doing a multisample resolve

Brian Paul brianp at vmware.com
Mon Jul 23 06:42:25 PDT 2012


On 07/21/2012 03:30 PM, Marek Olšák wrote:
> v2: make it more bullet-proof
> ---
>   src/mesa/main/fbobject.c |  112 +++++++++++++++++++++++++++++++++++++++++++++-
>   1 file changed, 111 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
> index 4370c72..ca43f81 100644
> --- a/src/mesa/main/fbobject.c
> +++ b/src/mesa/main/fbobject.c
> @@ -2633,6 +2633,116 @@ compatible_color_datatypes(gl_format srcFormat, gl_format dstFormat)
>
>
>   /**
> + * Return the equivalent non-generic internal format.
> + * This is useful for comparing whether two internal formats are semantically
> + * equivalent.
> + */
> +static GLenum
> +get_nongeneric_internalformat(GLenum format)
> +{
> +   switch (format) {
> +      /* GL 1.1 formats. */
> +      case 4:
> +      case GL_RGBA:
> +         return GL_RGBA8;
> +
> +      case 3:
> +      case GL_RGB:
> +         return GL_RGB8;
> +
> +      case 2:
> +      case GL_LUMINANCE_ALPHA:
> +         return GL_LUMINANCE8_ALPHA8;
> +
> +      case 1:
> +      case GL_LUMINANCE:
> +         return GL_LUMINANCE8;
> +
> +      case GL_ALPHA:
> +         return GL_ALPHA8;
> +
> +      case GL_INTENSITY:
> +         return GL_INTENSITY8;
> +
> +      /* GL_ARB_texture_rg */
> +      case GL_RED:
> +         return GL_R8;
> +
> +      case GL_RG:
> +         return GL_RG8;
> +
> +      /* GL_EXT_texture_sRGB */
> +      case GL_SRGB:
> +         return GL_SRGB8;
> +
> +      case GL_SRGB_ALPHA:
> +         return GL_SRGB8_ALPHA8;
> +
> +      case GL_SLUMINANCE:
> +         return GL_SLUMINANCE8;
> +
> +      case GL_SLUMINANCE_ALPHA:
> +         return GL_SLUMINANCE8_ALPHA8;
> +
> +      /* GL_EXT_texture_snorm */
> +      case GL_RGBA_SNORM:
> +         return GL_RGBA8_SNORM;
> +
> +      case GL_RGB_SNORM:
> +         return GL_RGB8_SNORM;
> +
> +      case GL_RG_SNORM:
> +         return GL_RG8_SNORM;
> +
> +      case GL_RED_SNORM:
> +         return GL_R8_SNORM;
> +
> +      case GL_LUMINANCE_ALPHA_SNORM:
> +         return GL_LUMINANCE8_ALPHA8_SNORM;
> +
> +      case GL_LUMINANCE_SNORM:
> +         return GL_LUMINANCE8_SNORM;
> +
> +      case GL_ALPHA_SNORM:
> +         return GL_ALPHA8_SNORM;
> +
> +      case GL_INTENSITY_SNORM:
> +         return GL_INTENSITY8_SNORM;
> +
> +      default:
> +         return format;
> +   }
> +}
> +
> +
> +static GLboolean
> +compatible_resolve_formats(const struct gl_renderbuffer *colorReadRb,
> +                           const struct gl_renderbuffer *colorDrawRb)
> +{
> +   /* The simple case where we know the backing formats are the same.
> +    */
> +   if (colorReadRb->Format == colorDrawRb->Format) {
> +      return GL_TRUE;
> +   }
> +
> +   /* The Mesa formats are different, so we must check whether the internal
> +    * formats are compatible.
> +    *
> +    * Under some circumstances, the user may request e.g. two GL_RGBA8
> +    * textures and get two entirely different Mesa formats like RGBA8888 and
> +    * ARGB8888. Drivers behaving like that should be able to cope with
> +    * non-matching formats by themselves, because it's not the user's fault.
> +    */
> +   if (get_nongeneric_internalformat(colorReadRb->InternalFormat) ==
> +       get_nongeneric_internalformat(colorDrawRb->InternalFormat)) {
> +      return GL_TRUE;
> +   }
> +
> +   return GL_FALSE;
> +}
> +
> +
> +/**
>    * Blit rectangular region, optionally from one framebuffer to another.
>    *
>    * Note, if the src buffer is multisampled and the dest is not, this is
> @@ -2798,7 +2908,7 @@ _mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>         /* color formats must match */
>         if (colorReadRb&&
>             colorDrawRb&&
> -          colorReadRb->Format != colorDrawRb->Format) {
> +          !compatible_resolve_formats(colorReadRb, colorDrawRb)) {
>            _mesa_error(ctx, GL_INVALID_OPERATION,
>                   "glBlitFramebufferEXT(bad src/dst multisample pixel formats)");
>            return;


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



More information about the mesa-dev mailing list