Sometimes you want the data to go up FAST. You’re going to be using that texture later in the current frame, or in the next frame at the absolute latest, you’re doing an upload, and you need to know that the format and layout you’re using is going to exactly match the internal representation OpenGL is going to give you. Passing through any kind of software conversion layer - whether your own or in the driver - just doesn’t cut it.
So how do you find that out? Because right now it’s trial and error; you have no way of knowing. Even worse, it can vary from implementation to implementation, so it’s not something you can do a bunch of tests on and then code the results into your program.
Lets talk conversions ok. Lots of us are familiar with the RGBA vs BGRA vs ABGR fiascos for conversions. In the embedded world it is even richer and much more hilarious. The formats exposed by GLES2 for textures are essentially RGB565, RGBA4444, RGBA5551, RGBA8, RGB8, L8, A8, LA8 … and that is mostly it. Mind you, plenty of platforms do not really support RGB8, they pad it to RGBA8. Also, in the embedded world, like 99.999999% time, it is a unified memory model. It gets richer, there are SoC’s that let you write directly to a location in memory from which GL will source texture data. There are some pretty anal rules about the formats, but you can see that getting an actual location to directly write bytes of image data is orders of magnitude better than the idiot guessing game of will it convert or not. If you need to stream texture data on an embedded platform, using glTexSubImage2D is never going to have a happy ending, you need something better, you need a real memory location to directly write the image data.
With that in mind, and with in mind that GL implementations will more often than not twiddle the texture data, the color conversion issue is not that big a deal on top of everything else, really it is not. Besides, I would wager that the folks making the GL implementation will do a much better job than me or for that matter most developers, simlpy because that is core work for GL implementations, twiddling bits to make the hardware happy.
What is quite troubling, especially when you think about it, is that color conversions are done all the freaking time every time you draw one frame of data (texture look up [internal texture format to format used in shader arithmetic] and then writes to framebuffer)… and yet no one cares… looking in particular in the context of texture look ups, there really is no excuse for color conversion to not be in a GL implementation.