Use fast path for RGB 565 -> 32-bit XRGB 8888 SDL-1.2
authorSam Lantinga <slouken@libsdl.org>
Sun, 02 Sep 2012 16:05:29 -0700
branchSDL-1.2
changeset 6411ec7ccf5ee3dd
parent 6405 7b87c1773b3e
child 6455 15c8ee21197b
Use fast path for RGB 565 -> 32-bit XRGB 8888

Hello Sam,
while profiling ScummVM I noticed it was making use of the generic
BlitNToN blitter, which struck me as odd because it should be a very
classical codepath.
After investigating, I saw that in the blit op chooser:

{ 0x0000F800,0x000007E0,0x0000001F, 4, 0x00FF0000,0x0000FF00,0x000000FF,
0, NULL, Blit_RGB565_ARGB8888, SET_ALPHA },
{ 0x0000F800,0x000007E0,0x0000001F, 4, 0x000000FF,0x0000FF00,0x00FF0000,
0, NULL, Blit_RGB565_ABGR8888, SET_ALPHA },
{ 0x0000F800,0x000007E0,0x0000001F, 4, 0xFF000000,0x00FF0000,0x0000FF00,
0, NULL, Blit_RGB565_RGBA8888, SET_ALPHA },
{ 0x0000F800,0x000007E0,0x0000001F, 4, 0x0000FF00,0x00FF0000,0xFF000000,
0, NULL, Blit_RGB565_BGRA8888, SET_ALPHA },

Couldn't the optimized versions be used for NO_ALPHA too? I take it
that the resulting alpha component can be undefined as it should never
be used.
I tried this (see attached patch) and it worked perfectly (and
therefore faster) on ScummVM but there might be a trick (I'm not
expert at the semantics of SDL, ie NO_ALPHA, SET_ALPHA and COPY_ALPHA
there).
What do you think?

Cheers,
Bertrand
src/video/SDL_blit_N.c
     1.1 --- a/src/video/SDL_blit_N.c	Sat Aug 25 16:46:34 2012 -0400
     1.2 +++ b/src/video/SDL_blit_N.c	Sun Sep 02 16:05:29 2012 -0700
     1.3 @@ -2307,13 +2307,13 @@
     1.4        2, NULL, Blit_RGB555_32Altivec, NO_ALPHA | COPY_ALPHA | SET_ALPHA },
     1.5  #endif
     1.6      { 0x0000F800,0x000007E0,0x0000001F, 4, 0x00FF0000,0x0000FF00,0x000000FF,
     1.7 -      0, NULL, Blit_RGB565_ARGB8888, SET_ALPHA },
     1.8 +      0, NULL, Blit_RGB565_ARGB8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA },
     1.9      { 0x0000F800,0x000007E0,0x0000001F, 4, 0x000000FF,0x0000FF00,0x00FF0000,
    1.10 -      0, NULL, Blit_RGB565_ABGR8888, SET_ALPHA },
    1.11 +      0, NULL, Blit_RGB565_ABGR8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA },
    1.12      { 0x0000F800,0x000007E0,0x0000001F, 4, 0xFF000000,0x00FF0000,0x0000FF00,
    1.13 -      0, NULL, Blit_RGB565_RGBA8888, SET_ALPHA },
    1.14 +      0, NULL, Blit_RGB565_RGBA8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA },
    1.15      { 0x0000F800,0x000007E0,0x0000001F, 4, 0x0000FF00,0x00FF0000,0xFF000000,
    1.16 -      0, NULL, Blit_RGB565_BGRA8888, SET_ALPHA },
    1.17 +      0, NULL, Blit_RGB565_BGRA8888, NO_ALPHA | COPY_ALPHA | SET_ALPHA },
    1.18  
    1.19      /* Default for 16-bit RGB source, used if no other blitter matches */
    1.20      { 0,0,0, 0, 0,0,0, 0, NULL, BlitNtoN, 0 }