https://bugs.freedesktop.org/show_bug.cgi?id=41263
--- Comment #2 from Simon Farnsworth simon.farnsworth@onelan.co.uk 2011-09-28 10:07:53 PDT --- I think it may be core Mesa at fault.
main/teximage.c:2779
gl_format texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, internalFormat, GL_NONE, GL_NONE);
is called when internalFormat is GL_RGB. Gallium, not unreasonably, treats this as "choose a nice fast GL_RGB style format", and chooses a reversed format to that of the source. The result is a slow software copy, not a fast hardware copy.
So, two possibilities present themselves to me:
1) Gallium should learn to do swizzled hardware blits with a textured quad. 2) Core Mesa should give Gallium more information about the source, so that it can choose a matching format if possible.