Hands-on Projects for the Linux Graphics Subsystem
|
InitOutput() is one of the major routines called by main(). A nice description of what InitOutput() does can be found in the DESIGN document. In a nutshell "InitOutput() is expected to fill in the global screenInfo struct, and one screenInfo.screen[] entry for each screen present."
The following data structures are important in the study of InitOutput():
xf86Info is defined and initialized as:
/* Globals that video drivers may not access */ xf86InfoRec xf86Info = { NULL, /* pKeyboard */ NULL, /* kbdProc */ NULL, /* kbdEvents */ -1, /* consoleFd */ -1, /* kbdFd */ -1, /* vtno */ -1, /* kbdType */ -1, /* kbdRate */ -1, /* kbdDelay */ -1, /* bell_pitch */ -1, /* bell_duration */ TRUE, /* autoRepeat */ 0, /* leds */ 0, /* xleds */ NULL, /* vtinit */ 0, /* scanPrefix */ FALSE, /* capsLock */ FALSE, /* numLock */ FALSE, /* scrollLock */ FALSE, /* modeSwitchLock */ FALSE, /* composeLock */ FALSE, /* vtSysreq */ SKWhenNeeded, /* ddxSpecialKeys */ FALSE, /* ActionKeyBindingsSet */ #if defined(SVR4) && defined(i386) FALSE, /* panix106 */ #endif #if defined(__OpenBSD__) || defined(__NetBSD__) 0, /* wskbdType */ #endif NULL, /* pMouse */ #ifdef XINPUT NULL, /* mouseLocal */ #endif -1, /* lastEventTime */ FALSE, /* vtRequestsPending */ FALSE, /* inputPending */ FALSE, /* dontVTSwitch */ FALSE, /* dontZap */ FALSE, /* dontZoom */ FALSE, /* notrapSignals */ FALSE, /* caughtSignal */ FALSE, /* sharedMonitor */ NULL, /* currentScreen */ #ifdef CSRG_BASED -1, /* screenFd */ -1, /* consType */ #endif #ifdef XKB NULL, /* xkbkeymap */ NULL, /* xkbkeycodes */ NULL, /* xkbtypes */ NULL, /* xkbcompat */ NULL, /* xkbsymbols */ NULL, /* xkbgeometry */ FALSE, /* xkbcomponents_specified */ NULL, /* xkbrules */ NULL, /* xkbmodel */ NULL, /* xkblayout */ NULL, /* xkbvariant */ NULL, /* xkboptions */ #endif FALSE, /* allowMouseOpenFail */ TRUE, /* vidModeEnabled */ FALSE, /* vidModeAllowNonLocal */ TRUE, /* miscModInDevEnabled */ FALSE, /* miscModInDevAllowNonLocal */ PCIOsConfig, /* pciFlags */ Pix24DontCare, /* pixmap24 */ X_DEFAULT, /* pix24From */ #if defined(i386) || defined(__i386__) FALSE, /* pc98 */ #endif TRUE, /* pmFlag */ LogNone, /* syncLog */ 0, /* estimateSizesAggressively */ FALSE, /* kbdCustomKeycodes */ FALSE, /* disableRandR */ X_DEFAULT /* randRFrom */ }; |
where xf86InfoRec is defined as:
/* * xf86InfoRec contains global parameters which the video drivers never * need to access. Global parameters which the video drivers do need * should be individual globals. */ typedef struct { /* keyboard part */ DeviceIntPtr pKeyboard; DeviceProc kbdProc; /* procedure for initializing */ void (* kbdEvents)(void); /* proc for processing events */ int consoleFd; int kbdFd; int vtno; int kbdType; /* AT84 / AT101 */ int kbdRate; int kbdDelay; int bell_pitch; int bell_duration; Bool autoRepeat; unsigned long leds; unsigned long xleds; char * vtinit; int scanPrefix; /* scancode-state */ Bool capsLock; Bool numLock; Bool scrollLock; Bool modeSwitchLock; Bool composeLock; Bool vtSysreq; SpecialKeysInDDX ddxSpecialKeys; Bool ActionKeyBindingsSet; #if defined(SVR4) && defined(i386) Bool panix106; #endif /* SVR4 && i386 */ #if defined(__OpenBSD__) || defined(__NetBSD__) int wsKbdType; #endif /* mouse part */ DeviceIntPtr pMouse; #ifdef XINPUT pointer mouseLocal; #endif /* event handler part */ int lastEventTime; Bool vtRequestsPending; Bool inputPending; Bool dontVTSwitch; Bool dontZap; Bool dontZoom; Bool notrapSignals; /* don't exit cleanly - die at fault */ Bool caughtSignal; /* graphics part */ Bool sharedMonitor; ScreenPtr currentScreen; #if defined(CSRG_BASED) || defined(__FreeBSD_kernel__) int screenFd; /* fd for memory mapped access to * vga card */ int consType; /* Which console driver? */ #endif #ifdef XKB /* * would like to use an XkbComponentNamesRec here but can't without * pulling in a bunch of header files. :-( */ char * xkbkeymap; char * xkbkeycodes; char * xkbtypes; char * xkbcompat; char * xkbsymbols; char * xkbgeometry; Bool xkbcomponents_specified; char * xkbrules; char * xkbmodel; char * xkblayout; char * xkbvariant; char * xkboptions; #endif /* Other things */ Bool allowMouseOpenFail; Bool vidModeEnabled; /* VidMode extension enabled */ Bool vidModeAllowNonLocal; /* allow non-local VidMode * connections */ Bool miscModInDevEnabled; /* Allow input devices to be * changed */ Bool miscModInDevAllowNonLocal; PciProbeType pciFlags; Pix24Flags pixmap24; MessageType pix24From; #if defined(i386) || defined(__i386__) Bool pc98; #endif Bool pmFlag; Log log; int estimateSizesAggressively; Bool kbdCustomKeycodes; Bool disableRandR; MessageType randRFrom; struct { Bool disabled; /* enable/disable deactivating * grabs or closing the * connection to the grabbing * client */ ClientPtr override; /* client that disabled * grab deactivation. */ Bool allowDeactivate; Bool allowClosedown; ServerGrabInfoRec server; } grabInfo; } xf86InfoRec, *xf86InfoPtr; |
The initialization values come from other source files, for instance Pix24DontCare comes from xf86str.h as:
/* flags for depth 24 pixmap options */ typedef enum { Pix24DontCare = 0, Pix24Use24, Pix24Use32 } Pix24Flags; |
xf86InfoRec is described in the DESIGN document as:
8.2 Data handling Config file data contains parts that are global, and parts that are Screen specific. All of it is parsed into data structures that neither the drivers or most other parts of the server need to know about. The global data is typically not required by drivers, and as such, most of it is stored in the private xf86InfoRec. The screen-specific data collected from the config file is stored in screen, device, display, monitor-specific data structures that are separate from the ScrnInfoRecs, with the appropriate elements/fields hooked into the ScrnIn- foRecs as required. The screen config data is held in confScreenRec, device data in the GDevRec, monitor data in the MonRec, and display data in the Dis- pRec. |
xf86Info's fields are set from the command line or from the config file (xorg.conf). In the latter case this takes place in configServerFlags, which is called by xf86HandleConfigFile(), called by DoConfigure() (see section 3.2.2.4). For instance the pixmap24 field as seen above is initialized with the value Pix24DontCare. However if the "-pixmap24" Option of the xorg.conf is set configServerFlags() assigns a different value.
ScrnInfoRec is defined as:
typedef struct _ScrnInfoRec { int driverVersion; char * driverName; /* canonical name used in */ /* the config file */ ScreenPtr pScreen; /* Pointer to the ScreenRec */ int scrnIndex; /* Number of this screen */ Bool configured; /* Is this screen valid */ int origIndex; /* initial number assigned to * this screen before * finalising the number of * available screens */ /* Display-wide screenInfo values needed by this screen */ int imageByteOrder; int bitmapScanlineUnit; int bitmapScanlinePad; int bitmapBitOrder; int numFormats; PixmapFormatRec formats[MAXFORMATS]; PixmapFormatRec fbFormat; int bitsPerPixel; /* fb bpp */ Pix24Flags pixmap24; /* pixmap pref for depth 24 */ int depth; /* depth of default visual */ MessageType depthFrom; /* set from config? */ MessageType bitsPerPixelFrom; /* set from config? */ rgb weight; /* r/g/b weights */ rgb mask; /* rgb masks */ rgb offset; /* rgb offsets */ int rgbBits; /* Number of bits in r/g/b */ Gamma gamma; /* Gamma of the monitor */ int defaultVisual; /* default visual class */ int maxHValue; /* max horizontal timing */ int maxVValue; /* max vertical timing value */ int virtualX; /* Virtual width */ int virtualY; /* Virtual height */ int xInc; /* Horizontal timing increment */ MessageType virtualFrom; /* set from config? */ int displayWidth; /* memory pitch */ int frameX0; /* viewport position */ int frameY0; int frameX1; int frameY1; int zoomLocked; /* Disallow mode changes */ DisplayModePtr modePool; /* list of compatible modes */ DisplayModePtr modes; /* list of actual modes */ DisplayModePtr currentMode; /* current mode * This was previously * overloaded with the modes * field, which is a pointer * into a circular list */ confScreenPtr confScreen; /* Screen config info */ MonPtr monitor; /* Monitor information */ DispPtr display; /* Display information */ int * entityList; /* List of device entities */ int numEntities; int widthmm; /* physical display dimensions * in mm */ int heightmm; int xDpi; /* width DPI */ int yDpi; /* height DPI */ char * name; /* Name to prefix messages */ pointer driverPrivate; /* Driver private area */ DevUnion * privates; /* Other privates can hook in * here */ DriverPtr drv; /* xf86DriverList[] entry */ pointer module; /* Pointer to module head */ int colorKey; int overlayFlags; /* Some of these may be moved out of here into the driver private area */ char * chipset; /* chipset name */ char * ramdac; /* ramdac name */ char * clockchip; /* clock name */ Bool progClock; /* clock is programmable */ int numClocks; /* number of clocks */ int clock[MAXCLOCKS]; /* list of clock frequencies */ int videoRam; /* amount of video ram (kb) */ unsigned long biosBase; /* Base address of video BIOS */ unsigned long memPhysBase; /* Physical address of FB */ unsigned long fbOffset; /* Offset of FB in the above */ IOADDRESS domainIOBase; /* Domain I/O base address */ int memClk; /* memory clock */ int textClockFreq; /* clock of text mode */ Bool flipPixels; /* swap default black/white */ pointer options; int chipID; int chipRev; int racMemFlags; int racIoFlags; pointer access; xf86CurrentAccessPtr CurrentAccess; resType resourceType; pointer busAccess; /* Allow screens to be enabled/disabled individually */ Bool vtSema; DevUnion pixmapPrivate; /* saved devPrivate from pixmap */ /* hw cursor moves at SIGIO time */ Bool silkenMouse; /* Storage for clockRanges and adjustFlags for use with the VidMode ext */ ClockRangesPtr clockRanges; int adjustFlags; /* * These can be used when the minor ABI version is incremented. * The NUM_* parameters must be reduced appropriately to keep the * structure size and alignment unchanged. */ int reservedInt[NUM_RESERVED_INTS]; int * entityInstanceList; pointer reservedPtr[NUM_RESERVED_POINTERS]; /* * Driver entry points. * */ xf86ProbeProc *Probe; xf86PreInitProc *PreInit; xf86ScreenInitProc *ScreenInit; xf86SwitchModeProc *SwitchMode; xf86AdjustFrameProc *AdjustFrame; xf86EnterVTProc *EnterVT; xf86LeaveVTProc *LeaveVT; xf86FreeScreenProc *FreeScreen; xf86ValidModeProc *ValidMode; xf86EnableDisableFBAccessProc *EnableDisableFBAccess; xf86SetDGAModeProc *SetDGAMode; xf86ChangeGammaProc *ChangeGamma; xf86PointerMovedProc *PointerMoved; xf86PMEventProc *PMEvent; xf86HandleMessageProc *HandleMessage; xf86DPMSSetProc *DPMSSet; xf86LoadPaletteProc *LoadPalette; xf86SetOverscanProc *SetOverscan; xorgDriverFuncProc *DriverFunc; /* * This can be used when the minor ABI version is incremented. * The NUM_* parameter must be reduced appropriately to keep the * structure size and alignment unchanged. */ funcPointer reservedFuncs[NUM_RESERVED_FUNCS]; } ScrnInfoRec; |
screenInfo is defined as:
typedef struct _ScreenInfo { int imageByteOrder; int bitmapScanlineUnit; int bitmapScanlinePad; int bitmapBitOrder; int numPixmapFormats; PixmapFormatRec formats[MAXFORMATS]; int arraySize; int numScreens; ScreenPtr screens[MAXSCREENS]; int numVideoScreens; } ScreenInfo; |
One of the main ScreenInfo fields is ScreenPtr (aka pScreen), a pointer to ScreenRec.
ScreenPtr is defined in screenint.h as:
typedef struct _Screen *ScreenPtr; |
ScreenRec is defined in scrnintstr.h as:
typedef struct _Screen { int myNum; /* index of this instance in Screens[] */ ATOM id; short width, height; short mmWidth, mmHeight; short numDepths; unsigned char rootDepth; DepthPtr allowedDepths; unsigned long rootVisual; unsigned long defColormap; short minInstalledCmaps, maxInstalledCmaps; char backingStoreSupport, saveUnderSupport; unsigned long whitePixel, blackPixel; unsigned long rgf; /* array of flags; she's -- HUNGARIAN */ GCPtr GCperDepth[MAXFORMATS+1]; /* next field is a stipple to use as default in a GC. we don't build default tiles of all depths because they are likely to be of a color different from the default fg pixel, so we don't win anything by building a standard one. */ PixmapPtr PixmapPerDepth[1]; pointer devPrivate; short numVisuals; VisualPtr visuals; int WindowPrivateLen; unsigned *WindowPrivateSizes; unsigned totalWindowSize; int GCPrivateLen; unsigned *GCPrivateSizes; unsigned totalGCSize; /* Random screen procedures */ CloseScreenProcPtr CloseScreen; QueryBestSizeProcPtr QueryBestSize; SaveScreenProcPtr SaveScreen; GetImageProcPtr GetImage; GetSpansProcPtr GetSpans; PointerNonInterestBoxProcPtr PointerNonInterestBox; SourceValidateProcPtr SourceValidate; /* Window Procedures */ CreateWindowProcPtr CreateWindow; DestroyWindowProcPtr DestroyWindow; PositionWindowProcPtr PositionWindow; ChangeWindowAttributesProcPtr ChangeWindowAttributes; RealizeWindowProcPtr RealizeWindow; UnrealizeWindowProcPtr UnrealizeWindow; ValidateTreeProcPtr ValidateTree; PostValidateTreeProcPtr PostValidateTree; WindowExposuresProcPtr WindowExposures; PaintWindowBackgroundProcPtr PaintWindowBackground; PaintWindowBorderProcPtr PaintWindowBorder; CopyWindowProcPtr CopyWindow; ClearToBackgroundProcPtr ClearToBackground; ClipNotifyProcPtr ClipNotify; RestackWindowProcPtr RestackWindow; /* Pixmap procedures */ CreatePixmapProcPtr CreatePixmap; DestroyPixmapProcPtr DestroyPixmap; /* Backing store procedures */ SaveDoomedAreasProcPtr SaveDoomedAreas; RestoreAreasProcPtr RestoreAreas; ExposeCopyProcPtr ExposeCopy; TranslateBackingStoreProcPtr TranslateBackingStore; ClearBackingStoreProcPtr ClearBackingStore; DrawGuaranteeProcPtr DrawGuarantee; /* * A read/write copy of the lower level backing store vector is needed now * that the functions can be wrapped. */ BSFuncRec BackingStoreFuncs; /* Font procedures */ RealizeFontProcPtr RealizeFont; UnrealizeFontProcPtr UnrealizeFont; /* Cursor Procedures */ ConstrainCursorProcPtr ConstrainCursor; CursorLimitsProcPtr CursorLimits; DisplayCursorProcPtr DisplayCursor; RealizeCursorProcPtr RealizeCursor; UnrealizeCursorProcPtr UnrealizeCursor; RecolorCursorProcPtr RecolorCursor; SetCursorPositionProcPtr SetCursorPosition; /* GC procedures */ CreateGCProcPtr CreateGC; /* Colormap procedures */ CreateColormapProcPtr CreateColormap; DestroyColormapProcPtr DestroyColormap; InstallColormapProcPtr InstallColormap; UninstallColormapProcPtr UninstallColormap; ListInstalledColormapsProcPtr ListInstalledColormaps; StoreColorsProcPtr StoreColors; ResolveColorProcPtr ResolveColor; /* Region procedures */ #ifdef NEED_SCREEN_REGIONS RegionCreateProcPtr RegionCreate; RegionInitProcPtr RegionInit; RegionCopyProcPtr RegionCopy; RegionDestroyProcPtr RegionDestroy; RegionUninitProcPtr RegionUninit; IntersectProcPtr Intersect; UnionProcPtr Union; SubtractProcPtr Subtract; InverseProcPtr Inverse; RegionResetProcPtr RegionReset; TranslateRegionProcPtr TranslateRegion; RectInProcPtr RectIn; PointInRegionProcPtr PointInRegion; RegionNotEmptyProcPtr RegionNotEmpty; RegionEqualProcPtr RegionEqual; RegionBrokenProcPtr RegionBroken; RegionBreakProcPtr RegionBreak; RegionEmptyProcPtr RegionEmpty; RegionExtentsProcPtr RegionExtents; RegionAppendProcPtr RegionAppend; RegionValidateProcPtr RegionValidate; #endif /* NEED_SCREEN_REGIONS */ BitmapToRegionProcPtr BitmapToRegion; #ifdef NEED_SCREEN_REGIONS RectsToRegionProcPtr RectsToRegion; #endif /* NEED_SCREEN_REGIONS */ SendGraphicsExposeProcPtr SendGraphicsExpose; /* os layer procedures */ ScreenBlockHandlerProcPtr BlockHandler; ScreenWakeupHandlerProcPtr WakeupHandler; pointer blockData; pointer wakeupData; /* anybody can get a piece of this array */ DevUnion *devPrivates; CreateScreenResourcesProcPtr CreateScreenResources; ModifyPixmapHeaderProcPtr ModifyPixmapHeader; GetWindowPixmapProcPtr GetWindowPixmap; SetWindowPixmapProcPtr SetWindowPixmap; GetScreenPixmapProcPtr GetScreenPixmap; SetScreenPixmapProcPtr SetScreenPixmap; PixmapPtr pScratchPixmap; /* scratch pixmap "pool" */ #ifdef PIXPRIV int PixmapPrivateLen; unsigned int *PixmapPrivateSizes; unsigned int totalPixmapSize; #endif MarkWindowProcPtr MarkWindow; MarkOverlappedWindowsProcPtr MarkOverlappedWindows; ChangeSaveUnderProcPtr ChangeSaveUnder; PostChangeSaveUnderProcPtr PostChangeSaveUnder; MoveWindowProcPtr MoveWindow; ResizeWindowProcPtr ResizeWindow; GetLayerWindowProcPtr GetLayerWindow; HandleExposuresProcPtr HandleExposures; ReparentWindowProcPtr ReparentWindow; #ifdef SHAPE SetShapeProcPtr SetShape; #endif /* SHAPE */ ChangeBorderWidthProcPtr ChangeBorderWidth; MarkUnrealizedWindowProcPtr MarkUnrealizedWindow; } ScreenRec; |
Section "ServerLayout" Identifier "Default Layout" Screen 0 "Default Screen" RightOf "Screen1" Screen "Screen1" 0 0 InputDevice "Generic Keyboard" InputDevice "Configured Mouse" EndSection Section "ServerFlags" Option "Xinerama" EndSection You can see my complete configuration bellow. Good luck, /Magnus # /etc/X11/xorg.conf (xorg X Window System server configuration file) # # This file was generated by dexconf, the Debian X Configuration tool, using # values from the debconf database. # # Edit this file with caution, and see the /etc/X11/xorg.conf manual page. # (Type "man /etc/X11/xorg.conf" at the shell prompt.) # # This file is automatically updated on xserver-xorg package upgrades *only* # if it has not been modified since the last upgrade of the xserver-xorg # package. # # If you have edited this file but would like it to be automatically updated # again, run the following command: # sudo dpkg-reconfigure -phigh xserver-xorg Section "Files"Section "ServerLayout" Identifier "Default Layout" Screen 0 "Default Screen" RightOf "Screen1" Screen "Screen1" 0 0 InputDevice "Generic Keyboard" InputDevice "Configured Mouse" EndSection Section "ServerFlags" Option "Xinerama" EndSection FontPath "/usr/share/X11/fonts/misc" FontPath "/usr/share/X11/fonts/cyrillic" FontPath "/usr/share/X11/fonts/100dpi/:unscaled" FontPath "/usr/share/X11/fonts/75dpi/:unscaled" FontPath "/usr/share/X11/fonts/Type1" FontPath "/usr/share/X11/fonts/CID" FontPath "/usr/share/X11/fonts/100dpi" FontPath "/usr/share/X11/fonts/75dpi" # paths to defoma fonts FontPath "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType" FontPath "/var/lib/defoma/x-ttcidfont-conf.d/dirs/CID" EndSection Section "Module" Load "GLcore" Load "i2c" Load "bitmap" Load "ddc" Load "dri" Load "extmod" Load "freetype" Load "glx" Load "int10" Load "type1" Load "vbe" EndSection Section "InputDevice" Identifier "Generic Keyboard" Driver "kbd" Option "CoreKeyboard" Option "XkbRules" "xorg" Option "XkbModel" "pc105" Option "XkbLayout" "se" EndSection Section "InputDevice" Identifier "Configured Mouse" Driver "mouse" Option "CorePointer" Option "Device" "/dev/input/mice" Option "Protocol" "ImPS/2" Option "Emulate3Buttons" "true" Option "ZAxisMapping" "4 5" EndSection Section "Device" Identifier "Matrox Graphics, Inc. MGA G400 AGP" Driver "mga" Option "AGPMode" "4" Option "hw cursor" "on" BusID "PCI:1:0:0" Screen 0 EndSection Section "Device" Identifier "Matrox Graphics, Inc. MGA G400 AGP second head" Driver "mga" Option "AGPMode" "4" Option "hw cursor" "on" BusID "PCI:1:0:0" Screen 1 EndSection Section "Monitor" Identifier "CM772" Option "DPMS" EndSection Section "Screen" Identifier "Default Screen" Device "Matrox Graphics, Inc. MGA G400 AGP" Monitor "CM772" DefaultDepth 24 SubSection "Display" Depth 1 Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480" EndSubSection SubSection "Display" Depth 4 Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480" EndSubSection SubSection "Display" Depth 8 Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480" EndSubSection SubSection "Display" Depth 15 Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480" EndSubSection SubSection "Display" Depth 16 Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480" EndSubSection SubSection "Display" Depth 24 Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480" EndSubSection EndSection Section "Monitor" Identifier "Proview" VendorName "Unknown" ModelName "Unknown" HorizSync 30.0 - 64.0 VertRefresh 50.0 - 100.0 Option "dpms" EndSection Section "Screen" Identifier "Screen1" Device "Matrox Graphics, Inc. MGA G400 AGP second head" Monitor "Proview" DefaultDepth 24 SubSection "Display" Depth 24 Modes "1024x768" EndSubSection EndSection Section "ServerLayout" Identifier "Default Layout" Screen 0 "Default Screen" RightOf "Screen1" Screen "Screen1" 0 0 InputDevice "Generic Keyboard" InputDevice "Configured Mouse" EndSection Section "ServerFlags" Option "Xinerama" EndSection Section "DRI" Mode 0666 EndSection |
The most important points are:
The first part of the parsing process is detailed explained in this page.
The second part og the parsing process is detailed explained in this page.
This is an OS specific routine. For instance for Linux it is implemented in lnx_init.c.
This is detailed explained in this page.
This is detailed explained in this page.
This is detailed explained in this page.
This is detailed explained in this page.