nvc0: upload user buffers only from draw info min to max index
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Fri, 7 Jan 2011 23:49:17 +0000 (00:49 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 8 Jan 2011 01:13:54 +0000 (02:13 +0100)
There are actually applications that profit immensely from this.

src/gallium/drivers/nvc0/nvc0_context.h
src/gallium/drivers/nvc0/nvc0_vbo.c

index 83aff0a585de15d7596e30eb96759919ebbcc12d..c181f15dbd8a67f3f412ba42b319474a8cf944be 100644 (file)
@@ -101,6 +101,8 @@ struct nvc0_context {
    unsigned num_vtxbufs;
    struct pipe_index_buffer idxbuf;
    uint32_t vbo_fifo;
+   unsigned vbo_min_index; /* from pipe_draw_info, for vertex upload */
+   unsigned vbo_max_index;
 
    struct pipe_sampler_view *textures[5][PIPE_MAX_SAMPLERS];
    unsigned num_textures[5];
index c6a88a75cf97a8665be9e40bd2deba272dc12018..881f0655506a23d5a46bdc7f4355fc8976521bc1 100644 (file)
@@ -161,9 +161,10 @@ nvc0_vertex_arrays_validate(struct nvc0_context *nvc0)
             continue;
          push = nvc0->vbo_push_hint;
          if (!push) {
-            nvc0_migrate_vertices(nvc0_resource(vb->buffer),
-                                  vb->buffer_offset,
-                                  vb->buffer->width0 - vb->buffer_offset);
+            unsigned base, size;
+            base = vb->buffer_offset + nvc0->vbo_min_index * vb->stride;
+            size = (nvc0->vbo_max_index - nvc0->vbo_min_index + 1) * vb->stride;
+            nvc0_migrate_vertices(nvc0_resource(vb->buffer), base, size);
             nvc0->vbo_dirty = TRUE;
          } else
             continue;
@@ -536,6 +537,9 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
       !(info->indexed &&
         ((info->max_index - info->min_index + 64) < info->count));
 
+   nvc0->vbo_min_index = info->min_index;
+   nvc0->vbo_max_index = info->max_index;
+
    nvc0_state_validate(nvc0);
 
    if (nvc0->state.instance_base != info->start_instance) {