From 2f260edf19a22153ea421f0ece54011502edf392 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 9 Mar 2018 16:46:59 +0100 Subject: [PATCH] cogl: Read pixels as per the stored format By the looks of it, commit 95e9fa10ef was taping over an Intel DRI bug that would make it return post-swizzling pixel data on glReadPixels(). There's been reports over time of that commit resulting in wrong colors on other drivers, and lately Mesa >17.3 started showing the same symptoms on Intel. But texture swizzling works by changing parameters before fragment shaders and reading pixels from an already drawn FBO/texture doesn't involve those. This should thus use pixel_format_to_gl_with_target(), which will result in correctly requesting the same pixel format than the underlying texture, while still considering it BGRA for the upper layers in the swizzling case. https://gitlab.gnome.org/GNOME/mutter/issues/72 Closes: #72 --- cogl/cogl/driver/gl/cogl-framebuffer-gl.c | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c index 8ae631df6..abff84ee0 100644 --- a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c +++ b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c @@ -1412,22 +1412,12 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer, if (!cogl_is_offscreen (framebuffer)) y = framebuffer_height - y - height; - required_format = ctx->driver_vtable->pixel_format_to_gl (ctx, - format, - &gl_intformat, - &gl_format, - &gl_type); -#if HAVE_COGL_GL - /* As we are reading pixels, we want to consider the bitmap according to - * its real pixel format, not the swizzled channels we pretend face to the - * pipeline. - */ - if ((ctx->driver == COGL_DRIVER_GL || ctx->driver == COGL_DRIVER_GL3) && - (format == COGL_PIXEL_FORMAT_BGRA_8888 || - format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) && - _cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE)) - gl_format = GL_BGRA; -#endif + required_format = ctx->driver_vtable->pixel_format_to_gl_with_target (ctx, + framebuffer->internal_format, + format, + &gl_intformat, + &gl_format, + &gl_type); /* NB: All offscreen rendering is done upside down so there is no need * to flip in this case... */