[osg-users] osgscreencapture to videobuffer async

Robert Osfield robert.osfield at gmail.com
Thu Sep 25 07:23:45 PDT 2008

Hi Ralf,

You can only do the glReadPixel call from the graphics thread so you
can't thread this, all you can do is hide the cost of download from
the GPU by using a double buffered PBO, as the osgscreencapture
example illustrates.  To thread the writing of data you'll need to
have a ring buffer of imagers that the draw thread writes to, and a
background writing thread reads from.


On Thu, Sep 25, 2008 at 2:57 PM, Ralf Stokholm <alfmail1 at arenalogic.com> wrote:
> Hi All
> In our application we have added the option of capturing video from our
> playback stream. It works fine but performance is problematic. We are
> currently using a simple glReadPixels call to get the immage from the
> videocard, this takes around 5-6 ms in addition we append the immage to an
> AVI video stream this takes another 12 ms. It should be possible to put the
> 12 in another thread, but I was vondering if it would be possible to do the
> same with part of the glReadPixels call using PBO's.
> This is what I have in mind:
> From the Draw thread on initialrendercallback I would:
> glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, read_pbo)
> glReadPixels() //ASYNC
> SignalVideoThread() //Async
> and the in the video recorder thread when signaled
> glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, copy_pbo);
> GLubyte* src =
> AVIStream.addframe(src)
> glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);
> Can someone tell me if this is feasable?, I was thinking that it would be
> problematic to do the gl calls from another thread? or should I use a
> compleately different approach?
> This is run on windowsXP, Core2 quad, Nvidia GX280
> Brgs.
> Ralf Stokholm
> Arenalogic
> www.arenalogic.com
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

More information about the osg-users mailing list