This is a (very) brief summary of some of things that need to be done to write a Frame Lock NV-CONTROL client. Please see samples/nv-control-framelock.c for a basic Frame Lock client. See the file ctkframelock.c for a much more involved example of how the nvidia-settings utility programs the Frame Lock attributes. The constants referenced below are defined in NVCtrl.h. Please see the comments in that file for an explanation of each attribute. It may also be instructive to grep ctkframelock.c to see how each attribute is used. Querying frame lock capabilities of a system: - Query the number of Quadro Sync devices on the system by passing NV_CTRL_TARGET_TYPE_FRAMELOCK to XNVCTRLQueryTargetCount() - Query the GPUs attached to each Quadro Sync device by querying the NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK attribute for each Quadro Sync device. - Query the enabled (available) display devices on each GPU through the NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU and NV_CTRL_DISPLAY_ENABLED attributes. - Query whether each display may be configured as Frame Lock server or client through the NV_CTRL_FRAMELOCK_DISPLAY_CONFIG attribute. Configuring the Frame Lock group (This must be done while Frame Lock Sync is disabled on the GPU/Quadro Sync Device): - Set one display device as Frame Lock server through the NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_SERVER attribute. - Set the rest of the display devices as Frame Lock clients through the NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_CLIENT attribute. - Set NV_CTRL_USE_HOUSE_SYNC to NV_CTRL_USE_HOUSE_SYNC_TRUE or NV_CTRL_USE_HOUSE_SYNC_FALSE on the server Quadro Sync device (this is the Quadro Sync device that is attached to the GPU that contains the display device currently set as the Frame Lock server.) Depending on whether or not you will be using a House Sync signal. - Set NV_CTRL_FRAMELOCK_POLARITY for each client Quadro Sync device in the cluster; most likely you want NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE. - Set NV_CTRL_FRAMELOCK_SYNC_DELAY as appropriate for each Quadro Sync device. Most likely you want 0. - Set NV_CTRL_FRAMELOCK_SYNC_INTERVAL as appropriate if you are using house sync. Most likely, you just want 0. Enabling/Disabling Frame Lock: - Enable Frame Lock on each GPU by setting NV_CTRL_FRAMELOCK_SYNC to NV_CTRL_FRAMELOCK_SYNC_ENABLE. - (optional) set NV_CTRL_FRAMELOCK_TEST_SIGNAL to NV_CTRL_FRAMELOCK_TEST_SIGNAL_ENABLE followed immediately by NV_CTRL_FRAMELOCK_TEST_SIGNAL_DISABLE (on the GPU that contains the server Frame Lock display device.) This guarantees accuracy of the Universal Frame Count (as returned by glXQueryFrameCountNV()). - When you are done, set NV_CTRL_FRAMELOCK_SYNC to NV_CTRL_FRAMELOCK_SYNC_DISABLE on each GPU to disable Frame Lock. During operation, you can also query any of these on each GPU or Frame Lock device: NV_CTRL_FRAMELOCK_PORT0_STATUS NV_CTRL_FRAMELOCK_PORT1_STATUS NV_CTRL_FRAMELOCK_HOUSE_STATUS NV_CTRL_FRAMELOCK_SYNC_READY NV_CTRL_FRAMELOCK_STEREO_SYNC NV_CTRL_FRAMELOCK_ETHERNET_DETECTED NV_CTRL_FRAMELOCK_SYNC_RATE NV_CTRL_FRAMELOCK_TIMING (nvidia-settings registers a gtk+ timeout function and queries the state of these on each X screen every few seconds).