April 4, 2011

laumaya laumaya
Lab Rat
29 posts

Qt OpenGL and threads

 

Hello,
It’s possible to use Qt OpenGL in several threads ?
To be more precise i would like to :

  • Using OpenGL in the Qt Gui thread => Creating a QGLContext contextA
  • Creating a working thread => Creating a QGLContext contextB in the working thread which share OpenGL texture with contextA
  • Creating the texture in the working thread with the OpenGL context contextB
  • Using this texture in the context contextA

It’s seems that it’s not possible…
Thanks.

8 replies

April 7, 2011

webmaster.skelton webmaster.sk..
Lab Rat
83 posts

I would assume(and I may be incorrect) that qt assumes any openGl to the GUI thread. This means that even if you try to create it in a new thread or move it to one, it will be forced back to the GUI thread. But like i said i am not certain of this

April 7, 2011

Hornsj2 Hornsj2
Lab Rat
80 posts

I don’t know the answer.

Just out of curiousity what is the use-case for this? What version of OpenGL are you using? What is your target hardware?

If you are attempting to multi-thread in order to save on GUI thread processing (keep in mind I don’t know the internals of Qt) on a platform with dedicated graphics hardware wouldn’t the processing be pushed off of the GUI thread by default?

OpenGL, particularly the recent versions, attempts to push just about everything to the graphics hardware via shaders. In the latest versions there is no fixed-function state on the client-side at all.

All that being said if your goal is not to increase performance my answer of I don’t know still stands. Sorry if this post doesn’t really help you.

April 7, 2011

laumaya laumaya
Lab Rat
29 posts

Hi,

Hornsj2 wrote:
I don’t know the answer.
Just out of curiousity what is the use-case for this? What version of OpenGL are you using? What is your target hardware?

All hardware compatible with OpenGL 1.1
Hornsj2 wrote:
I don’t know the answer.If you are attempting to multi-thread in order to save on GUI thread processing (keep in mind I don’t know the internals of Qt) on a platform with dedicated graphics hardware wouldn’t the processing be pushed off of the GUI thread by default?

All user interactions are in the GUI thread, so I don’t want that the OpenGL processing (Creating textures, VBOs, and all non interactive OpenGL calls slow down the GUI Thread.)

@+

April 7, 2011

webmaster.skelton webmaster.sk..
Lab Rat
83 posts

The issue is the fact that the rendering will(more than likely, but depends upon exactly what you intend to do) take place on a widget. Any widget, or subsequent class, will force any thread created to be thunked back to the GUI thread. Generally it seems to be good practice to keep threads for computational use only.

April 7, 2011

laumaya laumaya
Lab Rat
29 posts

I’m agree with you :

  • Creating a OpenGL texture is computational
  • Creating OpenGL VBO is computational
  • Crating OpenGL list is computational

Then the rendering of all these OpenGL objects are done in the GUI thread.

April 8, 2011

Hornsj2 Hornsj2
Lab Rat
80 posts

I could be wrong but I believe the simple act of calling OpenGL functions to create data structures passes the data to the OpenGL context (server).

OpenGL is pretty much a state machine so if you are setting up the state in a context to perform rendering and then copying that state between contexts to save processing time I’m not sure if you will see a performance gain.

If you can achieve this and measure the results I would be interested to see what they are in terms of performance.

April 8, 2011

LiamMaru LiamMaru
Lab Rat
63 posts

Hornsj2 wrote:
I could be wrong but I believe the simple act of calling OpenGL functions to create data structures passes the data to the OpenGL context (server).

OpenGL is pretty much a state machine so if you are setting up the state in a context to perform rendering and then copying that state between contexts to save processing time I’m not sure if you will see a performance gain.

If you can achieve this and measure the results I would be interested to see what they are in terms of performance.

True. The function of an OpenGL context is to set the parameters under which a given scope uses OpenGL – comprised of components written by hardware manufacturers – runs. It also means you can use different versions, in different contexts in the same application.

The good news, sort of, is that different threads can use the same OpenGL contextr, but not at the same time. You’ll need to null the context in the thread that has it, then use a call such as the WGL call (windows only) ‘wglMakeCurrent’ to select the correct handles. The bad news is, it’s a pain in the butt to implement and slow if you do it wrong. You have to avoid switching unless you absolutely know you need to.

The generally accepted practice is to keep all your rendering in one thread, and use a message queue to execute OpenGL commands which are anomalous to the regular flow of your pipeline. If it’s good enough for the rest of us, it’s good enough for you :)

May 25, 2011

laumaya laumaya
Lab Rat
29 posts

Thanks LiamMaru,
I have already try to use the same OpenGL context in different thread, but I have forgotten to call : QGlContext::doneCurrent() in the main GUI thread and I had some crash.
I will try it as soon as possible.

But, when using the same OpenGL context in another thread, it will not be possible to refresh the view of the main GUI thread… So it will freeze the application !

No issue ?

 
  ‹‹ Qt and POSIX      TTL on UDP sockets ››

You must log in to post a reply. Not a member yet? Register here!