-
Notifications
You must be signed in to change notification settings - Fork 102
stopFrames
Author: Stefan Eilemann
State: Design
This feature adds the capability for an application to interrupt its current rendering operations, without waiting for them to be finished.
- The application process can request the interruption at any time from any application thread.
- The rendering operations, e.g.,
Channel::frameDraw
and others are not interrupted by Equalizer but can query a flag or receive a notification.
void Config::stopFrames(); // callable from any application thread
/** called from command thread */
virtual void Channel::notifyStopFrame( const uint32_t lastFrameNumber )
The application decide to do a frames stop. The Config send the command to the config server.
Add new Command CMD_CONFIG_STOP_FRAMES
Add new PACKET ConfigStopFramesPacket
uint32_t lastFrameNumber
void Config::stopFrames
send stopFrames Packet to the config server
The server receive a command to stop the current working frame. Each activated channel must be send to all node the stop Frame.
void server::Config::_cmdStopFrames
for Each Compound
if it's destination compound
if compound->channel->isActive()
send packet stopFrame
Add new Command CMD_CHANNEL_STOP_FRAME
Add new PACKET ChannelStopFramePacket
All node Channel receive the command to stop the current working frame.
Add client::channel::_cmdStopFrames
call channel::notifyStopFrame( lastFrameNumber );
virtual channel::notifyStopFrame( const uint32_t lastFrameNumber )
do nothing;
###EqPly
modify eqPly::Channel for stop the current rendering until the frame id = lastFrameNumber
init frameStartRendering = 0;
Add virtual channel::notifyStopFrames( const uint32_t lastFrameNumber )
set frameStartRendering = lastFrameNumber + 1
Add bool _stopRendering( const uint32_t frameID ) const
return frameID < frameStartRendering
In frameClear, frameDraw, frameAssemble, frameStart, frameViewStart,
frameFinsh and frameViewFinish we start with the following test code
if( _stopRendering( ))
return;
In _drawModel:
Add new method VertexBufferState::stopRendering
Implement in VertexBufferStateSimple (true) and
VertexBufferStateEq( ask channel)
use stopRendering in VertexBufferNode/Leaf::render()
in eqPly::config add the trigger with the space bar command
Resolved: Use a notification:
A flag forces a poll-based implementation where the application regularly polls the state of the flag. A notification leaves this to the application, which can set a flag if it wishes this type of implementation, or use another mechanism, e.g., a signal.
The reset of the flag is difficult for the application to implement, since it should be reset by the next frame started from the application. The client can't distinguish between queued frames (before the stop) and new frames (after the stop). This is solved by passing the last frame already started (before the stop) as a parameter for the notification.
Resolved: All pending tasks are executed.
The frameReadback on the sources will either readback and transmit a partial result, or preferably transmit no image data (application dependent). This unblocks the destination after the transmit (typically <100ms) or immediately.
The application has to make sure to not render in queued but stopped frames.
The swap task will be executed by Equalizer, but has little runtime overhead.
Resolved: No.
The application calls interrupt from any thread, and can call finishAllFrames when it regains control of its main loop. Even if finishAllFrames is not called operations will function properly.