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

Bartosz Tomczyk bartosz.tomczyk86 at gmail.com
Mon Apr 10 19:22:55 UTC 2017


Please do, I don't have commits rights.


On 10.04.2017 20:44, Brian Paul wrote:
> 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