mesa: Fix handling of glCopyBufferSubData() for src == dst.
Fixes piglit ARB_copy_buffer-overlap, on swrast, which previously assertion failed. Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -526,11 +526,23 @@ _mesa_copy_buffer_subdata(struct gl_context *ctx,
|
||||
assert(!_mesa_bufferobj_mapped(src));
|
||||
assert(!_mesa_bufferobj_mapped(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,6 +551,7 @@ _mesa_copy_buffer_subdata(struct gl_context *ctx,
|
||||
memcpy(dstPtr, srcPtr, size);
|
||||
|
||||
ctx->Driver.UnmapBuffer(ctx, src);
|
||||
if (dst != src)
|
||||
ctx->Driver.UnmapBuffer(ctx, dst);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user