Tommato said:
Is it really so simple (in principle) in OpenGL?
It is simple as long as you still do all rendering in one thread. Usually you create render thread, then create context within that thread and start render loop after that. Maybe QT has tool function to move context to another thread, likely backed by automatic context recreation, but overall it should work like this.
I'm not sure if it is possible to submit draw commands from multiple threads using GL, using some tricks or hacks. I thought AZDO is related to that topic but not sure. Maybe somebody can answer…
However, GL can do indirect draws. So maybe it could help to move towards a compute driven scene management and renderer, e.g. doing culling on GPU and generate indirect draws for each object. If you have a really big number of draw calls this might help. But i guess it's a lot of work just to figure out it does not help at the end.
So at first i'd use some gfx debugging tools and look if they can show you something suspicious, like bubbles, overall underutilization, too much waiting on sync, etc.
Also try different GPUs. I've seen NV being much faster with rendering, but AMD being much faster with compute. Differences of factor 10 for similar powerful GPUs on paper. This can be a hint to try to do some things differently.
Then maybe it's an option to switch to Vulkan, where multithreaded rendering is easy, but drawing a first simple triangle already takes thousands lines of code.
For example 1000 trees (50 K polys per each).
Still does not sound much. You do batching by textures, states, etc. and such usual optimizations?