aboutsummaryrefslogtreecommitdiff
path: root/mesalib/src/mesa/main/bufferobj.c
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2012-01-28 15:21:45 +0100
committermarha <marha@users.sourceforge.net>2012-01-28 15:21:45 +0100
commit59bda88ffb9deb72a727e7d6b4c141fd7d4678f4 (patch)
treea797879cc0fe54172dba50354b635b1f595081db /mesalib/src/mesa/main/bufferobj.c
parent829194c926fa1e3bd45e4fe740e0bc42efe6ace6 (diff)
parent1aee8dafb5391e093f3a111f906ab0d8b6775510 (diff)
downloadvcxsrv-59bda88ffb9deb72a727e7d6b4c141fd7d4678f4.tar.gz
vcxsrv-59bda88ffb9deb72a727e7d6b4c141fd7d4678f4.tar.bz2
vcxsrv-59bda88ffb9deb72a727e7d6b4c141fd7d4678f4.zip
Merge remote-tracking branch 'origin/released'
Conflicts: xorg-server/hw/xwin/InitOutput.c xorg-server/hw/xwin/win.h xorg-server/hw/xwin/winclipboardthread.c xorg-server/hw/xwin/winclipboardunicode.c xorg-server/hw/xwin/winclipboardwndproc.c xorg-server/hw/xwin/winclipboardwrappers.c xorg-server/hw/xwin/winengine.c xorg-server/hw/xwin/winkeybd.c xorg-server/hw/xwin/winkeybd.h xorg-server/hw/xwin/winkeynames.h xorg-server/hw/xwin/winmouse.c xorg-server/hw/xwin/winmultiwindowwm.c xorg-server/hw/xwin/winmultiwindowwndproc.c xorg-server/hw/xwin/winprefs.c xorg-server/hw/xwin/winwindow.h xorg-server/hw/xwin/winwndproc.c
Diffstat (limited to 'mesalib/src/mesa/main/bufferobj.c')
-rw-r--r--mesalib/src/mesa/main/bufferobj.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/mesalib/src/mesa/main/bufferobj.c b/mesalib/src/mesa/main/bufferobj.c
index 75f6e9bb6..7238a2d60 100644
--- a/mesalib/src/mesa/main/bufferobj.c
+++ b/mesalib/src/mesa/main/bufferobj.c
@@ -520,17 +520,29 @@ _mesa_copy_buffer_subdata(struct gl_context *ctx,
GLintptr readOffset, GLintptr writeOffset,
GLsizeiptr size)
{
- void *srcPtr, *dstPtr;
+ GLubyte *srcPtr, *dstPtr;
/* the buffers should not be mapped */
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);
}