On Wed, Jan 25, 2012 at 8:51 PM, Eric Anholt <e...@anholt.net> wrote:
> Fixes piglit ARB_copy_buffer-overlap, which previously assertion failed.
> ---
>  src/mesa/main/bufferobj.c |   25 +++++++++++++++++++------
>  1 files changed, 19 insertions(+), 6 deletions(-)
>
> diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
> index 5b6db78..e4f964f 100644
> --- a/src/mesa/main/bufferobj.c
> +++ b/src/mesa/main/bufferobj.c
> @@ -526,11 +526,23 @@ _mesa_copy_buffer_subdata(struct gl_context *ctx,
>    assert(!_mesa_bufferobj_mapped(src));
>    assert(!_mesa_bufferobj_mapped(dst));
>
> -   srcPtr = ctx->Driver.MapBufferRange(ctx, readOffset, size,
> -                                       GL_MAP_READ_BIT, src);
> -   dstPtr = ctx->Driver.MapBufferRange(ctx, writeOffset, size,
> -                                       (GL_MAP_WRITE_BIT |
> -                                        GL_MAP_INVALIDATE_RANGE_BIT), dst);
> +   if (src == dst) {
> +      srcPtr = dstPtr = ctx->Driver.MapBufferRange(ctx, 0, src->Size,
> +                                                  GL_MAP_READ_BIT |
> +                                                  GL_MAP_WRITE_BIT, src);
> +
> +      if (!srcPtr)
> +        return;
> +
> +      srcPtr += readOffset;
> +      dstPtr += writeOffset;
> +   } else {
> +      srcPtr = ctx->Driver.MapBufferRange(ctx, readOffset, size,
> +                                         GL_MAP_READ_BIT, src);
> +      dstPtr = ctx->Driver.MapBufferRange(ctx, writeOffset, size,
> +                                         (GL_MAP_WRITE_BIT |
> +                                          GL_MAP_INVALIDATE_RANGE_BIT), dst);
> +   }
>
>    /* Note: the src and dst regions will never overlap.  Trying to do so
>     * would generate GL_INVALID_VALUE earlier.
> @@ -539,7 +551,8 @@ _mesa_copy_buffer_subdata(struct gl_context *ctx,
>       memcpy(dstPtr, srcPtr, size);
>
>    ctx->Driver.UnmapBuffer(ctx, src);
> -   ctx->Driver.UnmapBuffer(ctx, dst);
> +   if (dst != src)
> +      ctx->Driver.UnmapBuffer(ctx, dst);
>  }
>

Looks good to me.  Though, when srcbuf==dstbuf it wouldn't be too hard
to compute the union region to avoid mapping the whole buffer.
There's some places in the swrast code where we could do that too for
renderbuffers.

Reviewed-by: Brian Paul <bri...@vmware.com>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to