Hi,

 

I'm currently wondering about the order of render-operations done in
Equalizer. The Programming Guide tries to explain it, but I'm still
confused. In order to make it clear to myself, I derived from Node, Pipe,
Window and Channel and added outputs to each rendering stage  (frameStart,
frameDrawFinish, frameFinish) in order to actually see how it behaves.

Additionally, I choose the example "3-channel-cave". Which is using 3
channels inside a single window on single pipe on a single node. I turned
multithreading off and started the program. The log of a single Frame looks
like this:

 

[main] emNode::frameStart()

[main] emPipe::frameStart()

[main] emWindow::frameStart()

[main] emChannel::frameStart()

[main] emChannel::frameDraw()

[main] emChannel::frameDrawFinish()

[main] emWindow::frameDrawFinish()

[main] emPipe::frameDrawFinish()

[main] emNode::frameDrawFinish()

[main] emChannel::frameStart()

[main] emChannel::frameDraw()

[main] emChannel::frameDrawFinish()

[main] emWindow::frameDrawFinish()

[main] emPipe::frameDrawFinish()

[main] emNode::frameDrawFinish()

[main] emChannel::frameStart()

[main] emChannel::frameDraw()

[main] emChannel::frameDrawFinish()

[main] emWindow::frameDrawFinish()

[main] emPipe::frameDrawFinish()

[main] emNode::frameDrawFinish()

[main] emChannel::frameFinish()

[main] emChannel::frameFinish()

[main] emChannel::frameFinish()

[main] emWindow::frameFinish()

[main] emPipe::frameFinish()

[main] emNode::frameFinish()

 

This order is quite surprising to me, since frameDrawFinish of all classes
involved is called more than once per frame (despite their documentation)!

I would have expected this:

 

[main] emNode::frameStart()

[main] emPipe::frameStart()

[main] emWindow::frameStart()

[main] emChannel::frameStart()

[main] emChannel::frameDraw()

[main] emChannel::frameDrawFinish()

[main] emChannel::frameStart()

[main] emChannel::frameDraw()

[main] emChannel::frameDrawFinish()

[main] emChannel::frameStart()

[main] emChannel::frameDraw()

[main] emChannel::frameDrawFinish()

[main] emWindow::frameDrawFinish()

[main] emPipe::frameDrawFinish()

[main] emNode::frameDrawFinish()

[main] emChannel::frameFinish()

[main] emChannel::frameFinish()

[main] emChannel::frameFinish()

[main] emWindow::frameFinish()

[main] emPipe::frameFinish()

[main] emNode::frameFinish()

 

 

The multithreaded case is even less clear to me. 

For instance, I need a time where I _know_ that none of the node's pipes is
doing any rendering anymore (i.e. do not access the scene database). Is that
Node::frameFinish?  Also, where is a place I knew that none of the pipes is
doing any rendering _yet_. Is that Node::frameStart? 

 

I tried it this way, but as soon as I enable multithreading, the pipe-thread
and the main thread get out of sync and my applications crashes :-(

 

 

Greetings,

 

Mathias

_______________________________________________
eq-dev mailing list
[email protected]
https://in-zueri.ch/cgi-bin/mailman/listinfo/eq-dev
http://www.equalizergraphics.com

Reply via email to