Home | History | Annotate | only in /xsrc/external/mit/xorg-server.old/dist/hw/xfree86/doc
Up to higher level directory
NameDateSize
devel/19-Feb-2026
Makefile.am09-Jun-201655
Makefile.in09-Jun-201620.9K
man/19-Feb-2026
README.modes09-Jun-201616.5K
sgml/19-Feb-2026

README.modes

      1 		    Multi-monitor Mode Setting APIs
      2 	           Keith Packard, <keithp (a] keithp.com
      3 		   	   6 March 2007
      4 
      5 1. Introduction
      6 
      7 This document describes a set of mode setting APIs added in X server version
      8 1.3 that support multiple monitors per card. These interfaces expose the
      9 underlying hardware CRTC and output concepts to the xf86 DDX layer so that
     10 the implementation of initial server setup and mode changes through
     11 extensions can be shared across drivers. In addition, these new interfaces
     12 support a new configuration mechanism as well which allows each monitor to
     13 be customized separately providing a consistent cross-driver configuration
     14 mechanism that supports the full range of output features.
     15 
     16 All of the code implementing this interface can be found in hw/xfree86/modes
     17 in the X server sources.
     18 
     19 2. Overview
     20 
     21 This document describes both the driver API and the configuration data
     22 placed in xorg.conf; these are entirely separate as the driver has no
     23 interaction with the configuration information at all. Much of the structure
     24 here is cloned from the RandR extension version 1.2 additions which deal
     25 with the same kinds of information.
     26 
     27 2.1 API overview
     28 
     29 The mode setting API is expressed through two new driver-visible objects,
     30 the 'CRTC' (xf86CrtcRec) and the 'Output' (xf86OutputRec). A CRTC refers to
     31 hardware within the video system that can scan a subset of the framebuffer
     32 and generate a video signal. An Output receives that signal and transmits it
     33 to a monitor, projector or other device.
     34 
     35 The xf86CrtcRec and xf86OutputRec contain a small amount of state data
     36 related to the object along with a pointer to a set of functions provided by
     37 the driver that manipulate the object in fairly simple ways.
     38 
     39 To emulate older behaviour, one of the outputs is picked as the 'compat'
     40 output; this output changes over time as outputs are detected and used, the
     41 goal is to always have one 'special' output which is used for operations
     42 which need a single defined monitor (like XFree86-VidModeExtension mode
     43 setting, RandR 1.1 mode setting, DDC property setting, etc.).
     44 
     45 2.1.1 Output overview 
     46 
     47 As outputs are connected to monitors, they hold a list of modes supported by
     48 the monitor. If the monitor and output support DDC, then the list of modes
     49 generally comes from the EDID data in the monitor. Otherwise, the server
     50 uses the standard VESA modes, pruned by monitor timing. If the configuration
     51 file doesn't contain monitor timing data, the server uses default timing
     52 information which supports 640x480, 800x600 and 1024x768 all with a 60Hz
     53 refresh rate.
     54 
     55 As hardware often limits possible configuration combinations, each output
     56 knows the set of CRTCs that it can be connected to as well as the set of
     57 other outputs which can be simutaneously connected to a CRTC.
     58 
     59 2.1.2 CRTC overview
     60 
     61 CRTCs serve only to stream frame buffer data to outputs using a mode line.
     62 Ideally, they would not be presented to the user at all, and in fact the
     63 configuration file doesn't expose them. The RandR 1.2 protocol does, but the
     64 hope there is that client-side applications will hide them carefully away.
     65 
     66 Each crtc has an associated cursor, along with the current configuration.
     67 All of the data needed to determine valid configurations is contained within
     68 the Outputs.
     69 
     70 2.2 Configuration overview
     71 
     72 As outputs drive monitors, the "Monitor" section has been repurposed to
     73 define their configuration. This provides for a bit more syntax than
     74 the large list of driver-specific options that were used in the past for
     75 similar configuration.
     76 
     77 However, the existing "Monitor" section referenced by the active "Screen"
     78 section no longer has any use at all; some sensible meaning for this
     79 parameter is needed now that a Screen can have multiple Monitors.
     80 
     81 3. Public Functions
     82 
     83 3.1 PreInit functions
     84 
     85 These functions should be used during the driver PreInit phase, they are
     86 arranged in the order they should be invoked.
     87 
     88     void
     89     xf86CrtcConfigInit (ScrnInfoPtr			scrn
     90 			const xf86CrtcConfigFuncsRec	*funcs)
     91 
     92 This function allocates and initializes structures needed to track CRTC and
     93 Output state.
     94 
     95     void
     96     xf86CrtcSetSizeRange (ScrnInfoPtr scrn,
     97 			  int minWidth, int minHeight,
     98 			  int maxWidth, int maxHeight)
     99 
    100 This sets the range of screen sizes supported by the driver.
    101 
    102     xf86CrtcPtr
    103     xf86CrtcCreate (ScrnInfoPtr             scrn,
    104 		    const xf86CrtcFuncsRec  *funcs)
    105     
    106 Create one CRTC object. See the discussion below for a description of the
    107 contents of the xf86CrtcFuncsRec. Note that this is done in PreInit, so it
    108 should not be re-invoked at each server generation. Create one of these for
    109 each CRTC present in the hardware.
    110     
    111     xf86OutputPtr
    112     xf86OutputCreate (ScrnInfoPtr              scrn,
    113 		      const xf86OutputFuncsRec *funcs,
    114 		      const char	       *name)
    115 
    116 Create one Output object. See the discussion below for a description of the
    117 contents of the xf86OutputFuncsRec. This is also called from PreInit and
    118 need not be re-invoked at each ScreenInit time. An Output should be created
    119 for every Output present in the hardware, not just for outputs which have
    120 detected monitors.
    121     
    122     Bool
    123     xf86OutputRename (xf86OutputPtr output, const char *name)
    124 
    125 If necessary, the name of an output can be changed after it is created using
    126 this function.
    127     
    128     Bool
    129     xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
    130 
    131 Using the resources provided, and the configuration specified by the user,
    132 this function computes an initial configuration for the server. It tries to
    133 enable as much hardware as possible using some fairly simple heuristics. 
    134 
    135 The 'canGrow' parameter indicates that the frame buffer does not have a fixed
    136 size (fixed size frame buffers are required by XAA). When the frame buffer
    137 has a fixed size, the configuration selects a 'reasonablely large' frame
    138 buffer so that common reconfiguration options are possible. For resizable
    139 frame buffers, the frame buffer is set to the smallest size that encloses
    140 the desired configuration.
    141     
    142 3.2 ScreenInit functions
    143 
    144 These functions should be used during the driver ScreenInit phase.
    145 
    146     Bool
    147     xf86DiDGAInit (ScreenPtr screen, unsigned long dga_address)
    148 
    149 This function provides driver-independent accelerated DGA support for some
    150 of the DGA operations; using this, the driver can avoid needing to implement
    151 any of the rest of DGA.
    152 
    153     Bool
    154     xf86SaveScreen(ScreenPtr pScreen, int mode)
    155 
    156 Stick this in pScreen->SaveScreen and the core X screen saver will be
    157 implemented by disabling outputs and crtcs using their dpms functions.
    158 
    159     void
    160     xf86DPMSSet(ScrnInfoPtr scrn, int mode, int flags)
    161 
    162 Pass this function to xf86DPMSInit and all DPMS mode switching will be
    163 managed by using the dpms functions provided by the Outputs and CRTCs.
    164 
    165     Bool
    166     xf86CrtcScreenInit (ScreenPtr screen)
    167 
    168 This function completes the screen initialization process for the crtc and
    169 output objects. Call it near the end of the ScreenInit function, after the
    170 frame buffer and acceleration layers have been added.
    171 
    172 3.3 EnterVT functions
    173 
    174 Functions used during EnterVT, or whenever the current configuration needs
    175 to be applied to the hardware.
    176 
    177     Bool
    178     xf86SetDesiredModes (ScrnInfoPtr scrn)
    179 
    180 xf86InitialConfiguration selects the desired configuration at PreInit time;
    181 when the server finally hits ScreenInit, xf86SetDesiredModes is used by the
    182 driver to take that configuration and apply it to the hardware. In addition,
    183 successful mode selection at other times updates the configuration that will
    184 be used by this function, so LeaveVT/EnterVT pairs can simply invoke this
    185 and return to the previous configuration.
    186 
    187 3.4 SwitchMode functions
    188 
    189 Functions called from the pScrn->SwitchMode hook, which is used by the
    190 XFree86-VidModeExtension and the keypad mode switch commands.
    191 
    192     Bool
    193     xf86SetSingleMode (ScrnInfoPtr	scrn, 
    194 		       DisplayModePtr   desired,
    195 		       Rotation		rotation)
    196 
    197 This function applies the specified mode to all active outputs. Which is to
    198 say, it picks reasonable modes for all active outputs, attempting to get the
    199 screen to the specified size while not breaking anything that is currently
    200 working.
    201 
    202 3.7 get_modes functions
    203 
    204 Functions called during output->get_modes to help build lists of modes
    205 
    206     xf86MonPtr
    207     xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus)
    208 
    209 This returns the EDID data structure for the 'output' using the I2C bus
    210 'pDDCBus'. This has no effect on 'output' itself.
    211 
    212     void
    213     xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon)
    214 
    215 Once the EDID data has been fetched, this call applies the EDID data to the
    216 output object, setting the physical size and also various properties, like
    217 the DDC root window property (when output is the 'compat' output), and the
    218 RandR 1.2 EDID output properties.
    219 
    220     DisplayModePtr
    221     xf86OutputGetEDIDModes (xf86OutputPtr output)
    222 
    223 Given an EDID data structure, this function computes a list of suitable
    224 modes. This function also applies a sequence of 'quirks' during this process
    225 so that the returned modes may not actually match the mode data present in
    226 the EDID data.
    227 
    228 3.6 Other functions
    229 
    230 These remaining functions in the API can be used by the driver as needed.
    231 
    232     Bool
    233     xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
    234 		     int x, int y)
    235 
    236 Applies a mode to a CRTC. All of the outputs which are currently using the
    237 specified CRTC are included in the mode setting process. 'x' and 'y' are the
    238 offset within the frame buffer that the crtc is placed at. No checking is
    239 done in this function to ensure that the mode is usable by the active
    240 outputs.
    241     
    242     void
    243     xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY)
    244 
    245 This discards the mode lists for all outputs, re-detects monitor presence
    246 and then acquires new mode lists for all monitors which are not disconnected.
    247 Monitor configuration data is used to modify the mode lists returned by the
    248 outputs. 'maxX' and 'maxY' limit the maximum size modes that will be
    249 returned.
    250     
    251     void
    252     xf86SetScrnInfoModes (ScrnInfoPtr pScrn)
    253 
    254 This copies the 'compat' output mode list into the pScrn modes list which is
    255 used by the XFree86-VidModeExtension and the keypad mode switching
    256 operations. The current 'desired' mode for the CRTC associated with the
    257 'compat' output is placed first in this list to indicate the current mode.
    258 Usually, the driver won't need to call this function as
    259 xf86InitialConfiguration will do so automatically, as well as any RandR
    260 functions which reprobe for modes. However, if the driver reprobes for modes
    261 at other times using xf86ProbeOutputModes, this function needs to be called.
    262     
    263     Bool
    264     xf86DiDGAReInit (ScreenPtr pScreen)
    265 
    266 This is similar to xf86SetScrnInfoModes, but it applies the 'compat' output
    267 mode list to the set of modes advertised by the DGA extension; it needs to
    268 be called whenever xf86ProbeOutputModes is invoked.
    269 
    270     void
    271     xf86DisableUnusedFunctions(ScrnInfoPtr pScrn)
    272 
    273 After any sequence of calls using xf86CrtcSetMode, this function cleans up
    274 any leftover Output and CRTC objects by disabling them, saving power. It is
    275 safe to call this whenever the server is running as it only disables objects
    276 which are not currently in use.
    277     
    278 4. CRTC operations
    279 
    280 4.1 CRTC functions
    281 
    282 These functions provide an abstract interface for the CRTC object; most
    283 manipulation of the CRTC object is done through these functions.
    284 
    285     void
    286     crtc->funcs->dpms (xf86CrtcPtr crtc, int mode)
    287 
    288 Where 'mode' is one of DPMSModeOff, DPMSModeSuspend, DPMSModeStandby or
    289 DPMSModeOn. This requests that the crtc go to the specified power state.
    290 When changing power states, the output dpms functions are invoked before the
    291 crtc dpms functions.
    292 
    293     void
    294     crtc->funcs->save (xf86CrtcPtr crtc)
    295 	
    296     void
    297     crtc->funcs->restore (xf86CrtcPtr crtc)
    298 
    299 Preserve/restore any register contents related to the CRTC. These are
    300 strictly a convenience for the driver writer; if the existing driver has
    301 fully operation save/restore functions, you need not place any additional
    302 code here. In particular, the server itself never uses this function.
    303 
    304     Bool
    305     crtc->funcs->lock (xf86CrtcPtr crtc)
    306 	
    307     void
    308     crtc->funcs->unlock (xf86CrtcPtr crtc)
    309 
    310 These functions are invoked around mode setting operations; the intent is
    311 that DRI locking be done here to prevent DRI applications from manipulating
    312 the hardware while the server is busy changing the output configuration. If
    313 the lock function returns FALSE, the unlock function will not be invoked.
    314 
    315     Bool
    316     crtc->funcs->mode_fixup (xf86CrtcPtr crtc, 
    317 			     DisplayModePtr mode,
    318 			     DisplayModePtr adjusted_mode)
    319 
    320 This call gives the CRTC a chance to see what mode will be set and to
    321 comment on the mode by changing 'adjusted_mode' as needed. This function
    322 shall not modify the state of the crtc hardware at all. If the CRTC cannot
    323 accept this mode, this function may return FALSE.
    324 
    325     void
    326     crtc->funcs->prepare (xf86CrtcPtr crtc)
    327 
    328 This call is made just before the mode is set to make the hardware ready for
    329 the operation. A usual function to perform here is to disable the crtc so
    330 that mode setting can occur with clocks turned off and outputs deactivated.
    331 
    332     void
    333     crtc->funcs->mode_set (xf86CrtcPtr crtc,
    334 			   DisplayModePtr mode,
    335 			   DisplayModePtr adjusted_mode)
    336 
    337 This function applies the specified mode (possibly adjusted by the CRTC
    338 and/or Outputs).
    339 
    340     void
    341     crtc->funcs->commit (xf86CrtcPtr crtc)
    342 
    343 Once the mode has been applied to the CRTC and Outputs, this function is
    344 invoked to let the hardware turn things back on.
    345 
    346     void
    347     crtc->funcs->gamma_set (xf86CrtcPtr crtc, CARD16 *red,
    348 			    CARD16 *green, CARD16 *blue, int size)
    349 
    350 This function adjusts the gamma ramps for the specified crtc.
    351 
    352     void *
    353     crtc->funcs->shadow_allocate (xf86CrtcPtr crtc, int width, int height)
    354 
    355 This function allocates frame buffer space for a shadow frame buffer. When
    356 allocated, the crtc must scan from the shadow instead of the main frame
    357 buffer. This is used for rotation. The address returned is passed to the
    358 shadow_create function. This function should return NULL on failure.
    359 
    360     PixmapPtr
    361     crtc->funcs->shadow_create (xf86CrtcPtr crtc, void *data,
    362 				int width, int height)
    363 
    364 This function creates a pixmap object that will be used as a shadow of the
    365 main frame buffer for CRTCs which are rotated or reflected. 'data' is the
    366 value returned by shadow_allocate.
    367 
    368     void
    369     crtc->funcs->shadow_destroy (xf86CrtcPtr crtc, PixmapPtr pPixmap,
    370 				 void *data)
    371 
    372 Destroys any associated shadow objects. If pPixmap is NULL, then a pixmap
    373 was not created, but 'data' may still be non-NULL indicating that the shadow
    374 had been allocated.
    375 
    376     void
    377     crtc->funcs->destroy (xf86CrtcPtr crtc)
    378 
    379 When a CRTC is destroyed (which only happens in error cases), this function
    380 can clean up any driver-specific data.
    381 
    382 4.2 CRTC fields
    383 
    384 The CRTC object is not opaque; there are several fields of interest to the
    385 driver writer.
    386 
    387     struct _xf86Crtc {
    388 	/**
    389 	 * Associated ScrnInfo
    390 	 */
    391 	ScrnInfoPtr     scrn;
    392     
    393 	/**
    394 	 * Active state of this CRTC
    395 	 *
    396 	 * Set when this CRTC is driving one or more outputs
    397 	 */
    398 	Bool            enabled;
    399     
    400 	/** Track whether cursor is within CRTC range  */
    401 	Bool            cursorInRange;
    402     
    403 	/** Track state of cursor associated with this CRTC */
    404 	Bool            cursorShown;
    405     
    406 	/**
    407 	 * Active mode
    408 	 *
    409 	 * This reflects the mode as set in the CRTC currently
    410 	 * It will be cleared when the VT is not active or
    411 	 * during server startup
    412 	 */
    413 	DisplayModeRec  mode;
    414 	Rotation        rotation;
    415 	PixmapPtr       rotatedPixmap;
    416 	void            *rotatedData;
    417     
    418 	/**
    419 	 * Position on screen
    420 	 *
    421 	 * Locates this CRTC within the frame buffer
    422 	 */
    423 	int             x, y;
    424     
    425 	/**
    426 	 * Desired mode
    427 	 *
    428 	 * This is set to the requested mode, independent of
    429 	 * whether the VT is active. In particular, it receives
    430 	 * the startup configured mode and saves the active mode
    431 	 * on VT switch.
    432 	 */
    433 	DisplayModeRec  desiredMode;
    434 	Rotation        desiredRotation;
    435 	int             desiredX, desiredY;
    436     
    437 	/** crtc-specific functions */
    438 	const xf86CrtcFuncsRec *funcs;
    439     
    440 	/**
    441 	 * Driver private
    442 	 *
    443 	 * Holds driver-private information
    444 	 */
    445 	void            *driver_private;
    446     #ifdef RANDR_12_INTERFACE
    447 	/**
    448 	 * RandR crtc
    449 	 *
    450 	 * When RandR 1.2 is available, this
    451 	 * points at the associated crtc object
    452 	 */
    453 	RRCrtcPtr       randr_crtc;
    454     #else
    455 	void            *randr_crtc;
    456     #endif
    457     };
    458 
    459     
    460 5. Output functions.
    461 
    462 6. Configuration
    463 
    464 Because the configuration file syntax is fixed,
    465 this was done by creating new "Driver" section options that hook specific
    466 outputs to specific "Monitor" sections in the file. The option:
    467 section of the form:
    468 
    469 	Option	"monitor-VGA" "My VGA Monitor"
    470 
    471 connects the VGA output of this driver to the "Monitor" section with
    472 Identifier "My VGA Monitor". All of the usual monitor options can now be
    473 placed in that "Monitor" section and will be applied to the VGA output
    474 configuration.
    475