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

Brian Paul brianp at vmware.com
Mon Apr 10 18:44:09 UTC 2017


On 04/10/2017 12:35 PM, Bartosz Tomczyk wrote:
> Yes, I tested with Piglit, there is no regression.
>

Do you need me to push this for you?

-Brian

>
> 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