Luminance/Intensity when converted to RGB should be replicated to fill the RGB channels, but they differ on how the alpha channel is filled, as luminance is set to 1 (unless alpha is supplied) and intensity is replicated into alpha as well.
https://www.khronos.org/opengl/wiki/Image_Format: Legacy Image Formats Warning: This section describes legacy OpenGL APIs that have been removed from core OpenGL 3.1 and above (they are only deprecated in OpenGL 3.0). It is recommended that you not use this functionality in your programs. As with other deprecated functionality, it is advised that you not rely on these features. Luminance and intensity formats are color formats. They are one or two channel formats like RED or RG, but they specify particular behavior. When a GL_RED format is sampled in a shader, the resulting vec4 is (Red, 0, 0, 1). When a GL_INTENSITY format is sampled, the resulting vec4 is (I, I, I, I). The single intensity value is read into all four components. For GL_LUMINANCE, the result is (L, L, L, 1). There is also a two-channel GL_LUMINANCE_ALPHA format, which gives (L, L, L, A). v2: luminance -> xxx1, intensity -> xxxx, luminance_alpha -> xxxw Fixes:5038d839b8e4 ("mesa: use _mesa_format_convert to implement glReadPixels.") Cc: Iago Toral Quiroga <ito...@igalia.com> Cc: Jason Ekstrand <jason.ekstr...@intel.com> --- src/mesa/main/readpix.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/mesa/main/readpix.c b/src/mesa/main/readpix.c index 6ce340ddf9..894b87d826 100644 --- a/src/mesa/main/readpix.c +++ b/src/mesa/main/readpix.c @@ -471,17 +471,23 @@ read_rgba_pixels( struct gl_context *ctx, * Depending on the base formats involved in the conversion we might need to * rebase some values, so for these formats we compute a rebase swizzle. */ - if (rb->_BaseFormat == GL_LUMINANCE || rb->_BaseFormat == GL_INTENSITY) { + if (rb->_BaseFormat == GL_LUMINANCE) { needs_rebase = true; rebase_swizzle[0] = MESA_FORMAT_SWIZZLE_X; - rebase_swizzle[1] = MESA_FORMAT_SWIZZLE_ZERO; - rebase_swizzle[2] = MESA_FORMAT_SWIZZLE_ZERO; + rebase_swizzle[1] = MESA_FORMAT_SWIZZLE_X; + rebase_swizzle[2] = MESA_FORMAT_SWIZZLE_X; rebase_swizzle[3] = MESA_FORMAT_SWIZZLE_ONE; + } else if (rb->_BaseFormat == GL_INTENSITY) { + needs_rebase = true; + rebase_swizzle[0] = MESA_FORMAT_SWIZZLE_X; + rebase_swizzle[1] = MESA_FORMAT_SWIZZLE_X; + rebase_swizzle[2] = MESA_FORMAT_SWIZZLE_X; + rebase_swizzle[3] = MESA_FORMAT_SWIZZLE_X; } else if (rb->_BaseFormat == GL_LUMINANCE_ALPHA) { needs_rebase = true; rebase_swizzle[0] = MESA_FORMAT_SWIZZLE_X; - rebase_swizzle[1] = MESA_FORMAT_SWIZZLE_ZERO; - rebase_swizzle[2] = MESA_FORMAT_SWIZZLE_ZERO; + rebase_swizzle[1] = MESA_FORMAT_SWIZZLE_X; + rebase_swizzle[2] = MESA_FORMAT_SWIZZLE_X; rebase_swizzle[3] = MESA_FORMAT_SWIZZLE_W; } else if (_mesa_get_format_base_format(rb_format) != rb->_BaseFormat) { needs_rebase = -- 2.13.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev