[Mesa-dev] [PATCH] meta: Fix blitting a framebuffer with renderbuffer attachment

Anuj Phogat anuj.phogat at gmail.com
Mon Aug 12 10:27:55 PDT 2013


On Mon, Aug 5, 2013 at 3:00 PM, Anuj Phogat <anuj.phogat at gmail.com> wrote:
>
> This patch fixes a case of framebuffer blitting with renderbuffer
> as color attachment and GL_LINEAR filter. Meta implementation of
> glBlitFrambuffer() converts source color buffer to a texture and
> uses it to do the scaled blitting in to destination buffer. Using
> the exact source rectangle to create the texture does incorrect
> linear filtering along the edges. This patch makes the changes to
> extend the texture edges by one pixel in x, y directions. This
> ensures correct linear filtering.
>
> It fixes failing piglit fbo-linear-blit test. Patch for the testcase
> is on piglit mailing list.
Updated piglit test's name is: fbo-attachments-blit-scaled-linear.
Please take a look if the changes in this patch look good to you.
>
> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> ---
>  src/mesa/drivers/common/meta.c | 25 +++++++++++++++----------
>  1 file changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index c62927c..155c4fa 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -1879,19 +1879,24 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx,
>        const GLenum rb_base_format =
>           _mesa_base_tex_format(ctx, colorReadRb->InternalFormat);
>
> -      newTex = alloc_texture(tex, srcW, srcH, rb_base_format);
> -      setup_copypix_texture(ctx, tex, newTex, srcX, srcY, srcW, srcH,
> +      /* Using  the exact source rectangle to create the texture does incorrect
> +       * linear filtering along the edges. So, allocate the texture extended along
> +       * edges by one pixel in x, y directions.
> +       */
> +      newTex = alloc_texture(tex, srcW + 2, srcH + 2, rb_base_format);
> +      setup_copypix_texture(ctx, tex, newTex,
> +                            srcX - 1, srcY - 1, srcW + 2, srcH + 2,
>                              rb_base_format, filter);
>        /* texcoords (after texture allocation!) */
>        {
> -         verts[0].s = 0.0F;
> -         verts[0].t = 0.0F;
> -         verts[1].s = tex->Sright;
> -         verts[1].t = 0.0F;
> -         verts[2].s = tex->Sright;
> -         verts[2].t = tex->Ttop;
> -         verts[3].s = 0.0F;
> -         verts[3].t = tex->Ttop;
> +         verts[0].s = 1.0F;
> +         verts[0].t = 1.0F;
> +         verts[1].s = tex->Sright - 1.0F;
> +         verts[1].t = 1.0F;
> +         verts[2].s = tex->Sright - 1.0F;
> +         verts[2].t = tex->Ttop - 1.0F;
> +         verts[3].s = 1.0F;
> +         verts[3].t = tex->Ttop - 1.0F;
>
>           /* upload new vertex data */
>           _mesa_BufferSubData(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts);
> --
> 1.8.1.4
>


More information about the mesa-dev mailing list