mesa: use single memcpy when strides match in glReadPixels, texstore code

v2: fix indentation

Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Bartosz Tomczyk 2017-04-10 12:31:00 -06:00 committed by Brian Paul
parent da2ac19511
commit a4019a81ab
2 changed files with 21 additions and 9 deletions

View file

@ -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);

View file

@ -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);