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

Bartosz Tomczyk bartosz.tomczyk86 at gmail.com
Mon Apr 10 18:35:14 UTC 2017


Yes, I tested with Piglit, there is no regression.


On 10.04.2017 19:16, Brian Paul wrote:
> 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