diff options
author | Bartosz Tomczyk <[email protected]> | 2017-04-10 12:31:00 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2017-04-10 14:42:17 -0600 |
commit | a4019a81ab5857bb19dc6251bab6bf386947f6fc (patch) | |
tree | d224ee4be47995d643506560bcfc1235f5bdf7cf | |
parent | da2ac1951110674f58245c0738f05610e80bc2cd (diff) |
mesa: use single memcpy when strides match in glReadPixels, texstore code
v2: fix indentation
Reviewed-by: Brian Paul <[email protected]>
-rw-r--r-- | src/mesa/main/readpix.c | 15 | ||||
-rw-r--r-- | src/mesa/main/texstore.c | 15 |
2 files changed, 21 insertions, 9 deletions
diff --git a/src/mesa/main/readpix.c b/src/mesa/main/readpix.c index 25823230d62..606d1e58e5a 100644 --- a/src/mesa/main/readpix.c +++ b/src/mesa/main/readpix.c @@ -220,7 +220,7 @@ readpixels_memcpy(struct gl_context *ctx, struct gl_renderbuffer *rb = _mesa_get_read_renderbuffer_for_format(ctx, format); GLubyte *dst, *map; - int dstStride, stride, j, texelBytes; + int dstStride, stride, j, texelBytes, bytesPerRow; /* Fail if memcpy cannot be used. */ if (!readpixels_can_use_memcpy(ctx, format, type, packing)) { @@ -239,12 +239,17 @@ readpixels_memcpy(struct gl_context *ctx, } texelBytes = _mesa_get_format_bytes(rb->Format); + bytesPerRow = texelBytes * width; /* memcpy*/ - for (j = 0; j < height; j++) { - memcpy(dst, map, width * texelBytes); - dst += dstStride; - map += stride; + if (dstStride == stride && dstStride == bytesPerRow) { + memcpy(dst, map, bytesPerRow * height); + } else { + for (j = 0; j < height; j++) { + memcpy(dst, map, bytesPerRow); + dst += dstStride; + map += stride; + } } ctx->Driver.UnmapRenderbuffer(ctx, rb); diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c index 615ba63362e..3314e557c0a 100644 --- a/src/mesa/main/texstore.c +++ b/src/mesa/main/texstore.c @@ -1360,10 +1360,17 @@ _mesa_store_compressed_texsubimage(struct gl_context *ctx, GLuint dims, if (dstMap) { /* copy rows of blocks */ - for (i = 0; i < store.CopyRowsPerSlice; i++) { - memcpy(dstMap, src, store.CopyBytesPerRow); - dstMap += dstRowStride; - src += store.TotalBytesPerRow; + if (dstRowStride == store.TotalBytesPerRow && + dstRowStride == store.CopyBytesPerRow) { + memcpy(dstMap, src, store.CopyBytesPerRow * store.CopyRowsPerSlice); + src += store.CopyBytesPerRow * store.CopyRowsPerSlice; + } + else { + for (i = 0; i < store.CopyRowsPerSlice; i++) { + memcpy(dstMap, src, store.CopyBytesPerRow); + dstMap += dstRowStride; + src += store.TotalBytesPerRow; + } } ctx->Driver.UnmapTextureImage(ctx, texImage, slice + zoffset); |