meta: Fix glCopyTexImage(GL_LUMINANCE) from non-GL_LUMINANCE source.
authorEric Anholt <eric@anholt.net>
Wed, 8 Jun 2011 20:00:51 +0000 (13:00 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 13 Jun 2011 22:56:36 +0000 (15:56 -0700)
glReadPixels() was performing RGB -> L conversion differently from the
glTexImage() style conversion appropriate for glCopyTexImage().

Fixes gles2conform copy_texture.

src/mesa/drivers/common/meta.c

index 979926a7e8fc9c8e54babeab00366856b4f421b1..0e58aeca3f558b574330f59ac9b8dca3b33c7001 100644 (file)
@@ -2691,12 +2691,26 @@ copy_tex_image(struct gl_context *ctx, GLuint dims, GLenum target, GLint level,
    GLenum format, type;
    GLint bpp;
    void *buf;
+   struct gl_renderbuffer *read_rb = ctx->ReadBuffer->_ColorReadBuffer;
 
    texObj = _mesa_get_current_tex_object(ctx, target);
    texImage = _mesa_get_tex_image(ctx, texObj, target, level);
 
    /* Choose format/type for temporary image buffer */
    format = _mesa_base_tex_format(ctx, internalFormat);
+
+   if (format == GL_LUMINANCE &&
+       _mesa_get_format_base_format(read_rb->Format) != GL_LUMINANCE) {
+      /* The glReadPixels() path will convert RGB to luminance by
+       * summing R+G+B.  glCopyTexImage() is supposed to behave as
+       * glCopyPixels, which doesn't do that change, and instead
+       * leaves it up to glTexImage which converts RGB to luminance by
+       * just taking the R channel.  To avoid glReadPixels() trashing
+       * our data, use RGBA for our temporary image.
+       */
+      format = GL_RGBA;
+   }
+
    type = get_temp_image_type(ctx, format);
    bpp = _mesa_bytes_per_pixel(format, type);
    if (bpp <= 0) {