Author: eilemann@gmail.com
State: Implemented
The configuration file format for the Equalizer server is described below. The examples directory does contain some example configuration files. The configuration tool automatically creates some standard configuration files.
The file format is not described in detail here. Please refer to the Programming Guide in general, and to the changes section below for individual feature specifications. The actual implementation may differ slightly from this specification, but we try to keep it up to date. The loader implementation is the reference for the file format, look at src/server/loader.y, if you understand lex/yacc code.
Note that this format is the representation for the server's low-level scalable rendering engine. Eventually this file format will be replaced by a higher-level format or API, and may even be partially hidden from the user. Automatic configuration and load balancing are not yet implemented, hence the need to have these low-level configuration files.
All Equalizer units are in meters. This applies currently to the wall coordinates and the eye base, as well as the head matrix supplied programmatically.
Global values have useful default parameters, which can be overriden with
environment variables of the same name. For enumeration values,
e.g., EQ_COMPOUND_IATTR_STEREO_MODE
, the corresponding integer
value has to be used. The global values in the config file override these
defaults, and are in turn overriden by the corresponding attributes sections
of the associated entities.
global { EQ_CONNECTION_SATTR_HOSTNAME string EQ_CONNECTION_IATTR_TYPE TCPIP | SDP | RDMA | PIPE EQ_CONNECTION_IATTR_PORT unsigned EQ_CONNECTION_SATTR_PIPE_FILENAME string EQ_CONFIG_FATTR_EYE_BASE float EQ_CONFIG_IATTR_ROBUSTNESS OFF | ON EQ_NODE_SATTR_LAUNCH_COMMAND string EQ_NODE_CATTR_LAUNCH_COMMAND_QUOTE 'character' EQ_NODE_IATTR_THREAD_MODEL ASYNC | DRAW_SYNC | LOCAL_SYNC EQ_NODE_IATTR_LAUNCH_TIMEOUT unsigned EQ_PIPE_IATTR_HINT_THREAD OFF | ON EQ_PIPE_IATTR_HINT_AFFINITY AUTO | OFF | CORE unsigned | SOCKET unsigned EQ_WINDOW_IATTR_HINT_STEREO OFF | ON | AUTO EQ_WINDOW_IATTR_HINT_DOUBLEBUFFER OFF | ON | AUTO EQ_WINDOW_IATTR_HINT_DECORATION OFF | ON EQ_WINDOW_IATTR_HINT_FULLSCREEN OFF | ON EQ_WINDOW_IATTR_HINT_SWAPSYNC OFF | ON # AGL, WGL only EQ_WINDOW_IATTR_HINT_DRAWABLE window | pbuffer | FBO | OFF EQ_WINDOW_IATTR_HINT_STATISTICS OFF | FASTEST [ON] | NICEST EQ_WINDOW_IATTR_HINT_GRAB_POINTER OFF | [ON] EQ_WINDOW_IATTR_PLANES_COLOR unsigned | RGBA16F | RGBA32F EQ_WINDOW_IATTR_PLANES_ALPHA unsigned EQ_WINDOW_IATTR_PLANES_DEPTH unsigned EQ_WINDOW_IATTR_PLANES_STENCIL unsigned EQ_WINDOW_IATTR_PLANES_ACCUM unsigned EQ_WINDOW_IATTR_PLANES_ACCUM_ALPHA unsigned EQ_WINDOW_IATTR_PLANES_SAMPLES unsigned EQ_CHANNEL_IATTR_HINT_STATISTICS OFF | FASTEST [ ON ] | NICEST EQ_CHANNEL_SATTR_DUMP_IMAGE string EQ_COMPOUND_IATTR_STEREO_MODE AUTO | QUAD | ANAGLYPH | PASSIVE EQ_COMPOUND_IATTR_STEREO_ANAGLYPH_LEFT_MASK [ RED GREEN BLUE ] EQ_COMPOUND_IATTR_STEREO_ANAGLYPH_RIGHT_MASK [ RED GREEN BLUE ] } server { connection # 0-n times, listening connections of the server { type TCPIP | SDP | RDMA | PIPE | RSP port unsigned # TCPIP, SDP filename string # PIPE hostname string interface string # RSP } config # 1-n times, currently only the first one is used by the server { latency int # Number of frames nodes may fall behind app, default 1 attributes { eye_base float # distance between left and right eye robustness OFF | ON # tolerate resource failures (init only) } (node|appNode) # 1-n times, a system in the cluster # 0|1 appNode: launches render thread within app process { name string host string # Used to auto-launch render nodes connection # 0-n times, possible connections to this node { type TCPIP | SDP | PIPE port unsigned hostname string filename string } attributes { thread_model ASYNC | DRAW_SYNC | LOCAL_SYNC launch_command string # render client launch command launch_command_quote 'character' # command argument quote char launch_timeout unsigned # timeout in milliseconds } pipe # 1-n times { name string port unsigned # X server number or ignored device unsigned # graphics adapter number viewport [ viewport ] # default: autodetect attributes { hint_thread OFF | ON # default ON hint_affinity AUTO | OFF | CORE unsigned | SOCKET unsigned } window # 1-n times { name string viewport [ viewport ] # wrt pipe, default full screen attributes { hint_stereo OFF | ON | AUTO hint_doublebuffer OFF | ON | AUTO hint_decoration OFF | ON hint_fullscreen OFF | ON hint_swapsync OFF | ON # AGL, WGL only hint_drawable window | pbuffer | FBO | OFF hint_statistics OFF | FASTEST [ON] | NICEST hint_grab_pointer OFF | [ON] planes_color unsigned | RGBA16F | RGBA32F planes_alpha unsigned planes_depth unsigned planes_stencil unsigned planes_accum unsigned planes_accum_alpha unsigned planes_samples unsigned } channel # 1-n times { name string viewport [ viewport ] #wrt window, default full window drawable [ FBO_COLOR FBO_DEPTH FBO_STENCIL ] attributes { hint_statistics OFF | FASTEST [ON] | NICEST dump_image string } } } } } observer # 0...n times { name string eye_base float # convenience eye_left [ float float float ] eye_cyclop [ float float float ] eye_right [ float float float ] focus_distance float focus_mode fixed | relative_to_origin | relative_to_observer opencv_camera [OFF] | AUTO | ON | integer # head tracker vrpn_tracker string # head tracker device name } layout # 0...n times { name string view # 1...n times { name string observer observer-ref viewport [ viewport ] mode MONO | STEREO wall # frustum description { bottom_left [ float float float ] bottom_right [ float float float ] top_left [ float float float ] type fixed | HMD } projection # alternate frustum description, last one wins { origin [ float float float ] distance float fov [ float float ] hpr [ float float float ] } } } canvas # 0...n times { name string layout layout-ref | OFF # 1...n times wall { bottom_left [ float float float ] bottom_right [ float float float ] top_left [ float float float ] type fixed | HMD } projection { origin [ float float float ] distance float fov [ float float ] hpr [ float float float ] } swapbarrier # default swap barrier for all segments of canvas { name string NV_group OFF | ON | unsigned NV_barrier OFF | ON | unsigned } segment # 1...n times { channel string name string viewport [ viewport ] eye [ CYCLOP LEFT RIGHT ] # eye passes, default all wall # frustum description { bottom_left [ float float float ] bottom_right [ float float float ] top_left [ float float float ] type fixed | HMD } projection # alternate frustum description, last one wins { origin [ float float float ] distance float fov [ float float ] hpr [ float float float ] } swapbarrier {...} # set as barrier on all dest compounds } compound # 1-n times { name string channel channel-ref # see below task [ CLEAR DRAW READBACK ASSEMBLE ] # CULL later buffer [ COLOR DEPTH ] # default COLOR eye [ CYCLOP LEFT RIGHT ] # eyes handled, default all viewport [ viewport ] # wrt parent compound, sort-first range [ float float ] # DB-range for sort-last pixel [ int int int int ] # pixel decomposition (x y w h) subpixel [ int int ] # subpixel decomposition (index size) zoom [ float float ] # up/downscale of parent pvp period int # DPlex period phase int # DPlex phase view_equalizer {} # assign resources to child load_equalizers load_equalizer # adapt 2D tiling or DB range of children { mode 2D | DB | VERTICAL | HORIZONTAL damping float # 0: no damping, 1: no changes boundary [ x y ] # 2D tile boundary boundary float # DB range granularity resistance [ x y ] # 2D tile pixel delta resistance float # DB range delta assemble_only_limit float # limit for using dest as src } DFR_equalizer # adapt ZOOM to achieve constant framerate { framerate float # target framerate damping float # 0: no damping, 1: no changes } framerate_equalizer {} # smoothen window swapbuffer rate (DPlex) monitor_equalizer {} # set frame zoom when monitoring other views tile_equalizer { name string size [ int int ] # tile size } attributes { stereo_mode AUTO | QUAD | ANAGLYPH | PASSIVE # default AUTO stereo_anaglyph_left_mask [ RED GREEN BLUE ] # default red stereo_anaglyph_right_mask [ RED GREEN BLUE ] # df green blue } wall # frustum description, deprecated by view and segment frustum { bottom_left [ float float float ] bottom_right [ float float float ] top_left [ float float float ] type fixed | HMD } projection # alternate frustum description, last one wins { origin [ float float float ] distance float fov [ float float ] hpr [ float float float ] } swapbarrier {...} # compounds with the same name sync swap child-compounds outputframe { name string buffer [ COLOR DEPTH ] type texture | memory } inputframe { name string # corresponding output frame } outputtiles { name string size [ int int ] # tile size } inputtiles { name string # corresponding output tiles } } } } channel-ref: 'string' | '(' channel-segment-ref ')' channel-segment-ref: ( canvas-ref ) segment-ref ( layout-ref ) view-ref canvas-ref: 'string' | 'index' segment-ref: 'string' | 'index' layout-ref: 'string' | 'index' view-ref: 'string' | 'index' observer-ref: 'string' | 'index'
Changes
- VRPN head
tracking added:
observer # 0...n times { vrpn_tracker string # head tracker device name }
- Camera-based
head tracking using OpenCV added:
observer # 0...n times { opencv_camera [AUTO] | OFF | ON | integer # head tracker }
- Tile compounds added:
compound { tile_equalizer { name string size [ int int ] # tile size } outputtiles { name string size [ int int ] # tile size } inputtiles { name string # corresponding output tiles } }
- Asymmetric eye position added:
observer # 0...n times { eye_left [ float float float ] eye_cyclop [ float float float ] eye_right [ float float float ] }
- Resistance for
2D load-balancers added:
compound { load_equalizer { mode [ 2D | VERTICAL | HORIZONTAL | DB ] resistance [ x y ] | float # x,y: minimum pixel delta for 2D, float: range } }
- Mouse
capture/grab added:
global { EQ_WINDOW_IATTR_HINT_GRAB_POINTER OFF | [ON] } window # 1-n times { attributes { hint_grab_pointer OFF | [ON] } }
- Automatic thread
placement added:
global { EQ_PIPE_IATTR_HINT_AFFINITY AUTO | OFF | CORE unsigned | SOCKET unsigned } pipe # 1-n times { attributes { hint_affinity AUTO | OFF | CORE unsigned | SOCKET unsigned } }
- Per-segment swap barriers
added:
canvas { swapbarrier // default for all segments { name "barrier-name" // sync's compound's window swap buffers // NV_swap_group (G-Sync) support NV_group OFF | ON (1) | unsigned // use HW group n NV_barrier OFF | ON (1) | unsigned // use HW barrier n } segment { swapbarrier { ..as above.. } } }
- Focus distance support
added:
config // 1-n times, currently only the first one is used by the server { observer { focus_distance float focus_mode fixed | relative_to_origin | relative_to_observer } }
- Render nodes without listening connections added:
#Equalizer 1.2 ascii node { host string # Used to auto-launch render nodes ... }
- Runtime Stereo Switch added:
#Equalizer 1.1 ascii view { mode MONO | STEREO } segment { ... eye [ CYCLOP LEFT RIGHT ] # eye passes, default all } compound { attributes { stereo_mode QUAD | ANAGLYPH | AUTO # new AUTO, also new default } }
- RFE 3132979 added:
global { EQ_COMPOUND_IATTR_STEREO_MODE AUTO | QUAD | ANAGLYPH | PASSIVE } compound # 1-n times { attributes { stereo_mode AUTO | QUAD | ANAGLYPH | PASSIVE # default AUTO } }
- load equalizer: auto-disable of dest channel added:
load_equalizer # adapt 2D tiling or DB range of children { assemble_only_limit float # resource limit for using dest as src }
- Multicast data transfer:
connection { type RSP interface "10.1.1.1" }
- Subpixel compounds:
compound { subpixel [ int int ] # subpixel decomposition (index size) }
- Tile and Range Boundaries:
compound { load_equalizer { mode [ 2D | VERTICAL | HORIZONTAL | DB ] boundary [ x y ] | float # x,y: tile boundary for 2D, float: range } }
- Launch parameter cleanup after 0.9 changed launch parameters to:
global { EQ_NODE_SATTR_LAUNCH_COMMAND string EQ_NODE_CATTR_LAUNCH_COMMAND_QUOTE 'character' EQ_NODE_IATTR_LAUNCH_TIMEOUT unsigned } node { attributes { launch_command string # render client launch command launch_command_quote 'character' # command argument quote char launch_timeout unsigned # timeout in milliseconds } }
- Local named pipe communcation support added:
global { EQ_CONNECTION_IATTR_TYPE PIPE EQ_CONNECTION_SATTR_FILENAME string } connection { type PIPE filename string }
- Equalizer cleanup deprecated loadBalancer {} section and added:
compound { load_equalizer # adapt 2D tiling or DB range of children { mode 2D | DB | VERTICAL | HORIZONTAL damping float # 0: no damping, 1: no changes } DFR_equalizer # adapt ZOOM to achieve constant framerate { framerate float # target framerate damping float # 0: no damping, 1: no changes } framerate_equalizer {} # smoothen window swapbuffer rate (DPlex) monitor_equalizer {} # set frame zoom when monitoring other views }
- Cross-Segment Load Balancing
added:
compound { view_equalizer{} }
- Support for multiple observers
added:
observer # 0...n times { name string eyeBase float } view # 1...n times { observer observer-ref ... }
- Floating
point pipeline support added:
global { EQ_WINDOW_IATTR_PLANES_COLOR unsigned | RGBA16F | RGBA32F } window { attributes { planes_color unsigned | RGBA16F | RGBA32F } }
- HMD support added:
wall { ... type fixed | HMD }
- Layout API added:
layout # 1...n times { name string view # 1...n times { name string viewport [ viewport ] wall # frustum description { bottom_left [ float float float ] bottom_right [ float float float ] top_left [ float float float ] } projection # alternate frustum description, last one wins { origin [ float float float ] distance float fov [ float float ] hpr [ float float float ] } } } canvas # 1...n times { name string layout string wall { bottom_left [ float float float ] bottom_right [ float float float ] top_left [ float float float ] } projection { origin [ float float float ] distance float fov [ float float ] hpr [ float float float ] } segment # 1...n times { channel string name string viewport [ viewport ] wall # frustum description { bottom_left [ float float float ] bottom_right [ float float float ] top_left [ float float float ] } projection # alternate frustum description, last one wins { origin [ float float float ] distance float fov [ float float ] hpr [ float float float ] } } } } compound { channel channel-ref ... }
- NV_swap_group (G-Sync)
support added:
swapbarrier { NV_group OFF | ON | unsigned NV_barrier OFF | ON | unsigned }
- Dynamic frame resolution added:
compound { zoom [ float float ] # up/downscale of parent pvp loadBalancer { mode DFR framerate float } outputframe { type texture | memory } }
- FBO Support added:
global { EQ_WINDOW_IATTR_HINT_DRAWABLE window | pbuffer | FBO } window { attributes { hint_drawable window | pbuffer | FBO } channel { drawable [ FBO_COLOR FBO_DEPTH FBO_STENCIL ] } }
- Easier thread model selection added:
global { EQ_NODE_IATTR_THREAD_MODEL ASYNC | DRAW_SYNC | LOCAL_SYNC } node { attributes { thread_model async | draw_sync | local_sync } }
- Support for accumulation buffer and multisampling added:
global { EQ_WINDOW_IATTR_PLANES_ACCUM unsigned EQ_WINDOW_IATTR_PLANES_ACCUM_ALPHA unsigned EQ_WINDOW_IATTR_PLANES_SAMPLES unsigned } window { attributes { planes_accum unsigned planes_accum_alpha unsigned planes_samples unsigned } }
- Load-Balancing added:
compound { loadBalancer { mode [ 2D | DB | VERTICAL | HORIZONTAL ] } }
- Added during implementation of
the Statistics
Overlay:
global { EQ_WINDOW_IATTR_HINT_STATISTICS off | fastest [on] | nicest } window { attributes { hint_statistics off | fastest [on] | nicest } }
- PBuffer Support added:
global { EQ_WINDOW_IATTR_HINT_DRAWABLE window | pbuffer } window { attributes { hint_drawable window | pbuffer } }
- Configurable launch command argument quotes were added after v0.4.1:
global { EQ_CONNECTION_CATTR_LAUNCH_COMMAND_QUOTE 'character' } node { connection # 0-n times, possible connections to this node { type TCPIP | SDP port unsigned hostname string command string # render client launch command command_quote 'character' # launch command argument quote char timeout unsigned # timeout in milliseconds for launch } }
- Pixel Decompositions
added:
compound { pixel [ int int int int ] # pixel decomposition (x y w h) }
- Nonthreaded Rendering
added:
global { EQ_PIPE_IATTR_HINT_THREAD off | on } pipe { attributes { hint_thread off | on } }
- Anaglyphic Stereo added:
global { EQ_COMPOUND_IATTR_STEREO_MODE QUAD | ANAGLYPH EQ_COMPOUND_IATTR_STEREO_ANAGLYPH_LEFT_MASK [ RED GREEN BLUE ] EQ_COMPOUND_IATTR_STEREO_ANAGLYPH_RIGHT_MASK [ RED GREEN BLUE ] } compound # 1-n times { attributes { stereo_mode QUAD | ANAGLYPH # default QUAD # enable visible color components stereo_anaglyph_left_mask [ RED GREEN BLUE ] # default red stereo_anaglyph_right_mask [ RED GREEN BLUE ] # df green blue } }
- Stereo and Head Tracking
added:
global { EQ_CONFIG_FATTR_EYE_BASE float EQ_WINDOW_IATTR_HINT_STEREO OFF | ON | AUTO } config # 1-n times, currently only the first one is used by the server { attributes { eye_base float # distance between left and right eye } } window { attributes { hint_stereo off | on | auto } } compound { eye [ CYCLOP LEFT RIGHT ] # monoscopic or stereo view }
- Statistics Interface
added:
global { EQ_CHANNEL_IATTR_HINT_STATISTICS off | fastest [on] | nicest } channel { attributes { hint_statistics off | fastest [on] | nicest } }
- Compounds added:
global { EQ_COMPOUND_* } compound # 1-n times { ... }
- Subpixel Decompositions
added:
compound { subpixel [ int int ] # subpixel decomposition (index size) }