[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