From: Marek Olšák Date: Sun, 26 Feb 2012 17:56:51 +0000 (+0100) Subject: gallium/util: add fast path for buffers in u_default_transfer_inline_write X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=335facb502199353e6f73c8ba20a2bb4ff7bf336;p=mesa.git gallium/util: add fast path for buffers in u_default_transfer_inline_write v2: fix indentation, add assertions --- 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: