[Mesa-dev] [PATCH 2/2] mesa: Speedup the xrgb -> argb special case in fast_read_rgba_pixels_memcpy
Ian Romanick
idr at freedesktop.org
Mon Mar 11 10:49:10 PDT 2013
On 03/11/2013 07:56 AM, Jose Fonseca wrote:
> I'm surprised this is is faster.
>
> In particular, for big things we'll be touching memory twice.
>
> Did you measure the speed up?
The second hit is cache-hot, so it may not be too expensive. I suspect
memcpy is optimized to fill the cache in a more efficient manner than
the old loop. Since the old loop did a read and a bit-wise or, it's
also possible the compiler generated some really dumb code. We'd have
to look at the assembly output to know.
As Patrick suggests, there's probably an SSE2 method to do this even
faster. That may be worth investigating.
Once upon a time Matt Turner was talking about using pixman to
accelerate operations like this in Mesa. It has a lot of highly
optimized paths for just this sort of thing. Since it's used by other
projects, it gets a lot more testing, etc. It may be worth looking at
using that to solve this problem.
> Jose
>
> ----- Original Message -----
>> ---
>> src/mesa/main/readpix.c | 5 +++--
>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/mesa/main/readpix.c b/src/mesa/main/readpix.c
>> index 349b0bc..0f5c84c 100644
>> --- a/src/mesa/main/readpix.c
>> +++ b/src/mesa/main/readpix.c
>> @@ -285,11 +285,12 @@ fast_read_rgba_pixels_memcpy( struct gl_context *ctx,
>> }
>> } else if (copy_xrgb) {
>> /* convert xrgb -> argb */
>> + int alphaOffset = texelBytes - 1;
>> for (j = 0; j < height; j++) {
>> - GLuint *dst4 = (GLuint *) dst, *map4 = (GLuint *) map;
>> + memcpy(dst, map, width * texelBytes);
>> int i;
At the very least, the declaration needs to be moved before the memcpy
or it will break the build on Windows.
>> for (i = 0; i < width; i++) {
>> - dst4[i] = map4[i] | 0xff000000; /* set A=0xff */
>> + dst[i * texelBytes + alphaOffset] = 0xff; /* set A=0xff */
>> }
>> dst += dstStride;
>> map += stride;
>> --
>> 1.8.1.5
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list