[Qt-interest] QGLFrameBufferObject and multiple threads

cyril.mailing.list cyril.mailing.list at gmail.com
Thu Sep 3 10:35:38 CEST 2009


Hi

I am working on a program that basically sports :

- one regular QGLWidget "W" in the GUI thread
- one QGLContext "C1" that is created in the GUI thread and shared with 
the QGLWidget's context
- one QGLFrameBufferObject "FBO1" that is created in the GUI thread
- one QGLContext "C2" that is created in the GUI thread and shared with 
the QGLWidget's context
- one QGLFrameBufferObject "FBO2" that is created in the GUI thread

After creating these objects, the program starts two worker threads that 
will be used to render some stuff onto FBO1 and FBO2 respectively.
To achieve this, the first (resp second) worker thread simply makes C1 
(resp C2) the current GL context, then binds FBO1 (resp FBO2), then 
draws to this FBO using a QPainter, and finally unbinds the FBO and 
releases the GL context. Each thread does this in a loop to produce 
successive frames.

On Windows, everything works just fine as long as I critical-section the 
QPainter::begin() to QPainter::end() part. Otherwise, I get random 
concurrency crashes, essentially due to a QPainter's internal "state" 
attribute being nullified and any moment.

On Linux, I get crashes after fractions of seconds even with only one 
worker thread.

I have the same problem with Qt4.5.2 (opengl paint engine) and Qt master 
(opengl2 paint engine), except that with Qt master I get a crash on 
program termination, due to a multiple release of a resource or 
something like that.

What am I doing wrong? I thoroughly separated everything needed so no 
concurrent access is done on any public object. QPainter is said to be 
reentrant in the doc.

note1: As seen in a couple of other threads I had to resort to the 
internal constructor QGLContext::QGLContext(QGLFormat, QPaintDevice*) to 
be able to set up my two GL contexts.
note2: This example deals with 2 threads but in could be any number.
note3: This example deals with 1 FBO per thread but there could be any 
number of FBOs per thread, e.g. to achieve some multiple buffering.
note4: I worked on machines with OpenGL 2.0+ support.

Thanks for your time reading this!
Cyril




More information about the Qt-interest-old mailing list