Well, anywayAnyway, i've looked around, and found some people complaining about the same,
but no working solution so far. The most promising advise was to "extract data in the native format of the GPU". Which i've tried and tried, but failed so far.
Edit 2 : I've also tried to use glReadPixels(), instead of glGetTexImage(). But it's worse unfortunately. Approximately twice slower.
Edit 3 : Here is the code. Note that it uses a "framework" that i've not developed. So some of the function calls here are not OpenGL standard. But they are nonetheless quite self-expressive.
glDisable(GL_BLEND);
// Simple construction, for test : the resulting texture is output into render buffer
renderbufx1.bind();
clear(0,0,0,0);
simpleDiffShader.bind();
simpleDiffShader.setTexture("TextureRef",img.tex,0);
simpleDiffShader.setTexture("TextureDown",renderbufx2.getTexture(),1);
img.tex->drawPart(-1,-1,2,2,0,0,1,1);
simpleDiffShader.unbind();
renderbufx1.unbind();
// Not really useful, but just in case, the result is copied into another render buffer.
// renderbufx1 is going to be displayed, and i want to avoid any access conflict
savebufx1.bind();
clear(0,0,0,0);
renderbufx1.getTexture()->bind();
renderbufx1.getTexture()->drawPart(-1,-1,2,2,0,0,1,1);
renderbufx1.getTexture()->unbind();
savebufx1.unbind();
savebufx1.getTexture()->bind();
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_BYTE, t.data); // <-- This is the line
savebufx1.getTexture()->unbind();
glEnable (GL_BLEND);
renderbufx1.getTexture()->bind();
renderbufx1.getTexture()->drawPart(tex2x,-1,w,h,texSpan,texSpan,fact,fact);
renderbufx1.getTexture()->unbind();
Timing measured encompasses all this (and a few other things, which do not really contribute to the total).