TwinView is a mode of operation where two display devices (digital flat panels, CRTs, and TVs) can display the contents of a single X screen in any arbitrary configuration. This method of multiple monitor use has several distinct advantages over other techniques (such as Xinerama):
A single X screen is used. The NVIDIA driver conceals all information about multiple display devices from the X server; as far as X is concerned, there is only one screen.
Both display devices share one frame buffer. Thus, all the functionality present on a single display (e.g., accelerated OpenGL) is available with TwinView.
No additional overhead is needed to emulate having a single desktop.
If you are interested in using each display device as a separate X screen, see Chapter 15, Configuring Multiple X Screens on One Card.
To enable TwinView, you must specify the following option in the Device section of your X Config file:
You may also use any of the following options, though they are not required:
Option "MetaModes" "<list of MetaModes>" Option "SecondMonitorHorizSync" "<hsync range(s)>" Option "SecondMonitorVertRefresh" "<vrefresh range(s)>" Option "HorizSync" "<hsync range(s)>" Option "VertRefresh" "<vrefresh range(s)>" Option "TwinViewOrientation" "<relationship of head 1 to head 0>" Option "ConnectedMonitor" "<list of connected display devices>"
See detailed descriptions of each option below.
Alternatively, you can enable TwinView by running
and restarting your X server. Or, you can configure TwinView dynamically in the "Display Configuration" page in nvidia-settings.
This option is required to enable TwinView; without it, all other TwinView related options are ignored.
You specify the constraints of the second monitor through these options. The values given should follow the same convention as the "HorizSync" and "VertRefresh" entries in the Monitor section. As the XF86Config man page explains it: the ranges may be a comma separated list of distinct values and/or ranges of values, where a range is given by two distinct values separated by a dash. The HorizSync is given in kHz, and the VertRefresh is given in Hz.
These options are normally not needed: by default, the NVIDIA X driver retrieves the valid frequency ranges from the display device's EDID (see Appendix B, X Config Options for a description of the "UseEdidFreqs" option). The SecondMonitor options will override any frequency ranges retrieved from the EDID.
Which display device is "first" and which is "second" is often unclear. For this reason, you may use these options instead of the SecondMonitor versions. With these options, you can specify a semicolon-separated list of frequency ranges, each optionally prepended with a display device name. For example:
Option "HorizSync" "CRT-0: 50-110; DFP-0: 40-70" Option "VertRefresh" "CRT-0: 60-120; DFP-0: 60"
See Appendix C, Display Device Names on Display Device Names for more information.
These options are normally not needed: by default, the NVIDIA X driver retrieves the valid frequency ranges from the display device's EDID (see Appendix B, X Config Options for a description of the "UseEdidFreqs" option). The "HorizSync" and "VertRefresh" options override any frequency ranges retrieved from the EDID or any frequency ranges specified with the "SecondMonitorHorizSync" and "SecondMonitorVertRefresh" options.
MetaModes are "containers" that store information about what mode should be used on each display device at any given time. Even if only one display device is actively in use, the NVIDIA X driver always uses a MetaMode to encapsulate the mode information per display device, so that it can support dynamically enabling TwinView.
Multiple MetaModes list the combinations of modes and the sequence in which they should be used. When the NVIDIA driver tells X what modes are available, it is really the minimal bounding box of the MetaMode that is communicated to X, while the "per display device" mode is kept internal to the NVIDIA driver. In MetaMode syntax, modes within a MetaMode are comma separated, and multiple MetaModes are separated by semicolons. For example:
"<mode name 0>, <mode name 1>; <mode name 2>, <mode name 3>"
Where <mode name 0> is the name of the mode to be used on display device 0 concurrently with <mode name 1> used on display device 1. A mode switch will then cause <mode name 2> to be used on display device 0 and <mode name 3> to be used on display device 1. Here is an example MetaMode:
Option "MetaModes" "1280x1024,1280x1024; 1024x768,1024x768"
If you want a display device to not be active for a certain MetaMode, you can use the mode name "NULL", or simply omit the mode name entirely:
"1600x1200, NULL; NULL, 1024x768"
"1600x1200; , 1024x768"
Optionally, mode names can be followed by offset information to control the positioning of the display devices within the virtual screen space; e.g.,
"1600x1200 +0+0, 1024x768 +1600+0; ..."
Offset descriptions follow the conventions used in the X "-geometry" command line option; i.e., both positive and negative offsets are valid, though negative offsets are only allowed when a virtual screen size is explicitly given in the X config file.
When no offsets are given for a MetaMode, the offsets will be computed following the value of the TwinViewOrientation option (see below). Note that if offsets are given for any one of the modes in a single MetaMode, then offsets will be expected for all modes within that single MetaMode; in such a case offsets will be assumed to be +0+0 when not given.
When not explicitly given, the virtual screen size will be computed as the the bounding box of all MetaMode bounding boxes. MetaModes with a bounding box larger than an explicitly given virtual screen size will be discarded.
A MetaMode string can be further modified with a "Panning Domain" specification; e.g.,
"1024x768 @1600x1200, 800x600 @1600x1200"
A panning domain is the area in which a display device's viewport will be panned to follow the mouse. Panning actually happens on two levels with TwinView: first, an individual display device's viewport will be panned within its panning domain, as long as the viewport is contained by the bounding box of the MetaMode. Once the mouse leaves the bounding box of the MetaMode, the entire MetaMode (i.e., all display devices) will be panned to follow the mouse within the virtual screen, unless the "PanAllDisplays" X configuration option is disabled. Note that individual display devices' panning domains default to being clamped to the position of the display devices' viewports, thus the default behavior is just that viewports remain "locked" together and only perform the second type of panning.
The most beneficial use of panning domains is probably to eliminate dead areas -- regions of the virtual screen that are inaccessible due to display devices with different resolutions. For example:
produces an inaccessible region below the 1024x768 display. Specifying a panning domain for the second display device:
"1600x1200, 1024x768 @1024x1200"
provides access to that dead area by allowing you to pan the 1024x768 viewport up and down in the 1024x1200 panning domain.
Offsets can be used in conjunction with panning domains to position the panning domains in the virtual screen space (note that the offset describes the panning domain, and only affects the viewport in that the viewport must be contained within the panning domain). For example, the following describes two modes, each with a panning domain width of 1900 pixels, and the second display is positioned below the first:
"1600x1200 @1900x1200 +0+0, 1024x768 @1900x768 +0+1200"
Because it is often unclear which mode within a MetaMode will be used on each display device, mode descriptions within a MetaMode can be prepended with a display device name. For example:
"CRT-0: 1600x1200, DFP-0: 1024x768"
If no MetaMode string is specified, then the X driver uses the modes listed in the relevant "Display" subsection, attempting to place matching modes on each display device.
This option controls the positioning of the second display device relative to the first within the virtual X screen, when offsets are not explicitly given in the MetaModes. The possible values are:
"RightOf" (the default) "LeftOf" "Above" "Below" "Clone"
When "Clone" is specified, both display devices will be assigned an offset of 0,0.
Because it is often unclear which display device is "first" and which is "second", TwinViewOrientation can be confusing. You can further clarify the TwinViewOrientation with display device names to indicate which display device is positioned relative to which display device. For example:
"CRT-0 LeftOf DFP-0"
With this option you can override what the NVIDIA kernel module detects is connected to your graphics card. This may be useful, for example, if any of your display devices do not support detection using Display Data Channel (DDC) protocols. Valid values are a comma-separated list of display device names; for example:
"CRT-0, CRT-1" "CRT" "CRT-1, DFP-0"
WARNING: this option overrides what display devices are detected by the NVIDIA kernel module, and is very seldom needed. You really only need this if a display device is not detected, either because it does not provide DDC information, or because it is on the other side of a KVM (Keyboard-Video-Mouse) switch. In most other cases, it is best not to specify this option.
Just as in all X config entries, spaces are ignored and all entries are case insensitive.
Using the NV-CONTROL X extension, the display devices in use by an X screen, the mode pool for each display device, and the MetaModes for each X screen can be dynamically manipulated. The "Display Configuration" page in nvidia-settings uses this functionality to modify the MetaMode list and then uses XRandR to switch between MetaModes. This gives the ability to dynamically configure TwinView.
The details of how this works are documented in the nv-control-dpy.c sample NV-CONTROL client in the nvidia-settings source tarball.
Because the NVIDIA X driver can now transition into and out of TwinView dynamically, MetaModes are always used internally by the NVIDIA X driver, regardless of how many display devices are currently in use by the X screen and regardless of whether the TwinView X configuration option was specified.
One implication of this implementation is that each MetaMode must be uniquely identifiable to the XRandR X extension. Unfortunately, two MetaModes with the same bounding box will look the same to XRandR. For example, two MetaModes with different orientations:
"CRT: 1600x1200 +0+0, DFP: 1600x1200 +1600+0" "CRT: 1600x1200 +1600+0, DFP: 1600x1200 +0+0"
will look identical to the XRandR or XF86VidMode X extensions, because they have the same total size (3200x1200), and nvidia-settings would not be able to use XRandR to switch between these MetaModes. To work around this limitation, the NVIDIA X driver "lies" about the refresh rate of each MetaMode, using the refresh rate of the MetaMode as a unique identifier.
The XRandR extension is currently being redesigned by the X.Org community, so the refresh rate workaround may be removed at some point in the future. This workaround can also be disabled by setting the "DynamicTwinView" X configuration option to FALSE, which will disable NV-CONTROL support for manipulating MetaModes, but will cause the XRandR and XF86VidMode visible refresh rate to be accurate.
Nothing gets displayed on my second monitor; what is wrong?
Monitors that do not support monitor detection using Display Data Channel (DDC) protocols (this includes most older monitors) are not detectable by your NVIDIA card. You need to explicitly tell the NVIDIA X driver what you have connected using the "ConnectedMonitor" option; e.g.,
Option "ConnectedMonitor" "CRT, CRT"
Will window managers be able to appropriately place windows (e.g., avoiding placing windows across both display devices, or in inaccessible regions of the virtual desktop)?
Yes. The NVIDIA X driver provides a Xinerama extension that X clients (such as window managers) can use to discover the current TwinView configuration. Note that the Xinerama protocol provides no way to notify clients when a configuration change occurs, so if you modeswitch to a different MetaMode, your window manager will still think you have the previous configuration. Using the Xinerama extension, in conjunction with the XF86VidMode extension to get modeswitch events, window managers should be able to determine the TwinView configuration at any given time.
Unfortunately, the data provided by XineramaQueryScreens() appears to confuse some window managers; to work around such broken window mangers, you can disable communication of the TwinView screen layout with the "NoTwinViewXineramaInfo" X config Option (see Appendix B, X Config Options for details).
The order that display devices are reported in via the TwinView Xinerama information can be configured with the TwinViewXineramaInfoOrder X configuration option.
Be aware that the NVIDIA driver cannot provide the Xinerama extension if the X server's own Xinerama extension is being used. Explicitly specifying Xinerama in the X config file or on the X server commandline will prohibit NVIDIA's Xinerama extension from installing, so make sure that the X server's log file does not contain:
(++) Xinerama: enabled
if you want the NVIDIA driver to be able to provide the Xinerama extension while in TwinView.
Another solution is to use panning domains to eliminate inaccessible regions of the virtual screen (see the MetaMode description above).
A third solution is to use two separate X screens, rather than use TwinView. See Chapter 15, Configuring Multiple X Screens on One Card.
Why can I not get a resolution of 1600x1200 on the second display device when using a GeForce2 MX?
Because the second display device on the GeForce2 MX was designed to be a digital flat panel, the Pixel Clock for the second display device is only 150 MHz. This effectively limits the resolution on the second display device to somewhere around 1280x1024 (for a description of how Pixel Clock frequencies limit the programmable modes, see the XFree86 Video Timings HOWTO). This constraint is not present on GeForce4 or GeForce FX GPUs -- the maximum pixel clock is the same on both heads.
Do video overlays work across both display devices?
Hardware video overlays only work on the first display device. The current solution is that blitted video is used instead on TwinView.
How are virtual screen dimensions determined in TwinView?
After all requested modes have been validated, and the offsets for each MetaMode's viewports have been computed, the NVIDIA driver computes the bounding box of the panning domains for each MetaMode. The maximum bounding box width and height is then found.
Note that one side effect of this is that the virtual width and virtual height may come from different MetaModes. Given the following MetaMode string:
"1600x1200,NULL; 1024x768+0+0, 1024x768+0+768"
the resulting virtual screen size will be 1600 x 1536.
Can I play full screen games across both display devices?
Yes. While the details of configuration will vary from game to game, the basic idea is that a MetaMode presents X with a mode whose resolution is the bounding box of the viewports for that MetaMode. For example, the following:
Option "MetaModes" "1024x768,1024x768; 800x600,800x600" Option "TwinViewOrientation" "RightOf"
produce two modes: one whose resolution is 2048x768, and another whose resolution is 1600x600. Games such as Quake 3 Arena use the VidMode extension to discover the resolutions of the modes currently available. To configure Quake 3 Arena to use the above MetaMode string, add the following to your q3config.cfg file:
seta r_customaspect "1" seta r_customheight "600" seta r_customwidth "1600" seta r_fullscreen "1" seta r_mode "-1"
Note that, given the above configuration, there is no mode with a resolution of 800x600 (remember that the MetaMode "800x600, 800x600" has a resolution of 1600x600"), so if you change Quake 3 Arena to use a resolution of 800x600, it will display in the lower left corner of your screen, with the rest of the screen grayed out. To have single head modes available as well, an appropriate MetaMode string might be something like:
"800x600,800x600; 1024x768,NULL; 800x600,NULL; 640x480,NULL"
More precise configuration information for specific games is beyond the scope of this document, but the above examples coupled with numerous online sources should be enough to point you in the right direction.