tnl: Only map the necessary buffer range in bind_indices
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 22 Aug 2011 07:31:19 +0000 (00:31 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 23 Aug 2011 21:52:12 +0000 (14:52 -0700)
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Acked-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/tnl/t_draw.c

index a23d17543910266845a236d04c094cd834b71a11..86af4b7cfe25232093eca6b5b04abe4891427016 100644 (file)
@@ -347,16 +347,32 @@ static void bind_indices( struct gl_context *ctx,
    }
 
    if (ib->obj->Name && !ib->obj->Pointer) {
+      unsigned map_size;
+
+      switch (ib->type) {
+      case GL_UNSIGNED_BYTE:
+        map_size = ib->count * sizeof(GLubyte);
+        break;
+      case GL_UNSIGNED_SHORT:
+        map_size = ib->count * sizeof(GLushort);
+        break;
+      case GL_UNSIGNED_INT:
+        map_size = ib->count * sizeof(GLuint);
+        break;
+      default:
+        assert(0);
+        map_size = 0;
+      }
+
       bo[*nr_bo] = ib->obj;
       (*nr_bo)++;
-      ctx->Driver.MapBufferRange(ctx, 0, ib->obj->Size, GL_MAP_READ_BIT,
-                                ib->obj);
-
+      ptr = ctx->Driver.MapBufferRange(ctx, (GLsizeiptr) ib->ptr, map_size,
+                                      GL_MAP_READ_BIT, ib->obj);
       assert(ib->obj->Pointer);
+   } else {
+      ptr = ib->ptr;
    }
 
-   ptr = ADD_POINTERS(ib->obj->Pointer, ib->ptr);
-
    if (ib->type == GL_UNSIGNED_INT && VB->Primitive[0].basevertex == 0) {
       VB->Elts = (GLuint *) ptr;
    }