PDA

View Full Version : Need fastest way to grab frame buffer



jmX
11-10-2000, 01:00 PM
Hey guys, I need to find a fast way to get the frame buffer. Using glReadPixels is taking me down to about 3 fps (only rendering a 1 triangle scene), and that will NOT be acceptable.

First, I have constants:
- Screen will always be 512x512
- Bitdepth will always be 32bit rgba
- Platform will always be win32

Anybody have some interesting hacks? I bet there are some win32 calls I can use to make this a bit faster, but I'm not much of a win32 guy.

Machine configuration is a 550mhz P3, TNT2 AGP card.

Maybe Nvidia has an extension for this?

Jon

jmX
11-10-2000, 01:01 PM
Oh yeah...bit more info:

Here's the exact call I'm using:
glReadPixels(0,0,512,512,GL_RGBA,GL_UNSIGNED_BYTE, fbPtr);

The app is windowed, and the desktop is set at 32 bits.

Jon

[This message has been edited by jmX (edited 11-10-2000).]

mcraighead
11-10-2000, 01:44 PM
If you're using 6.xx drivers you should be able to get MUCH faster than that. 512x512 means you are retrieving 256K pixels, and if you're at 3 fps, you're getting <1 Mpixel/sec. My own benchmarks suggest you should be able to get >10 Mpixels/sec (MINIMUM) for that kind of readback if you are using 6.xx drivers, whether you're on a TNT, TNT2, or any type of GeForce.

GL_UNSIGNED_BYTE/GL_BGRA is likely to be slightly faster than GL_UNSIGNED_BYTE/GL_RGBA, but if you're under 1 megapixel, something else is wrong.

If you're in a 16-bit mode, you'll get best results with GL_UNSIGNED_SHORT_5_6_5/GL_RGB.

- Matt

mcraighead
11-10-2000, 01:49 PM
For reference, on my P3-700, BX, GF2 GTS, Win2K, with desktop at 32-bit, doing a 512x512 readback with type GL_UNSIGNED_BYTE and format GL_RGBA, I get 107 readbacks per second (28 Mpixels/sec). TNT2 should not be that much slower at this operation.

- Matt

jmX
11-10-2000, 01:51 PM
Ok, I just did more testing.

First, I looked at glReadPixels more carefully. It turns out that when I ask for GL_BYTE, it reads the frame buffer, converts all r, g, and b's to *FLOATS*, then converts to whatever type I specified.

I changed the call to:
glReadPixels(0,0,512,512,GL_RGBA,GL_FLOAT,fbPtr);
and I get 4.1fps.

If I do the original:
glReadPixels(0,0,512,512,GL_RGBA,GL_UNSIGNED_BYTE, fbPtr);
I get 2.8fps.

Matt, using GL_BGRA_EXT gave me the same 2.8fps.

Basically, all i need is an *EXACT* copy of what is in video ram...just the 32 bit rgba framebuffer.

Jon

mcraighead
11-10-2000, 01:55 PM
Yes, old driver versions were slow at this on TNT2, but we optimized it. What version are you using?

- Matt

jmX
11-10-2000, 02:00 PM
Downloading the 6.31 version now. I'll let you know how it goes in a few minutes...er, make that half an hour. Seems we have a slow pipe between here and nvidia.

Jon

jmX
11-10-2000, 02:25 PM
Ok, got the new 6.31 drivers for win2k.

Performance went from 2.8fps to 76fps. WOOHOO.

The simple solutions are always the best http://www.opengl.org/discussion_boards/ubb/smile.gif

Jon