Bug 727311 discovered that WebGL in readback mode didn't work on the Nexus S and the Galaxy Nexus. The OES_read_format spec[1] says that
The preferred type and format combination returned may depend
on the read surface bound to the current GL context.
I suspect this is what is biting us; we query the preferred type and format before we've bound our offscreen framebuffer.
For now, BGRA support is disabled altogether. It'd be nice to be able to use it where it actually works, though.
1. http://www.khronos.org/registry/gles/extensions/OES/OES_read_format.txt

A note that OES_read_format is not strictly relevant to GLES2, since that behavior has been folded into core. The behavior should be the same though. (Unfortunately, the GLES2 spec is even less well worded than the extension)

Comment on attachment 599385[details][diff][review]
Check valid read formats before readPixels
We should use GetOptimalReadFormats when creating framebuffers too, since we use RGBA by default all over the place when creating FBOs.

(In reply to Joe Drew (:JOEDREW!) from comment #3)
> Comment on attachment 599385[details][diff][review]
> Check valid read formats before readPixels
>
> We should use GetOptimalReadFormats when creating framebuffers too, since we
> use RGBA by default all over the place when creating FBOs.
We can do this, but it's slightly different. All this stuff is only relevant to readPixels. For FBOs, we are working with textures, so we need a different set of extensions. For textures, there is also no hint which would be faster. We could bank on BGRA always being faster, but I don't know as this is a safe bet. Perhaps this is a good thing to blocklist for?
As an aside, ANGLE uses BGRA internally even if you request RGBA.