Ok, yeah, apparently the only sure way is copy to rendertarget and readpixels(), but readpixels() is broken and tries to use the backbuffer instead of the rendertarget. Awesome. Perhaps I need to ditch SDL2, if it can't do correctly something as basic as this.
UPDATE: ok, actually readpixels() works using the OpenGL driver instead of the default D3D9 one.