[Mesa-dev] [PATCH 6/7] meta: Drop the src == dst restriction on meta glBlitFramebuffer().

Ian Romanick idr at freedesktop.org
Tue Feb 11 18:26:34 PST 2014


On 02/11/2014 05:11 PM, Eric Anholt wrote:
> From the GL_ARB_fbo spec:
> 
>     If the source and destination buffers are identical, and the
>     source and destination rectangles overlap, the result of the blit
>     operation is undefined.
> 
> As far as I know, that's the only thing that would have been of concern
> for this.

That's the only thing I can think of.  It was Brian's code, so maybe he
remembers something?

OpenGL ES 3.0 says, "If the source and destination buffers are
identical, an INVALID_OPERATION error is generated."  That should be
handled elsewhere, though.

> ---
>  src/mesa/drivers/common/meta.c | 20 --------------------
>  1 file changed, 20 deletions(-)
> 
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index 3c4f706..03811bd 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -1684,7 +1684,6 @@ setup_glsl_blit_framebuffer(struct gl_context *ctx,
>  /**
>   * Try to do a glBlitFramebuffer using no-copy texturing.
>   * We can do this when the src renderbuffer is actually a texture.
> - * But if the src buffer == dst buffer we cannot do this.
>   *
>   * \return new buffer mask indicating the buffers left to blit using the
>   *         normal path.
> @@ -1697,9 +1696,7 @@ blitframebuffer_texture(struct gl_context *ctx,
>                          GLint flipY, GLboolean glsl_version)
>  {
>     if (mask & GL_COLOR_BUFFER_BIT) {
> -      const struct gl_framebuffer *drawFb = ctx->DrawBuffer;
>        const struct gl_framebuffer *readFb = ctx->ReadBuffer;
> -      const struct gl_renderbuffer_attachment *drawAtt;
>        const struct gl_renderbuffer_attachment *readAtt =
>           &readFb->Attachment[readFb->_ColorReadBufferIndex];
>  
> @@ -1717,23 +1714,6 @@ blitframebuffer_texture(struct gl_context *ctx,
>           GLuint sampler, samplerSave =
>              ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler ?
>              ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler->Name : 0;
> -         int i;
> -
> -         /* Iterate through all draw buffers */
> -         for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
> -            int idx = ctx->DrawBuffer->_ColorDrawBufferIndexes[i];
> -            if (idx == -1)
> -               continue;
> -            drawAtt = &drawFb->Attachment[idx];
> -
> -            if (drawAtt->Texture == readAtt->Texture) {
> -               /* Can't use same texture as both the source and dest.  We need
> -                * to handle overlapping blits and besides, some hw may not
> -                * support this.
> -                */
> -               return mask;
> -            }
> -         }
>  
>           if (target != GL_TEXTURE_2D && target != GL_TEXTURE_RECTANGLE_ARB) {
>              /* Can't handle other texture types at this time */
> 



More information about the mesa-dev mailing list