[Mesa-dev] [PATCH] mesa: use single memcpy when strides matches

Brian Paul brianp at vmware.com
Mon Apr 10 17:16:41 UTC 2017


On 04/09/2017 07:58 AM, Bartosz Tomczyk wrote:
> ---
>   src/mesa/main/readpix.c  | 15 ++++++++++-----
>   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 25823230d6..14568de497 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);

Too much indentation there.

Looks OK otherwise.  I assume you tested with Piglit too.

Reviewed-by: Brian Paul <brianp at vmware.com>


> +   } 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 615ba63362..3314e557c0 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);
>



More information about the mesa-dev mailing list