EXA driver doc cleanups and additions.
This commit is contained in:
		
							parent
							
								
									f41ec003f3
								
							
						
					
					
						commit
						6b08a5013b
					
				| 
						 | 
				
			
			@ -2,34 +2,33 @@ 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 hooks that they can implement to more efficiently accelerate the X
 | 
			
		||||
Render extension: solid fills, blits within screen memory and to and from
 | 
			
		||||
system memory, and Porter-Duff compositing and transform operations.
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
Globals
 | 
			
		||||
-------
 | 
			
		||||
Configuration
 | 
			
		||||
-------------
 | 
			
		||||
A new config file option, AccelMethod, should be added to your driver, to allow
 | 
			
		||||
the user to select between the EXA and XAA acceleration APIs.
 | 
			
		||||
 | 
			
		||||
Some drivers implement a per-instance useEXA flag to track whether EXA is
 | 
			
		||||
active or not.  It can be helpful to also conditionalize XAA support with an
 | 
			
		||||
ifdef so that it can easily be turned off/removed in the future.
 | 
			
		||||
 | 
			
		||||
Setting the flag and checking for AccelMethod can be done in the driver's
 | 
			
		||||
Options parsing routine.
 | 
			
		||||
 | 
			
		||||
Global symbols
 | 
			
		||||
--------------
 | 
			
		||||
XF86EXA will be defined to a nonzero value if your X server codebase supports
 | 
			
		||||
the EXA API.  Use it to conditionalize your new EXA code if your driver is
 | 
			
		||||
shared with a non-EXA codebases.  If present, necessary functions, structures
 | 
			
		||||
and defines will be located in "exa.h".
 | 
			
		||||
 | 
			
		||||
AccelMethod
 | 
			
		||||
-----------
 | 
			
		||||
A new config file option, AccelMethod, should be used in your driver to select
 | 
			
		||||
between the EXA and XAA acceleration APIs.  The default should be XAA for
 | 
			
		||||
6.9/7.0 drivers.
 | 
			
		||||
 | 
			
		||||
Some drivers implement a per-instance useEXA flag to track whether EXA is
 | 
			
		||||
active or not.  It can be helpful to also conditionalize XAA support so that
 | 
			
		||||
it can easily be turned off/removed in the future.  Setting the flag and
 | 
			
		||||
checking for AccelMethod can be done in the driver's Options routine (a
 | 
			
		||||
friendly printf is be a nice way of letting the user know which method is in
 | 
			
		||||
use).
 | 
			
		||||
 | 
			
		||||
Core EXA functions
 | 
			
		||||
------------------
 | 
			
		||||
The following functions are provided, for use by your driver, to do
 | 
			
		||||
allocation, initialization, version checking, etc.
 | 
			
		||||
EXA library functions
 | 
			
		||||
---------------------
 | 
			
		||||
Use the following functions to initialize your driver's EXA hooks, check the
 | 
			
		||||
version, allocate memory, etc.
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * exaGetVersion - retrieve EXA version number from server
 | 
			
		||||
| 
						 | 
				
			
			@ -42,13 +41,13 @@ allocation, initialization, version checking, etc.
 | 
			
		|||
  /**
 | 
			
		||||
   * exaDriverInit - tell EXA about a new EXA driver
 | 
			
		||||
   * @pScreen - current screen
 | 
			
		||||
   * @pScreenInfo - driver structure
 | 
			
		||||
   * @driverPtr - driver structure
 | 
			
		||||
   *
 | 
			
		||||
   * Tell EXA about the driver described by @pScreenInfo.
 | 
			
		||||
   *
 | 
			
		||||
   * Returns TRUE for success, FALSE for failure.
 | 
			
		||||
   */
 | 
			
		||||
  Bool exaDriverInit(ScreenPtr pScreen, ExaDriverPtr pScreenInfo)
 | 
			
		||||
  Bool exaDriverInit(ScreenPtr pScreen, ExaDriverPtr driverPtr)
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * exaDriverFini - teardown an EXA driver
 | 
			
		||||
| 
						 | 
				
			
			@ -58,7 +57,6 @@ allocation, initialization, version checking, etc.
 | 
			
		|||
   */
 | 
			
		||||
  void exaDriverFini(ScreenPtr pScreen)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * exaOffscreenAlloc - allocate offscreen memory
 | 
			
		||||
   * @pScreen: current screen
 | 
			
		||||
