The problem here is that the _mesa_meta_BlitFramebuffer is not setting G/B channels to 0.0 when doing Luminance/Intensity to RGBA conversions, so why not implement the fix in _mesa_meta_BlitFramebuffer directly? The GL spec expects frambuffer blits to handle these conversions properly, so it looks like a win for all uses of that function.
Iago On Fri, 2015-07-17 at 10:28 -0700, Anuj Phogat wrote: > After recent addition of pbo testing in piglit test getteximage-luminance, > it fails on i965. This patch makes a sub test pass. > > This patch adds a clear color operation to meta pbo path, which I think is > better than falling back to software path. > > V2: Fix color mask for GL_LUMINANCE_ALPHA > > Signed-off-by: Anuj Phogat <anuj.pho...@gmail.com> > Cc: <mesa-sta...@lists.freedesktop.org> > --- > src/mesa/drivers/common/meta_tex_subimage.c | 36 > +++++++++++++++++++++++++++-- > 1 file changed, 34 insertions(+), 2 deletions(-) > > diff --git a/src/mesa/drivers/common/meta_tex_subimage.c > b/src/mesa/drivers/common/meta_tex_subimage.c > index 13f8292..f4d5ac3 100644 > --- a/src/mesa/drivers/common/meta_tex_subimage.c > +++ b/src/mesa/drivers/common/meta_tex_subimage.c > @@ -28,6 +28,7 @@ > #include "blend.h" > #include "bufferobj.h" > #include "buffers.h" > +#include "clear.h" > #include "fbobject.h" > #include "glformats.h" > #include "glheader.h" > @@ -278,8 +279,9 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, > GLuint dims, > int full_height, image_height; > struct gl_texture_image *pbo_tex_image; > struct gl_renderbuffer *rb = NULL; > - GLenum status; > - bool success = false; > + GLenum status, src_base_format; > + bool success = false, clear_channels_to_zero = false; > + float save_clear_color[4]; > int z; > > if (!_mesa_is_bufferobj(packing->BufferObj)) > @@ -380,6 +382,27 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, > GLuint dims, > GL_COLOR_BUFFER_BIT, GL_NEAREST)) > goto fail; > > + src_base_format = tex_image ? > + tex_image->_BaseFormat : > + ctx->ReadBuffer->_ColorReadBuffer->_BaseFormat; > + > + /* Depending on the base formats involved we might need to rebase some > + * values. For example if we download from a Luminance format to RGBA > + * format, we want G=0 and B=0. > + */ > + clear_channels_to_zero = > + _mesa_need_luminance_to_rgb_conversion(src_base_format, > + pbo_tex_image->_BaseFormat); > + > + if (clear_channels_to_zero) { > + memcpy(save_clear_color, ctx->Color.ClearColor.f, 4 * sizeof(float)); > + /* Clear the Green, Blue channels. */ > + _mesa_ColorMask(GL_FALSE, GL_TRUE, GL_TRUE, > + src_base_format != GL_LUMINANCE_ALPHA); > + _mesa_ClearColor(0.0, 0.0, 0.0, 1.0); > + _mesa_Clear(GL_COLOR_BUFFER_BIT); > + } > + > for (z = 1; z < depth; z++) { > _mesa_meta_bind_fbo_image(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, > tex_image, zoffset + z); > @@ -392,6 +415,15 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, > GLuint dims, > 0, z * image_height, > width, z * image_height + height, > GL_COLOR_BUFFER_BIT, GL_NEAREST); > + if (clear_channels_to_zero) > + _mesa_Clear(GL_COLOR_BUFFER_BIT); > + } > + > + /* Unmask the color channels and restore the saved clear color values. */ > + if (clear_channels_to_zero) { > + _mesa_ColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); > + _mesa_ClearColor(save_clear_color[0], save_clear_color[1], > + save_clear_color[2], save_clear_color[3]); > } > > success = true; _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev