mesa: only map src/dest regions in _mesa_copy_buffer_subdata()
authorBrian Paul <brianp@vmware.com>
Wed, 4 Jan 2012 21:53:55 +0000 (14:53 -0700)
committerBrian Paul <brianp@vmware.com>
Thu, 5 Jan 2012 15:14:32 +0000 (08:14 -0700)
We were wastefully mapping the whole source/dest buffers before.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
src/mesa/main/bufferobj.c

index 66957e46d881c300631bd0ba8e2654b2367056ef..462519895a4b94304aeb7dee21c48dab584eb1df 100644 (file)
@@ -502,19 +502,20 @@ _mesa_copy_buffer_subdata(struct gl_context *ctx,
                           GLintptr readOffset, GLintptr writeOffset,
                           GLsizeiptr size)
 {
-   GLubyte *srcPtr, *dstPtr;
+   void *srcPtr, *dstPtr;
 
    /* buffer should not already be mapped */
    assert(!_mesa_bufferobj_mapped(src));
    assert(!_mesa_bufferobj_mapped(dst));
 
-   srcPtr = (GLubyte *) ctx->Driver.MapBufferRange(ctx, 0, src->Size,
-                                                  GL_MAP_READ_BIT, src);
-   dstPtr = (GLubyte *) ctx->Driver.MapBufferRange(ctx, 0, dst->Size,
-                                                  GL_MAP_WRITE_BIT, 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 (srcPtr && dstPtr)
-      memcpy(dstPtr + writeOffset, srcPtr + readOffset, size);
+      memcpy(dstPtr, srcPtr, size);
 
    ctx->Driver.UnmapBuffer(ctx, src);
    ctx->Driver.UnmapBuffer(ctx, dst);