Overview
Equalizer provides hardware and software swap barriers to synchronize buffer swaps of multiple windows, potentially residing on different nodes. Together with video synchronization provided by the GPU they ensure a coherent image generation.
Definitions
The following defines the various synchronization terms, since they are often confused in the literature:
- Genlock is the strongest form of synchronization, where the video signal of multiple video outputs is synchronized at the beginning of each line. To our knowledge, this is no longer implemented on current GPUs.
- Frame synchronization synchronizes the video signal of multiple video outputs at the beginning of each frame. By definition, it happens with the video refresh rate. This is implemented by some professional-grade GPUs.
- Swap synchronization synchronizes the buffer swap of multiple windows, potentially on multiple video outputs. By definition, this happens at the application's rendering frame rate.
- Hardware swap synchronization uses a electrical signal on the GPU as a very fast and precise barrier for swap synchronization.
- Software swap synchronization provides swap synchronization using a software construct, typically a network-based barrier. Software swap synchronization might fail to synchronize a window for one video frame very occasionally, which is only noticable by very skilled observers.
What do I need?
- Single-display system do not need any of the above, regardless of the stereo mode
- Monoscopic display walls need a software swap synchronization. Due to the space imposed by the bezels between displays, a frame synchronization is typically not needed.
- Projector-based monoscopic or passive stereo systems need at least a software swap synchronization. Frame synchronization is recommended since the video outputs overlap and some people might notice tearing.
- Active stereo systems need frame synchronization and at least software swap synchronization, otherwise the per-eye images of the various projectors do not match. Hardware swap synchronization is recommended for demanding high-performance use cases, e.g., flight simulators.
Software Swap Synchronization
The software swap barrier uses the network connection between the nodes to synchronize the buffer swap of multiple windows. Additionally, all OpenGL commands are finished to ensure that the buffer swaps happen immediately and without any delay. The software swap barrier does not need any special hardware support.
Multiple windows on the same GPU (pipe) can join the same software swap barrier. A single actual networked barrier operation is used to synchronize all windows of a single GPU, and the windows will all swap buffers immediately.
Software swap synchronization does not perform frame synchronization, but can work with frame synchronization provided by the driver, e.g., using an NVidia G-Syn board. Furthermore a swap command may very occasionally be executed on video too late, because it just missed its turn due to timing issues.
To configure software swap synchronization, define a swapbarrier
for each window in the configuration, potentially using giving it a name. All
swapbarriers in a single compound tree using the same barrier name will swap
together.
Hardware Synchronization
On GPUs which support the NV_swap_group extension, e.g., NVidia Quadro with G-Sync boards, hardware-based swap synchronization is supported by Equalizer. On a single node, all windows join a swap group, which ensures that the buffer swaps happen synchronously. Between systems, all swap groups join the same swap barrier for synchronization.
To configure hardware swap synchronization, define a NV_group
and potentially a NV_barrier
. All swapbarrier definition using
the same group and barrier will be synchronized. Since almost all
implementations only support a single group and barrier, the value ON (=1) can
be used as a synonym in the configuration file.
File Format
compound { swapbarrier { name "barrier-name" // sync's compound's window swap buffers NV_group OFF | ON (1) | unsigned NV_barrier OFF | ON (1) | unsigned } }