Mesa (master): gallium/svga: Only upload parts of vertexarrays that are actually used

Thomas Hellstrom thomash at kemper.freedesktop.org
Thu Mar 10 13:31:52 UTC 2011


Module: Mesa
Branch: master
Commit: 6d4e337f3890105c7d8a2f132412c137d2570d25
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6d4e337f3890105c7d8a2f132412c137d2570d25

Author: Thomas Hellstrom <thellstrom at vmware.com>
Date:   Wed Mar  9 12:39:14 2011 +0100

gallium/svga: Only upload parts of vertexarrays that are actually used

Make sure we only upload parts of vertex arrays that are actually used
by a draw command.

Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>

---

 src/gallium/drivers/svga/svga_draw_arrays.c        |   19 +++++++++++++++++++
 src/gallium/drivers/svga/svga_draw_elements.c      |   16 ++++++++++++++++
 src/gallium/drivers/svga/svga_resource_buffer.h    |    6 ++++++
 .../drivers/svga/svga_resource_buffer_upload.c     |    1 +
 src/gallium/drivers/svga/svga_state_vdecl.c        |    9 ++++++---
 5 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/svga/svga_draw_arrays.c b/src/gallium/drivers/svga/svga_draw_arrays.c
index a651804..1bb29cc 100644
--- a/src/gallium/drivers/svga/svga_draw_arrays.c
+++ b/src/gallium/drivers/svga/svga_draw_arrays.c
@@ -32,6 +32,7 @@
 #include "svga_draw.h"
 #include "svga_draw_private.h"
 #include "svga_context.h"
+#include "svga_resource_buffer.h"
 
 
 #define DBG 0
@@ -191,6 +192,8 @@ simple_draw_arrays( struct svga_hwtnl *hwtnl,
    SVGA3dPrimitiveRange range;
    unsigned hw_prim;
    unsigned hw_count;
+   unsigned i;
+   unsigned src_offs;
 
    hw_prim = svga_translate_prim(prim, count, &hw_count);
    if (hw_count == 0)
@@ -209,6 +212,22 @@ simple_draw_arrays( struct svga_hwtnl *hwtnl,
     * looking at those numbers knows to adjust them by
     * range.indexBias.
     */
+
+   for (i = 0; i < hwtnl->cmd.vdecl_count; i++) {
+      struct pipe_resource *vb = hwtnl->cmd.vdecl_vb[i];
+      struct svga_buffer *sbuf = svga_buffer(vb);
+      unsigned stride = hwtnl->cmd.vdecl[i].array.stride;
+      unsigned tmp_src_offs = sbuf->source_offset;
+
+      if (stride)
+         tmp_src_offs /= stride;
+      assert(i == 0 || tmp_src_offs == src_offs);
+      src_offs = tmp_src_offs;
+   }
+
+   range.indexBias = start - src_offs;
+   assert(range.indexBias >= 0);
+
    return svga_hwtnl_prim( hwtnl, &range, 0, count - 1, NULL );
 }
 
diff --git a/src/gallium/drivers/svga/svga_draw_elements.c b/src/gallium/drivers/svga/svga_draw_elements.c
index 7d420c6..cf61144 100644
--- a/src/gallium/drivers/svga/svga_draw_elements.c
+++ b/src/gallium/drivers/svga/svga_draw_elements.c
@@ -113,6 +113,7 @@ svga_hwtnl_simple_draw_range_elements( struct svga_hwtnl *hwtnl,
    unsigned hw_count;
    unsigned index_offset = start * index_size;
    int ret = PIPE_OK;
+   unsigned i, src_offs;
 
    hw_prim = svga_translate_prim(prim, count, &hw_count);
    if (hw_count == 0)
@@ -142,6 +143,21 @@ svga_hwtnl_simple_draw_range_elements( struct svga_hwtnl *hwtnl,
       index_buffer = upload_buffer;
    }
 
+   for (i = 0; i < hwtnl->cmd.vdecl_count; i++) {
+      struct pipe_resource *vb = hwtnl->cmd.vdecl_vb[i];
+      struct svga_buffer *sbuf = svga_buffer(vb);
+      unsigned stride = hwtnl->cmd.vdecl[i].array.stride;
+      unsigned tmp_src_offs = sbuf->source_offset;
+
+      if (stride)
+	 tmp_src_offs /= stride;
+      assert(i == 0 || tmp_src_offs == src_offs);
+      src_offs = tmp_src_offs;
+   }
+
+   index_bias -= src_offs;
+   assert(index_bias >= 0);
+
    range.primType = hw_prim;
    range.primitiveCount = hw_count;
    range.indexArray.offset = index_offset;
diff --git a/src/gallium/drivers/svga/svga_resource_buffer.h b/src/gallium/drivers/svga/svga_resource_buffer.h
index c559f70..31a6fc6 100644
--- a/src/gallium/drivers/svga/svga_resource_buffer.h
+++ b/src/gallium/drivers/svga/svga_resource_buffer.h
@@ -144,6 +144,12 @@ struct svga_buffer
    } uploaded;
 
    /**
+    * The offset in the source user buffer that matches the
+    * uploaded offset
+    */
+   unsigned source_offset;
+
+   /**
     * DMA'ble memory.
     *
     * A piece of GMR memory, with the same size of the buffer. It is created
diff --git a/src/gallium/drivers/svga/svga_resource_buffer_upload.c b/src/gallium/drivers/svga/svga_resource_buffer_upload.c
index b7d5460..6016432 100644
--- a/src/gallium/drivers/svga/svga_resource_buffer_upload.c
+++ b/src/gallium/drivers/svga/svga_resource_buffer_upload.c
@@ -695,6 +695,7 @@ svga_redefine_user_buffer(struct pipe_context *pipe,
       sbuf->key.size.width = sbuf->b.b.width0 = offset + size;
    }
 
+   sbuf->source_offset = offset;
    pipe_mutex_unlock(ss->swc_mutex);
 
    svga->curr.any_user_vertex_buffers = TRUE;
diff --git a/src/gallium/drivers/svga/svga_state_vdecl.c b/src/gallium/drivers/svga/svga_state_vdecl.c
index 2f85f94..5bd51ca 100644
--- a/src/gallium/drivers/svga/svga_state_vdecl.c
+++ b/src/gallium/drivers/svga/svga_state_vdecl.c
@@ -59,8 +59,8 @@ upload_user_buffers( struct svga_context *svga )
          if (!buffer->uploaded.buffer) {
             boolean flushed;
             ret = u_upload_buffer( svga->upload_vb,
-                                   0, 0,
-                                   buffer->b.b.width0,
+                                   0, buffer->source_offset,
+                                   buffer->b.b.width0 - buffer->source_offset,
                                    &buffer->b.b,
                                    &buffer->uploaded.offset,
                                    &buffer->uploaded.buffer,
@@ -69,16 +69,19 @@ upload_user_buffers( struct svga_context *svga )
                return ret;
 
             if (0)
-               debug_printf("%s: %d: orig buf %p upl buf %p ofs %d sz %d\n",
+               debug_printf("%s: %d: orig buf %p upl buf %p ofs %d sofs %d"
+                            " sz %d\n",
                             __FUNCTION__,
                             i,
                             buffer,
                             buffer->uploaded.buffer,
                             buffer->uploaded.offset,
+                            buffer->source_offset,
                             buffer->b.b.width0);
          }
 
          svga->curr.vb[i].buffer_offset = buffer->uploaded.offset;
+         svga_buffer(buffer->uploaded.buffer)->source_offset = buffer->source_offset;
       }
    }
 




More information about the mesa-commit mailing list