[Mesa-dev] [PATCH 2/2] gallium/util: add fast path for buffers in u_default_transfer_inline_write

Marek Olšák maraeo at gmail.com
Sun Feb 26 10:17:06 PST 2012


---
 src/gallium/auxiliary/util/u_transfer.c |   34 ++++++++++++++++++------------
 1 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_transfer.c b/src/gallium/auxiliary/util/u_transfer.c
index 1fa8d94..f1c2a09 100644
--- a/src/gallium/auxiliary/util/u_transfer.c
+++ b/src/gallium/auxiliary/util/u_transfer.c
@@ -18,8 +18,6 @@ void u_default_transfer_inline_write( struct pipe_context *pipe,
 {
    struct pipe_transfer *transfer = NULL;
    uint8_t *map = NULL;
-   const uint8_t *src_data = data;
-   unsigned i;
 
    assert(!(usage & PIPE_TRANSFER_READ));
 
@@ -45,18 +43,26 @@ void u_default_transfer_inline_write( struct pipe_context *pipe,
    if (map == NULL)
       goto out;
 
-   for (i = 0; i < box->depth; i++) {
-      util_copy_rect(map,
-                     resource->format,
-                     transfer->stride, /* bytes */
-                     0, 0,
-                     box->width,
-                     box->height,
-                     src_data,
-                     stride,       /* bytes */
-                     0, 0);
-      map += transfer->layer_stride;
-      src_data += layer_stride;
+   if (resource->target == PIPE_BUFFER) {
+         memcpy(map, data, box->width);
+   }
+   else {
+      const uint8_t *src_data = data;
+      unsigned i;
+
+      for (i = 0; i < box->depth; i++) {
+         util_copy_rect(map,
+                        resource->format,
+                        transfer->stride, /* bytes */
+                        0, 0,
+                        box->width,
+                        box->height,
+                        src_data,
+                        stride,       /* bytes */
+                        0, 0);
+         map += transfer->layer_stride;
+         src_data += layer_stride;
+      }
    }
 
 out:
-- 
1.7.5.4



More information about the mesa-dev mailing list