diff options
author | marha <marha@users.sourceforge.net> | 2012-01-28 15:21:45 +0100 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2012-01-28 15:21:45 +0100 |
commit | 59bda88ffb9deb72a727e7d6b4c141fd7d4678f4 (patch) | |
tree | a797879cc0fe54172dba50354b635b1f595081db /mesalib/src/mesa/main/bufferobj.c | |
parent | 829194c926fa1e3bd45e4fe740e0bc42efe6ace6 (diff) | |
parent | 1aee8dafb5391e093f3a111f906ab0d8b6775510 (diff) | |
download | vcxsrv-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.c | 27 |
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); } |