90 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| Adding EXA support to your X.Org video driver
 | |
| ---------------------------------------------
 | |
| EXA (for EXcellent Architecture or Ex-kaa aXeleration Architecture or
 | |
| whatever) aims to extend the life of the venerable XFree86 video drivers by
 | |
| introducing a new set of acceleration hooks that efficiently accelerate the X
 | |
| Render extension, including solid fills, blits within screen memory and to and
 | |
| from system memory, and Porter-Duff compositing and transform operations.
 | |
| 
 | |
| Configuration
 | |
| -------------
 | |
| Some drivers implement a per-instance useEXA flag to track whether EXA is
 | |
| active or not.
 | |
| 
 | |
| Setting the flag can be done in the driver's Options parsing routine.
 | |
| 
 | |
| Loading EXA
 | |
| ------------
 | |
| EXA drivers in the XFree86 DDX should use the loadable module loader to load
 | |
| the EXA core.  Careful versioning allows the EXA API to be extended without
 | |
| breaking the ABI for older versions of drivers.  Example code for loading EXA:
 | |
| 
 | |
| static const char *exaSymbols[] = {
 | |
|     "exaDriverAlloc",
 | |
|     "exaDriverInit",
 | |
|     "exaDriverFini",
 | |
|     "exaOffscreenAlloc",
 | |
|     "exaOffscreenFree",
 | |
|     "exaGetPixmapOffset",
 | |
|     "exaGetPixmapPitch",
 | |
|     "exaGetPixmapSize",
 | |
|     "exaMarkSync",
 | |
|     "exaWaitSync",
 | |
|     NULL
 | |
| };
 | |
| 
 | |
| 	if (info->useEXA) {
 | |
| 	    info->exaReq.majorversion = 2;
 | |
| 	    info->exaReq.minorversion = 0;
 | |
| 
 | |
| 	    if (!LoadSubModule(pScrn->module, "exa", NULL, NULL, NULL,
 | |
| 			       &info->exaReq, &errmaj, &errmin)) {
 | |
| 		LoaderErrorMsg(NULL, "exa", errmaj, errmin);
 | |
| 		return FALSE;
 | |
| 	    }
 | |
| 	    xf86LoaderReqSymLists(exaSymbols, NULL);
 | |
| 	}
 | |
| 
 | |
| EXA is then initialized using exaDriverAlloc and exaDriverInit.  See doxygen
 | |
| documentation for getting started there.
 | |
| 
 | |
| Further documentation
 | |
| ------------
 | |
| The EXA driver interface and public API is documented using doxygen in
 | |
| xserver/xorg/exa/.  To build the documentation, run:
 | |
|   doxygen -g
 | |
|   doxygen Doxyfile
 | |
| The resulting documentation will appear an html/index.html under the current
 | |
| directory.
 | |
| 
 | |
| EXA initialization
 | |
| ------------------
 | |
| Your driver's AccelInit routine must initialize an ExaDriverRec structure if
 | |
| EXA support is enabled, with appropriate error handling (i.e.  NoAccel and
 | |
| NoXvideo should be set to true if EXA fails to initialize for whatever
 | |
| reason).
 | |
| 
 | |
| The AccelInit routine also needs to make sure that there's enough offscreen
 | |
| memory for certain operations to function, like Xvideo, which should advertise
 | |
| a maximum size no larger than can be dealt with given the amount of offscreen
 | |
| memory available.
 | |
| 
 | |
| EXA and Xv
 | |
| ----------
 | |
| Video support becomes easier with EXA since AllocateFBMemory can use
 | |
| exaOffscreenAlloc directly, freeing a previous area if necessary and
 | |
| allocating a new one.  Likewise, FreeFBMemory can call exaOffscreenFree.
 | |
| 
 | |
| EXA teardown
 | |
| ------------
 | |
| At screen close time, EXA drivers should call exaDriverFini with their screen
 | |
| pointer, free their EXADriver structure, and do any other necessary teardown.
 | |
| 
 | |
| EXA misc.
 | |
| ---------
 | |
| In many drivers, DGA support will need to be changed to be aware of the new
 | |
| EXA support.
 | |
| 
 | |
| Send updates and corrections to Jesse Barnes <jbarnes@virtuousgeek.org> or
 | |
| just check them in if you have permission.
 |