Hi Sergey,

Thanks for the async reading tip! It gives us a general speed-up, but it does not fix the issue at hand. But thanks anyway for great community support!

We used osg::Timer to time the execution of the following calls in the code you suggested below: glReadPixels, glMapBuffer, memcpy and the total time of the whole code segment per frame and we got the following results (all numbers are in milliseconds):

***     PXREAD  MAPBUF  MEMCPY  TOTAL ***
        0.038   0.004   7.274   7.316   
        0.038   0.004   7.262   7.304   
        0.039   0.004   7.275   7.318   
        0.037   0.004   7.276   7.317   
[...snip... about 20-30 minutes later ...]
        0.04    0.004   7.277   7.321   
        0.037   0.005   7.293   7.335   
        0.039   0.004   7.279   7.322   
        0.038   0.004   7.274   7.316   
        0.037   81.524  7.285   88.846     <--- ???
        0.039   802.79  7.253   810.082    <--- ???
        0.039   800.092 7.247   807.378 
        0.037   802.858 7.269   810.164 
        0.036   800.102 7.279   807.417 
        0.036   803.398 7.25    810.684 
        0.038   799.461 7.255   806.754 
        0.037   802.716 7.247   810     
        0.038   799.323 7.25    806.611 
        0.037   799.439 7.265   806.741 
        0.039   803.154 7.248   810.441 
[...snip... stays like this until program is terminated]

No Errors, performance just suddenly drops from excellent to a virtual halt. This is a total mystery to me, and I haven't seen anyone else on the web posting similar problems... sigh!

So we are trying to come up with theories as to what can potentially hurt glReadPixels performance (either sync or async) so badly.

Drivers and HW are among the usual suspects, but the client have the same issue on multiple machines while we are having trouble reproducing, on a range of similar HW with the same SW, drivers and config.

Are there any odd comination of GL calls than can interrupt/interfere with glReadPixels?

Again any suggestion or ideas are greatly appreciated?

Best regards,
John

Sergey Kurdakov wrote:
Hi John,
I cannot say, what the problem is,

but the possible solution is to use pbo with glReadPixels so that you read previous frame - and all reading is async - not slowing app at all

here is a code for you
//somewhere after rendering

glReadBuffer(GL_FRONT);
// get next buffer's index
 unsigned int iNextBuffer = (_iCurrentBuffer + 1) % N_MAX_BUFFERS;
 // kick of readback of current front-buffer
 // into the next buffer
glBindBuffer(GL_PIXEL_PACK_BUFFER, _aPixelBuffer[iNextBuffer]);//bind pbo1 glReadPixels(0, 0, m_width, m_height, GL_BGRA, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));//readback
                                // map the current buffer containing the
                                // image read back the previous time around
glBindBuffer(GL_PIXEL_PACK_BUFFER_EXT, _aPixelBuffer[_iCurrentBuffer]);//bind pbo2 _pPixels = static_cast<unsigned char *>(glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY));

if(_pPixels)
{
//something like:
 memcpy(image,_pPixels,m_width*m_height*4);
// unmap the buffer
     if (!glUnmapBuffer(GL_PIXEL_PACK_BUFFER))
    {
        std::cerr << "Couldn't unmap pixel buffer. Exiting\n";
        assert(false);
    }
}

// unbind readback buffer to not interfere with
 // any other (traditional) readbacks.
    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
 // make next-buffer the current buffer
    _iCurrentBuffer = iNextBuffer;
glReadBuffer(GL_BACK);


make sure you have inited buffers

glGenBuffers(N_MAX_BUFFERS, _aPixelBuffer);
for (unsigned int iBuffer = 0; iBuffer < N_MAX_BUFFERS; ++iBuffer)
    {
        glBindBuffer(GL_PIXEL_PACK_BUFFER, _aPixelBuffer[iBuffer]);
glBufferData(GL_PIXEL_PACK_BUFFER, m_width*m_height*4, NULL, GL_STATIC_READ);
errorcode = glGetError();
} glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

and that you delete them after use

glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, 0);
glDeleteBuffersARB(N_MAX_BUFFERS, _aPixelBuffer);


Regards
Sergey

_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to