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

Author: Brian Paul <bri...@vmware.com>
Date:   Fri Aug 12 10:44:22 2016 -0600

svga: optimize memcpy() in svga_buffer_update_hw()

When we migrate a buffer from sw/malloc storage to a hardware buffer,
don't memcpy the whole buffer, just copy the part we've written to.

Reviewed-by: Charmaine Lee <charmai...@vmware.com>

---

 src/gallium/drivers/svga/svga_resource_buffer_upload.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/svga/svga_resource_buffer_upload.c 
b/src/gallium/drivers/svga/svga_resource_buffer_upload.c
index e1e65c1..7ecf95c 100644
--- a/src/gallium/drivers/svga/svga_resource_buffer_upload.c
+++ b/src/gallium/drivers/svga/svga_resource_buffer_upload.c
@@ -620,6 +620,7 @@ svga_buffer_update_hw(struct svga_context *svga, struct 
svga_buffer *sbuf)
       enum pipe_error ret;
       boolean retry;
       void *map;
+      unsigned i;
 
       assert(sbuf->swbuf);
       if (!sbuf->swbuf)
@@ -639,7 +640,13 @@ svga_buffer_update_hw(struct svga_context *svga, struct 
svga_buffer *sbuf)
          return PIPE_ERROR;
       }
 
-      memcpy(map, sbuf->swbuf, sbuf->b.b.width0);
+      /* Copy data from malloc'd swbuf to the new hardware buffer */
+      for (i = 0; i < sbuf->map.num_ranges; i++) {
+         unsigned start = sbuf->map.ranges[i].start;
+         unsigned len = sbuf->map.ranges[i].end - start;
+         memcpy((uint8_t *) map + start, (uint8_t *) sbuf->swbuf + start, len);
+      }
+
       svga_buffer_hw_storage_unmap(svga, sbuf);
 
       /* This user/malloc buffer is now indistinguishable from a gpu buffer */

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to