[Qt-interest] QGLFrameBufferObject and multiple threads
Samuel Rødal
sroedal at trolltech.com
Thu Sep 3 14:18:58 CEST 2009
cyril.mailing.list wrote:
> 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
>
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest
QtOpenGL is not reentrant, so you should avoid using
QGLFramebufferObject and QGLContext from threads other than the GUI
thread. It might happen to work on Windows but it won't on X11.
Regards,
Samuel
More information about the Qt-interest-old
mailing list