From 335facb502199353e6f73c8ba20a2bb4ff7bf336 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 26 Feb 2012 18:56:51 +0100 Subject: [PATCH] gallium/util: add fast path for buffers in u_default_transfer_inline_write v2: fix indentation, add assertions --- src/gallium/auxiliary/util/u_transfer.c | 37 +++++++++++++++---------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/gallium/auxiliary/util/u_transfer.c b/src/gallium/auxiliary/util/u_transfer.c index 1fa8d945982..673a984fcb2 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,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: -- 2.30.2