| 
						 | 
				
			
			@ -118,11 +116,6 @@ allocation, initialization, version checking, etc.
 | 
			
		|||
   *   %EXA_OFFSCREEN_PIXMAPS - offscreen pixmaps are supported
 | 
			
		||||
   *   %EXA_OFFSCREEN_ALIGN_POT - offscreen objects must hve a power of two
 | 
			
		||||
   *     alignment of their pitch
 | 
			
		||||
   *
 | 
			
		||||
   * This routine is just a macro, and so it can't fail (unless it causes a
 | 
			
		||||
   * compile failure).
 | 
			
		||||
   *
 | 
			
		||||
   * [This macro appears broken in the current tree, s/Sync/needsSync/.]
 | 
			
		||||
   */
 | 
			
		||||
  void exaInitCard(EXADriverPtr *exa, Bool sync, CARD8 *memory_base,
 | 
			
		||||
		   unsigned longoff_screen_base, unsigned long memory_size,
 | 
			
		||||
| 
						 | 
				
			
			@ -156,9 +149,6 @@ allocation, initialization, version checking, etc.
 | 
			
		|||
   */
 | 
			
		||||
  Bool exaOffscreenInit(ScreenPtr pScreen)
 | 
			
		||||
 | 
			
		||||
Some helper functions are also available to make common EXA related functions
 | 
			
		||||
easier.
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * exaGetPixmapPitch - return the pitch for a pixmap
 | 
			
		||||
   * @p: pixmap
 | 
			
		||||
| 
						 | 
				
			
			@ -176,16 +166,21 @@ easier.
 | 
			
		|||
   */
 | 
			
		||||
  unsigned int exaGetPixmapOffset(PixmapPtr p)
 | 
			
		||||
 | 
			
		||||
Driver EXA routines
 | 
			
		||||
-------------------
 | 
			
		||||
EXA driver hooks
 | 
			
		||||
----------------
 | 
			
		||||
EXA requires the addition of new routines to your driver's acceleration
 | 
			
		||||
implementation.  The following structure defines the EXA acceleration API,
 | 
			
		||||
some are required to be implemented in your driver, others are optional.
 | 
			
		||||
some hooks are required to be implemented in your driver, others are optional.
 | 
			
		||||
 | 
			
		||||
Each of these routines has an associated function pointer in the ExaAccelInfo
 | 
			
		||||
structure.  At a minimum, your driver must allocate an ExaDriverRec struture,
 | 
			
		||||
fill out the ExaCardInfoRec member structure, and define the miminum required
 | 
			
		||||
functions (described below) and hook them into the ExaAccelInfo member
 | 
			
		||||
structure.
 | 
			
		||||
 | 
			
		||||
Note that for routines that take a source and destination pixmap, the pitches
 | 
			
		||||
may be different.
 | 
			
		||||
 | 
			
		||||
  typedef struct _ExaAccelInfo {
 | 
			
		||||
  /**
 | 
			
		||||
   * PrepareSolid - setup for solid fill
 | 
			
		||||
   * @pPixmap: Pixmap destination
 | 
			
		||||
| 
						 | 
				
			
			@ -340,7 +335,7 @@ may be different.
 | 
			
		|||
   * can't accelerate the operation (e.g. if the pixmaps are incompatible with
 | 
			
		||||
   * acceleration).
 | 
			
		||||
   *
 | 
			
		||||
   * Optional.
 | 
			
		||||
   * Optional but recommended.
 | 
			
		||||
   */
 | 
			
		||||
  Bool (*PrepareComposite)(int op, PicturePtr pSrcPicture,
 | 
			
		||||
                           PicturePtr pMaskPicture, PicturePtr pDstPicture,
 | 
			
		||||
| 
						 | 
				
			
			@ -362,7 +357,7 @@ may be different.
 | 
			
		|||
   *
 | 
			
		||||
   * Must not fail.
 | 
			
		||||
   *
 | 
			
		||||
   * Optional.
 | 
			
		||||
   * Optional but recommended.
 | 
			
		||||
   */
 | 
			
		||||
  void (*Composite)(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY,
 | 
			
		||||
                    int dstX, int dstY, int width, int height);
 | 
			
		||||
| 
						 | 
				
			
			@ -465,10 +460,6 @@ may be different.
 | 
			
		|||
   * Required.
 | 
			
		||||
   */
 | 
			
		||||
  void (*WaitMarker)(ScreenPtr pScreen, int marker);
 | 
			
		||||
  } ExaAccelInfoRec, *ExaAccelInfoPtr;
 | 
			
		||||
 | 
			
		||||
This is an extra, optional routine, used as a callback to the offscreen
 | 
			
		||||
allocation function.
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ScratchSave - save the scratch area, or just throw it away
 | 
			
		||||
| 
						 | 
				
			
			@ -490,24 +481,16 @@ allocation function.
 | 
			
		|||
   */
 | 
			
		||||
  void ScratchSave(ScreenPtr pScreen, ExaOffscreenArea *area);
 | 
			
		||||
 | 
			
		||||
EXA driver fields
 | 
			
		||||
-----------------
 | 
			
		||||
Each driver record structure also needs a few additional fields if EXA
 | 
			
		||||
support is to be used, e.g.:
 | 
			
		||||
 | 
			
		||||
  #if XF86EXA
 | 
			
		||||
  /* Container structure, describes card and accel. hooks */
 | 
			
		||||
  ExaDriverPtr EXADriverPtr;
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
EXA initialization
 | 
			
		||||
------------------
 | 
			
		||||
Your driver's AccelInit routine has to initialize the EXADriverPtr if EXA
 | 
			
		||||
support is enabled, with appropriate error handling (i.e.  NoAccel and
 | 
			
		||||
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).
 | 
			
		||||
 | 
			
		||||
A few, card specific fields need to be initialized:
 | 
			
		||||
A few, card specific fields need to be initialized (assuming your driver uses
 | 
			
		||||
a variable named EXADriverPtr pointing to where your ExaDriverRec is
 | 
			
		||||
allocated):
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * EXA uses memoryBase to access the framebuffer, while memorySize and
 | 
			
		||||
| 
						 | 
				
			
			@ -519,12 +502,13 @@ A few, card specific fields need to be initialized:
 | 
			
		|||
  EXADriverPtr->card.memorySize = ? /* end of offscreen memory */
 | 
			
		||||
  /* offset of offscreen memory relative to memoryBase */
 | 
			
		||||
  EXADriverPtr->card.offScreenBase = ?
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * If your offscreen memory is just after your framebuffer, which is at the
 | 
			
		||||
   * start of memory, it may be something like:
 | 
			
		||||
   *   pScrn->virtualX * pScrn->virtualY * ((pScrn->bitsPerPixel * + 7) / 8)
 | 
			
		||||
   * should use the X value from the adjusted width based on virtualX, after
 | 
			
		||||
   * accounting for the accelerator's pitch alignment constraints
 | 
			
		||||
   * start of memory, offScreenBase may be something like:
 | 
			
		||||
   *   pScrn->virtualX * pScrn->virtualY * ((pScrn->bitsPerPixel + 7) / 8)
 | 
			
		||||
   * (the + 7 / 8 causes the integer division to round up instead of
 | 
			
		||||
   * round down).
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
| 
						 | 
				
			
			@ -532,13 +516,12 @@ A few, card specific fields need to be initialized:
 | 
			
		|||
   * them.  Not applied to all pixmaps--the visible screen is an exception,
 | 
			
		||||
   * and thus Prepare* acceleration hooks should test for these and fail
 | 
			
		||||
   * appropriately.  pixmapOffsetAlign is the value that the pixmap's offset
 | 
			
		||||
   * from the beginning of the framebuffer must be aligned to.  pixmapPitchAlign
 | 
			
		||||
   * is the value that the pitch of a pixmap must be aligned to (along with
 | 
			
		||||
   * ALIGN_POT).
 | 
			
		||||
   * from the beginning of the framebuffer must be aligned to.
 | 
			
		||||
   * pixmapPitchAlign is the value that the pitch of a pixmap must be aligned
 | 
			
		||||
   * to (along with ALIGN_POT).
 | 
			
		||||
   */
 | 
			
		||||
  EXADriverPtr->card.pixmapOffsetAlign = ?
 | 
			
		||||
  /* also called stride */
 | 
			
		||||
  EXADriverPtr->card.pixmapPitchAlign = ?
 | 
			
		||||
  EXADriverPtr->card.pixmapPitchAlign = ? /* also called stride */
 | 
			
		||||
 | 
			
		||||
  /* Max screen size supported by the card? */
 | 
			
		||||
  EXADriverPtr->card.maxX = ?
 | 
			
		||||
| 
						 | 
				
			
			@ -575,12 +558,11 @@ out (don't forget to check for errors as that routine can fail).
 | 
			
		|||
If your driver doesn't support UploadToScreen, you should allocate some
 | 
			
		||||
scratch space for use by commonly used pixmaps (e.g. glyphs).  Note that it's
 | 
			
		||||
much better to implement UploadToScreen than to allocate scratch space, but if
 | 
			
		||||
necessary allocate about as much as you'd need for a line of text.
 | 
			
		||||
necessary allocate about as much as you'd need for a line of text.  E.g.
 | 
			
		||||
 | 
			
		||||
  pDrv->exa_scratch = exaOffscreenAlloc(pScreen, 128 * 1024, 16, TRUE,
 | 
			
		||||
					ScratchSave, pDrv);
 | 
			
		||||
 | 
			
		||||
  /* Why is this required?  Shouldn't exaOffscreenAlloc take care of it? */
 | 
			
		||||
  if(pDrv->exa_scratch) {
 | 
			
		||||
    pDrv->exa_scratch_next = pDrv->exa_scratch->offset;
 | 
			
		||||
    pDrv->EXADriverPtr->accel.UploadToScratch = UploadToScratch;
 | 
			
		||||
| 
						 | 
				
			
			@ -601,7 +583,7 @@ call at setup time.
 | 
			
		|||
 | 
			
		||||
EXA teardown
 | 
			
		||||
------------
 | 
			
		||||
At screen close time, EXA drivers should, call exaDriverFini with their screen
 | 
			
		||||
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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue