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