[Mesa-dev] [PATCH 1/3] mesa: Fix handling of glCopyBufferSubData() for src == dst.
Ian Romanick
idr at freedesktop.org
Thu Jan 26 13:58:43 PST 2012
On 01/25/2012 05:51 PM, Eric Anholt wrote:
> Fixes piglit ARB_copy_buffer-overlap, which previously assertion failed.
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
One other orthogonal question below...
> ---
> 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.
So we have a test for the assertion in this comment? That's the only
case that concerns me in this code.
> @@ -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);
> }
>
>
More information about the mesa-dev
mailing list