gallium/util: add fast path for buffers in u_default_transfer_inline_write
authorMarek Olšák <maraeo@gmail.com>
Sun, 26 Feb 2012 17:56:51 +0000 (18:56 +0100)
committerMarek Olšák <maraeo@gmail.com>
Mon, 27 Feb 2012 15:22:26 +0000 (16:22 +0100)
v2: fix indentation, add assertions

src/gallium/auxiliary/util/u_transfer.c

index 1fa8d945982d7e37d047f3bd87fc421c60371fbb..673a984fcb2689fa206bbccfa8eab9721915fb31 100644 (file)
@@ -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,29 @@ 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) {
+      assert(box->height == 1);
+      assert(box->depth == 1);
+
+      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: